Rev 27 | Rev 30 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | daniel-mar | 1 | unit LevMain; |
2 | |||
3 | interface |
||
4 | |||
5 | uses |
||
6 | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, |
||
7 | Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws, |
||
6 | daniel-mar | 8 | DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes, |
24 | daniel-mar | 9 | WinAPI.DirectDraw{$ENDIF}, DirectX, ComLevelReader; |
1 | daniel-mar | 10 | |
11 | type |
||
12 | TMainForm = class(TDXForm) |
||
13 | MainMenu: TMainMenu; |
||
14 | Spiel: TMenuItem; |
||
15 | Beenden: TMenuItem; |
||
16 | Hilfe: TMenuItem; |
||
17 | Leer1: TMenuItem; |
||
18 | Level: TMenuItem; |
||
19 | Informationen: TMenuItem; |
||
20 | Enemy1: TRadioButton; |
||
21 | Enemy2: TRadioButton; |
||
22 | Enemy3: TRadioButton; |
||
23 | Enemy4: TRadioButton; |
||
24 | Enemy5: TRadioButton; |
||
25 | Enemy6: TRadioButton; |
||
26 | Enemy7: TRadioButton; |
||
27 | ScrollBar: TScrollBar; |
||
28 | Bevel1: TBevel; |
||
29 | Bevel2: TBevel; |
||
30 | SelLabel: TLabel; |
||
31 | SelPanel: TPanel; |
||
32 | Bevel3: TBevel; |
||
33 | SLabel1a: TLabel; |
||
34 | SLabel2a: TLabel; |
||
35 | SLabel1b: TLabel; |
||
36 | SLabel2b: TLabel; |
||
37 | SLabel0: TLabel; |
||
38 | Neu: TMenuItem; |
||
39 | Image1: TImage; |
||
40 | SLabel3a: TLabel; |
||
41 | SLabel3b: TLabel; |
||
42 | SLabel4a: TLabel; |
||
43 | SLabel4b: TLabel; |
||
44 | LivesLabel: TLabel; |
||
45 | StatusBar: TStatusBar; |
||
46 | N1: TMenuItem; |
||
47 | Spielfelderweitern1: TMenuItem; |
||
24 | daniel-mar | 48 | SidePanel: TPanel; |
49 | LivesEdit: TSpinEdit; |
||
1 | daniel-mar | 50 | procedure DXDrawFinalize(Sender: TObject); |
51 | procedure DXDrawInitialize(Sender: TObject); |
||
52 | procedure FormCreate(Sender: TObject); |
||
53 | procedure DXTimerTimer(Sender: TObject; LagCount: Integer); |
||
54 | procedure BeendenClick(Sender: TObject); |
||
55 | procedure FormDestroy(Sender: TObject); |
||
56 | procedure LevelClick(Sender: TObject); |
||
57 | procedure FormShow(Sender: TObject); |
||
58 | procedure InformationenClick(Sender: TObject); |
||
59 | procedure FormClose(Sender: TObject; var Action: TCloseAction); |
||
60 | procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton; |
||
61 | Shift: TShiftState; X, Y: Integer); |
||
62 | procedure EnemyClick(Sender: TObject); |
||
63 | procedure NeuClick(Sender: TObject); |
||
64 | procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, |
||
65 | Y: Integer); |
||
66 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
||
67 | procedure Spielfelderweitern1Click(Sender: TObject); |
||
68 | procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode; |
||
69 | var ScrollPos: Integer); |
||
70 | public |
||
71 | { VCL-Ersatz } |
||
72 | spriteengine: tdxspriteengine; |
||
73 | dxtimer: tdxtimer; |
||
74 | imagelist: tdximagelist; |
||
75 | dxdraw: tdxdraw; |
||
76 | { Variablen } |
||
77 | FMenuItem: integer; |
||
27 | daniel-mar | 78 | LevData: TLevelData; |
1 | daniel-mar | 79 | ScrollP: integer; |
80 | AltScrollPos: integer; |
||
81 | Boss: boolean; |
||
82 | LevChanged: boolean; |
||
83 | NumEnemys: integer; |
||
24 | daniel-mar | 84 | function SelectedEnemyType: TEnemyType; |
1 | daniel-mar | 85 | { Level-Routinen } |
27 | daniel-mar | 86 | procedure EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
1 | daniel-mar | 87 | procedure DestroyLevel; |
88 | procedure AnzeigeAct; |
||
89 | { Initialisiations-Routinen } |
||
90 | procedure DXInit; |
||
91 | procedure ProgramInit; |
||
92 | { Farb-Routinen } |
||
93 | function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad; |
||
94 | procedure PalleteAnim(Col: TRGBQuad; Time: Integer); |
||
95 | end; |
||
96 | |||
97 | var |
||
98 | MainForm: TMainForm; |
||
99 | |||
100 | implementation |
||
101 | |||
102 | uses |
||
27 | daniel-mar | 103 | Global, LevSplash, LevSpeicherung, ComInfo, LevOptions; |
1 | daniel-mar | 104 | |
105 | const |
||
106 | RasterW = 48; |
||
107 | RasterH = 32; |
||
108 | |||
109 | {$R *.DFM} |
||
110 | |||
111 | type |
||
112 | TBackground = class(TBackgroundSprite) |
||
24 | daniel-mar | 113 | strict protected |
1 | daniel-mar | 114 | procedure DoMove(MoveCount: Integer); override; |
115 | end; |
||
116 | |||
117 | TEnemy = class(TImageSprite) |
||
24 | daniel-mar | 118 | strict private |
119 | FLives: integer; |
||
120 | FEnemyType: TEnemyType; |
||
121 | FXCor: integer; |
||
122 | FCorInit: boolean; |
||
123 | strict protected |
||
1 | daniel-mar | 124 | procedure DoMove(MoveCount: Integer); override; |
125 | public |
||
24 | daniel-mar | 126 | constructor Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); reintroduce; |
1 | daniel-mar | 127 | end; |
128 | |||
24 | daniel-mar | 129 | { TBackground } |
130 | |||
131 | procedure TBackground.DoMove(MoveCount: Integer); |
||
1 | daniel-mar | 132 | begin |
24 | daniel-mar | 133 | X := -(MainForm.ScrollP * RasterW); |
1 | daniel-mar | 134 | end; |
135 | |||
24 | daniel-mar | 136 | { TEnemy } |
137 | |||
1 | daniel-mar | 138 | procedure TEnemy.DoMove(MoveCount: Integer); |
139 | begin |
||
24 | daniel-mar | 140 | if not FCorInit then |
1 | daniel-mar | 141 | begin |
24 | daniel-mar | 142 | FXCor := trunc(x) + (MainForm.ScrollP * RasterW); |
143 | FCorInit := true; |
||
1 | daniel-mar | 144 | end; |
27 | daniel-mar | 145 | if MainForm.LevData.IndexOfEnemy(FXCor, integer(round(Y)), FEnemyType, FLives) = -1 then dead; |
24 | daniel-mar | 146 | X := FXCor - (MainForm.ScrollP * RasterW); |
1 | daniel-mar | 147 | end; |
148 | |||
24 | daniel-mar | 149 | constructor TEnemy.Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); |
1 | daniel-mar | 150 | begin |
24 | daniel-mar | 151 | inherited Create(AParent); |
152 | if AEnemyType = etEnemyAttacker then Image := MainForm.ImageList.Items.Find('Enemy-Attacker'); |
||
153 | if AEnemyType = etEnemyAttacker2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2'); |
||
154 | if AEnemyType = etEnemyAttacker3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3'); |
||
155 | if AEnemyType = etEnemyMeteor then Image := MainForm.ImageList.Items.Find('Enemy-Meteor'); |
||
156 | if AEnemyType = etEnemyUFO then Image := MainForm.ImageList.Items.Find('Enemy-Disk'); |
||
157 | if AEnemyType = etEnemyUFO2 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2'); |
||
158 | if AEnemyType = etEnemyBoss then Image := MainForm.ImageList.Items.Find('Enemy-Boss'); |
||
1 | daniel-mar | 159 | |
24 | daniel-mar | 160 | if AEnemyType = etEnemyMeteor then FLives := 0 else FLives := ALives; |
161 | FEnemyType := AEnemyType; |
||
1 | daniel-mar | 162 | Width := Image.Width; |
163 | Height := Image.Height; |
||
164 | PixelCheck := True; |
||
165 | end; |
||
166 | |||
24 | daniel-mar | 167 | { TMainForm } |
168 | |||
169 | procedure TMainForm.DXInit; |
||
170 | begin |
||
171 | Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg'); |
||
172 | ImageList.Items.MakeColorTable; |
||
173 | DXDraw.ColorTable := ImageList.Items.ColorTable; |
||
174 | DXDraw.DefColorTable := ImageList.Items.ColorTable; |
||
175 | DXDraw.UpdatePalette; |
||
176 | DXDraw.Initialize; |
||
177 | end; |
||
178 | |||
1 | daniel-mar | 179 | procedure TMainForm.FormCreate(Sender: TObject); |
24 | daniel-mar | 180 | resourcestring |
181 | SFileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!'; |
||
1 | daniel-mar | 182 | var |
14 | daniel-mar | 183 | LevelData: TLevelData; |
1 | daniel-mar | 184 | begin |
185 | { VCL-Ersatz start } |
||
186 | dxtimer := tdxtimer.create(self); |
||
187 | dxtimer.Interval := 100; |
||
188 | dxtimer.ActiveOnly := false; |
||
189 | dxtimer.Enabled := false; |
||
190 | dxtimer.OnTimer := DxTimerTimer; |
||
191 | |||
192 | dxdraw := tdxdraw.Create(self); |
||
193 | dxdraw.Parent := self; |
||
194 | dxdraw.Left := 0; |
||
195 | dxdraw.Top := 0; |
||
24 | daniel-mar | 196 | dxdraw.Width := SidePanel.Left; |
197 | dxdraw.Height := ScrollBar.Top; |
||
1 | daniel-mar | 198 | dxdraw.AutoInitialize := False; |
199 | dxdraw.AutoSize := False; |
||
200 | dxdraw.Color := clBlack; |
||
24 | daniel-mar | 201 | (* |
1 | daniel-mar | 202 | dxdraw.Display.BitCount := 24; |
203 | dxdraw.Display.FixedBitCount := False; |
||
204 | dxdraw.Display.FixedRatio := False; |
||
205 | dxdraw.Display.FixedSize := False; |
||
206 | dxdraw.Display.Height := 600; |
||
207 | dxdraw.Display.Width := 800; |
||
24 | daniel-mar | 208 | *) |
4 | daniel-mar | 209 | dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver]; |
1 | daniel-mar | 210 | dxdraw.OnFinalize := DXDrawFinalize; |
211 | dxdraw.OnInitialize := DXDrawInitialize; |
||
212 | dxdraw.ParentShowHint := False; |
||
213 | dxdraw.ShowHint := False; |
||
214 | dxdraw.TabOrder := 0; |
||
215 | dxdraw.OnMouseDown := DXDrawMouseDown; |
||
216 | dxdraw.OnMouseMove := DXDrawMouseMove; |
||
217 | |||
218 | spriteengine := tdxspriteengine.create(self); |
||
219 | spriteengine.DXDraw := dxdraw; |
||
220 | |||
221 | imagelist := tdximagelist.create(self); |
||
222 | imagelist.DXDraw := dxdraw; |
||
223 | |||
224 | { VCL-Ersatz ende } |
||
225 | |||
24 | daniel-mar | 226 | Enemy1.Checked := true; |
227 | EnemyClick(Enemy1); |
||
1 | daniel-mar | 228 | // Leeres Level am Anfang braucht keine Beenden-Bestätigung. |
229 | // LevChanged := true; |
||
2 | daniel-mar | 230 | |
231 | //Application.Title := 'SpaceMission '+ProgramVersion+' - Leveleditor'; |
||
232 | Caption := 'SpaceMission '+ProgramVersion+' - Leveleditor'; |
||
1 | daniel-mar | 233 | DXInit; |
234 | if (paramcount > 0) and (fileexists(paramstr(1))) then |
||
235 | begin |
||
14 | daniel-mar | 236 | LevelData := TLevelData.Create; |
237 | try |
||
238 | try |
||
239 | LevelData.Load(paramstr(1)); |
||
240 | except |
||
24 | daniel-mar | 241 | showmessage(SFileError); |
14 | daniel-mar | 242 | ProgramInit; |
243 | exit; |
||
244 | end; |
||
245 | finally |
||
246 | FreeAndNil(LevelData); |
||
1 | daniel-mar | 247 | end; |
248 | { Laden } |
||
249 | exit; |
||
250 | end; |
||
251 | ProgramInit; |
||
252 | end; |
||
253 | |||
254 | procedure TMainForm.FormDestroy(Sender: TObject); |
||
255 | begin |
||
27 | daniel-mar | 256 | LevData.Free; |
1 | daniel-mar | 257 | //spriteengine.Free; |
258 | dxtimer.Free; |
||
259 | imagelist.Free; |
||
260 | dxdraw.free; |
||
261 | end; |
||
262 | |||
263 | procedure TMainForm.BeendenClick(Sender: TObject); |
||
264 | begin |
||
265 | close; |
||
266 | end; |
||
267 | |||
268 | procedure TMainForm.DXDrawInitialize(Sender: TObject); |
||
269 | begin |
||
270 | DXTimer.Enabled := True; |
||
271 | end; |
||
272 | |||
273 | procedure TMainForm.DXDrawFinalize(Sender: TObject); |
||
274 | begin |
||
275 | DXTimer.Enabled := False; |
||
276 | end; |
||
277 | |||
278 | procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer); |
||
279 | begin |
||
280 | if not DXDraw.CanDraw then exit; |
||
281 | LagCount := 1000 div 60; |
||
282 | SpriteEngine.Move(LagCount); |
||
283 | SpriteEngine.Dead; |
||
284 | DxDraw.Surface.Fill(0); |
||
285 | SpriteEngine.Draw; |
||
286 | DXDraw.Flip; |
||
287 | end; |
||
288 | |||
289 | function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad; |
||
290 | begin |
||
291 | with Result do |
||
292 | begin |
||
293 | rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256); |
||
294 | rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256); |
||
295 | rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256); |
||
296 | rgbReserved := 0; |
||
297 | end; |
||
298 | end; |
||
299 | |||
300 | procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer); |
||
301 | var |
||
302 | i: Integer; |
||
303 | t, t2: DWORD; |
||
304 | ChangePalette: Boolean; |
||
305 | c: Integer; |
||
306 | begin |
||
307 | if DXDraw.Initialized then |
||
308 | begin |
||
309 | c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue)); |
||
310 | ChangePalette := False; |
||
311 | if DXDraw.CanPaletteAnimation then |
||
312 | begin |
||
313 | t := GetTickCount; |
||
314 | while Abs(GetTickCount-t)<Time do |
||
315 | begin |
||
316 | t2 := Trunc(Abs(GetTickCount-t)/Time*255); |
||
317 | for i := 0 to 255 do |
||
318 | DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2); |
||
319 | DXDraw.UpdatePalette; |
||
320 | ChangePalette := True; |
||
321 | end; |
||
322 | end else |
||
323 | Sleep(Time); |
||
324 | for i := 0 to 4 do |
||
325 | begin |
||
326 | DXDraw.Surface.Fill(c); |
||
327 | DXDraw.Flip; |
||
328 | end; |
||
329 | if ChangePalette then |
||
330 | begin |
||
331 | DXDraw.ColorTable := DXDraw.DefColorTable; |
||
332 | DXDraw.UpdatePalette; |
||
333 | end; |
||
334 | DXDraw.Surface.Fill(c); |
||
335 | DXDraw.Flip; |
||
336 | end; |
||
337 | end; |
||
338 | |||
339 | procedure TMainForm.ProgramInit; |
||
340 | {var |
||
341 | i, j: Integer;} |
||
342 | begin |
||
27 | daniel-mar | 343 | LevData := TLevelData.create; |
1 | daniel-mar | 344 | sleep(500); |
345 | //PlayerSprite |
||
346 | with TBackground.Create(SpriteEngine.Engine) do |
||
347 | begin |
||
348 | SetMapSize(1, 1); |
||
349 | Image := mainform.ImageList.Items.Find('Star3'); |
||
350 | Z := -13; |
||
351 | Y := 40; |
||
352 | Tile := True; |
||
353 | end; |
||
354 | with TBackground.Create(SpriteEngine.Engine) do |
||
355 | begin |
||
356 | SetMapSize(1, 1); |
||
357 | Image := mainform.ImageList.Items.Find('Star2'); |
||
358 | Z := -12; |
||
359 | Y := 30; |
||
360 | Tile := True; |
||
361 | end; |
||
362 | with TBackground.Create(SpriteEngine.Engine) do |
||
363 | begin |
||
364 | SetMapSize(1, 1); |
||
365 | Image := mainform.ImageList.Items.Find('Star1'); |
||
366 | Z := -11; |
||
367 | Y := 10; |
||
368 | Tile := True; |
||
369 | end; |
||
370 | with TBackground.Create(SpriteEngine.Engine) do |
||
371 | begin |
||
372 | SetMapSize(1, 1); |
||
373 | Image := mainform.ImageList.Items.Find('Matrix'); |
||
374 | Z := -10; |
||
375 | Tile := True; |
||
376 | end; |
||
377 | {with TBackground.Create(SpriteEngine.Engine) do |
||
378 | begin |
||
379 | SetMapSize(200, 10); |
||
380 | Y := 10; |
||
381 | Z := -13; |
||
382 | FSpeed := 1 / 2; |
||
383 | Tile := True; |
||
384 | for i := 0 to MapHeight-1 do |
||
385 | begin |
||
386 | for j := 0 to MapWidth-1 do |
||
387 | begin |
||
388 | Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8); |
||
389 | if Random(100)<95 then Chips[j, i] := -1; |
||
390 | end; |
||
391 | end; |
||
392 | end; |
||
393 | with TBackground.Create(SpriteEngine.Engine) do |
||
394 | begin |
||
395 | SetMapSize(200, 10); |
||
396 | Y := 30; |
||
397 | Z := -12; |
||
398 | FSpeed := 1; |
||
399 | Tile := True; |
||
400 | for i := 0 to MapHeight-1 do |
||
401 | begin |
||
402 | for j := 0 to MapWidth-1 do |
||
403 | begin |
||
404 | Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4); |
||
405 | if Random(100)<95 then Chips[j, i] := -1; |
||
406 | end; |
||
407 | end; |
||
408 | end; |
||
409 | with TBackground.Create(SpriteEngine.Engine) do |
||
410 | begin |
||
411 | SetMapSize(200, 10); |
||
412 | Y := 40; |
||
413 | Z := -11; |
||
414 | FSpeed := 2; |
||
415 | Tile := True; |
||
416 | for i := 0 to MapHeight-1 do |
||
417 | begin |
||
418 | for j := 0 to MapWidth-1 do |
||
419 | begin |
||
420 | Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2); |
||
421 | if Random(100)<95 then Chips[j, i] := -1; |
||
422 | end; |
||
423 | end; |
||
424 | end;} |
||
425 | PalleteAnim(RGBQuad(0, 0, 0), 300); |
||
426 | mainform.Visible := true; |
||
427 | end; |
||
428 | |||
429 | procedure TMainForm.LevelClick(Sender: TObject); |
||
430 | begin |
||
431 | speicherungform.showmodal; |
||
432 | end; |
||
433 | |||
434 | procedure TMainForm.FormShow(Sender: TObject); |
||
435 | begin |
||
436 | SplashForm.Hide; |
||
437 | SplashForm.Free; |
||
438 | |||
439 | dxtimer.Enabled := true; |
||
440 | dxtimer.ActiveOnly := true; |
||
441 | end; |
||
442 | |||
443 | procedure TMainForm.InformationenClick(Sender: TObject); |
||
444 | begin |
||
3 | daniel-mar | 445 | mainform.dxtimer.enabled := false; |
1 | daniel-mar | 446 | InfoForm.showmodal; |
3 | daniel-mar | 447 | mainform.dxtimer.enabled := true; |
1 | daniel-mar | 448 | end; |
449 | |||
450 | procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); |
||
451 | begin |
||
452 | SpriteEngine.Engine.Clear; |
||
453 | DXTimer.Enabled := False; |
||
454 | end; |
||
455 | |||
456 | procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton; |
||
457 | Shift: TShiftState; X, Y: Integer); |
||
458 | var |
||
459 | i, j, k, l, ex, ey: integer; |
||
460 | ok, breaked: boolean; |
||
461 | begin |
||
462 | ex := trunc(x/RasterW) * RasterW; |
||
463 | ey := trunc(y/RasterH) * RasterH; |
||
27 | daniel-mar | 464 | EnemyCreateSprite(ex, ey, SelectedEnemyType, LivesEdit.Value); |
1 | daniel-mar | 465 | breaked := false; |
466 | { Setzen } |
||
467 | if Button = mbLeft then |
||
468 | begin |
||
469 | ok := true; |
||
24 | daniel-mar | 470 | if (SelectedEnemyType = etEnemyBoss) and boss then |
471 | ok := false // boss already exists |
||
1 | daniel-mar | 472 | else |
473 | begin |
||
27 | daniel-mar | 474 | for i := 1 to NumEnemyTypes do |
1 | daniel-mar | 475 | begin |
476 | for j := 0 to 999 do |
||
477 | begin |
||
478 | if boss then |
||
479 | begin |
||
480 | for k := 0 to 3 do |
||
481 | begin |
||
482 | for l := 0 to 1 do |
||
483 | begin |
||
27 | daniel-mar | 484 | if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), etEnemyBoss, j) <> -1 then |
1 | daniel-mar | 485 | begin |
486 | ok := false; |
||
487 | break; |
||
488 | end; |
||
489 | end; |
||
490 | if not ok then break; |
||
491 | end; |
||
492 | if not ok then break; |
||
493 | end; |
||
27 | daniel-mar | 494 | if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then |
1 | daniel-mar | 495 | begin |
496 | ok := false; |
||
497 | break; |
||
498 | end; |
||
499 | end; |
||
500 | if not ok then break; |
||
501 | end; |
||
502 | end; |
||
503 | if ok then |
||
504 | begin |
||
24 | daniel-mar | 505 | if SelectedEnemyType <> etEnemyMeteor then |
27 | daniel-mar | 506 | LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, LivesEdit.Value) |
1 | daniel-mar | 507 | else |
27 | daniel-mar | 508 | LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, 0); |
1 | daniel-mar | 509 | inc(NumEnemys); |
24 | daniel-mar | 510 | if SelectedEnemyType = etEnemyBoss then boss := true; |
1 | daniel-mar | 511 | end |
512 | else beep; |
||
513 | end |
||
514 | { Löschen } |
||
515 | else if Button = mbRight then |
||
516 | begin |
||
27 | daniel-mar | 517 | for i := 1 to NumEnemyTypes do |
1 | daniel-mar | 518 | begin |
519 | for j := 0 to 999 do |
||
520 | begin |
||
27 | daniel-mar | 521 | if boss and (TEnemyType(i) = etEnemyBoss) then |
1 | daniel-mar | 522 | begin |
523 | for k := 0 to 3 do |
||
524 | begin |
||
525 | for l := 0 to 1 do |
||
526 | begin |
||
27 | daniel-mar | 527 | if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then |
1 | daniel-mar | 528 | begin |
27 | daniel-mar | 529 | LevData.DeleteEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j); |
1 | daniel-mar | 530 | Boss := false; |
531 | dec(NumEnemys); |
||
532 | breaked := true; |
||
533 | break; |
||
534 | end; |
||
535 | end; |
||
536 | if breaked then break; |
||
537 | end; |
||
538 | end; |
||
27 | daniel-mar | 539 | if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then |
1 | daniel-mar | 540 | begin |
27 | daniel-mar | 541 | LevData.DeleteEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j); |
542 | if TEnemyType(i) = etEnemyBoss then Boss := false; |
||
1 | daniel-mar | 543 | dec(NumEnemys); |
544 | breaked := true; |
||
545 | break; |
||
546 | end; |
||
547 | end; |
||
548 | if breaked then break; |
||
549 | end; |
||
550 | end; |
||
551 | LevChanged := true; |
||
552 | AnzeigeAct; |
||
553 | end; |
||
554 | |||
555 | procedure TMainForm.EnemyClick(Sender: TObject); |
||
24 | daniel-mar | 556 | var |
557 | et: TEnemyType; |
||
1 | daniel-mar | 558 | begin |
24 | daniel-mar | 559 | et := SelectedEnemyType; |
560 | Image1.Left := -(87 * (Ord(et) - 1)) + 1; |
||
561 | LivesEdit.Enabled := et <> etEnemyMeteor; |
||
562 | LivesLabel.Enabled := et <> etEnemyMeteor; |
||
1 | daniel-mar | 563 | end; |
564 | |||
27 | daniel-mar | 565 | procedure TMainForm.EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
1 | daniel-mar | 566 | var |
567 | Enemy: TSprite; |
||
568 | begin |
||
24 | daniel-mar | 569 | Enemy := TEnemy.Create(SpriteEngine.Engine, AEnemyType, ALives); |
1 | daniel-mar | 570 | Enemy.x := x; |
571 | Enemy.y := y; |
||
572 | end; |
||
573 | |||
574 | procedure TMainForm.DestroyLevel; |
||
575 | begin |
||
8 | daniel-mar | 576 | ScrollBar.Position := 0; // this doesn't call ScrollBarScroll() |
577 | ScrollP := 0; |
||
27 | daniel-mar | 578 | LevData.Clear; |
579 | ScrollBar.Max := MainForm.LevData.LevelEditorLength; |
||
1 | daniel-mar | 580 | NumEnemys := 0; |
581 | Boss := false; |
||
582 | LevChanged := true; |
||
24 | daniel-mar | 583 | LivesEdit.Value := 1; |
1 | daniel-mar | 584 | Enemy1.Checked := true; |
585 | EnemyClick(Enemy1); |
||
586 | AnzeigeAct; |
||
587 | end; |
||
588 | |||
589 | procedure TMainForm.AnzeigeAct; |
||
590 | begin |
||
591 | SLabel1b.Caption := inttostr(NumEnemys); |
||
592 | if Boss then SLabel2b.Caption := 'Ja' else SLabel2b.Caption := 'Nein'; |
||
593 | SLabel3b.Caption := inttostr(ScrollBar.Max); |
||
594 | if LevChanged then |
||
595 | begin |
||
596 | SLabel4a.Font.Color := $00000096; |
||
597 | SLabel4b.Font.Color := $00000096; |
||
598 | SLabel4b.Caption := 'Nein'; |
||
599 | end |
||
600 | else |
||
601 | begin |
||
602 | SLabel4a.Font.Color := $00009600; |
||
603 | SLabel4b.Font.Color := $00009600; |
||
604 | SLabel4b.Caption := 'Ja'; |
||
605 | end; |
||
606 | end; |
||
607 | |||
608 | procedure TMainForm.NeuClick(Sender: TObject); |
||
609 | begin |
||
28 | daniel-mar | 610 | if MessageDlg('Level wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then |
1 | daniel-mar | 611 | DestroyLevel; |
612 | end; |
||
613 | |||
614 | procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, |
||
615 | Y: Integer); |
||
24 | daniel-mar | 616 | resourcestring |
617 | status_info = 'Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...'; |
||
618 | status_lives = 'Leben: '; |
||
619 | status_nolives = 'Einheit hat keine Lebensangabe'; |
||
1 | daniel-mar | 620 | var |
27 | daniel-mar | 621 | ex, ey, i, j, k, l: integer; |
622 | lifes: integer; |
||
623 | enemyType: TEnemyType; |
||
624 | enemyName: string; |
||
1 | daniel-mar | 625 | breaked: boolean; |
626 | begin |
||
627 | if sender <> DxDraw then |
||
628 | begin |
||
24 | daniel-mar | 629 | StatusBar.SimpleText := ' ' + status_info; |
1 | daniel-mar | 630 | exit; |
631 | end; |
||
632 | ex := trunc(x/RasterW) * RasterW; |
||
633 | ey := trunc(y/RasterH) * RasterH; |
||
27 | daniel-mar | 634 | lifes := -1; |
635 | enemyType := etUnknown; |
||
1 | daniel-mar | 636 | breaked := false; |
27 | daniel-mar | 637 | for i := 1 to NumEnemyTypes do |
1 | daniel-mar | 638 | begin |
639 | for j := 0 to 999 do |
||
640 | begin |
||
27 | daniel-mar | 641 | if boss and (TEnemyType(i) = etEnemyBoss) then |
1 | daniel-mar | 642 | begin |
643 | for k := 0 to 3 do |
||
644 | begin |
||
645 | for l := 0 to 1 do |
||
646 | begin |
||
27 | daniel-mar | 647 | if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then |
1 | daniel-mar | 648 | begin |
27 | daniel-mar | 649 | lifes := j; |
1 | daniel-mar | 650 | breaked := true; |
651 | break; |
||
652 | end; |
||
653 | end; |
||
654 | if breaked then break; |
||
655 | end; |
||
656 | end; |
||
27 | daniel-mar | 657 | if (breaked = false) and (LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1) then |
1 | daniel-mar | 658 | begin |
27 | daniel-mar | 659 | lifes := j; |
660 | enemyType := TEnemyType(i); |
||
1 | daniel-mar | 661 | breaked := true; |
662 | break; |
||
663 | end; |
||
664 | end; |
||
665 | if breaked then break; |
||
666 | end; |
||
27 | daniel-mar | 667 | if lifes <> -1 then |
1 | daniel-mar | 668 | begin |
27 | daniel-mar | 669 | if Ord(enemyType) = 1 then enemyName := Enemy1.Caption |
670 | else if Ord(enemyType) = 2 then enemyName := Enemy2.Caption |
||
671 | else if Ord(enemyType) = 3 then enemyName := Enemy3.Caption |
||
672 | else if Ord(enemyType) = 4 then enemyName := Enemy4.Caption |
||
673 | else if Ord(enemyType) = 5 then enemyName := Enemy5.Caption |
||
674 | else if Ord(enemyType) = 6 then enemyName := Enemy6.Caption |
||
675 | else if Ord(enemyType) = 7 then enemyName := Enemy7.Caption |
||
676 | else enemyName := '???'; |
||
677 | if lifes > 0 then |
||
678 | StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_lives + inttostr(lifes) |
||
1 | daniel-mar | 679 | else |
27 | daniel-mar | 680 | StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_nolives; |
1 | daniel-mar | 681 | end |
682 | else |
||
24 | daniel-mar | 683 | StatusBar.SimpleText := ' ' + status_info; |
1 | daniel-mar | 684 | end; |
685 | |||
686 | procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); |
||
687 | begin |
||
688 | if LevChanged then |
||
28 | daniel-mar | 689 | CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, mbYesNoCancel, 0) = mrYes; |
1 | daniel-mar | 690 | end; |
691 | |||
692 | procedure TMainForm.Spielfelderweitern1Click(Sender: TObject); |
||
693 | begin |
||
694 | LevelForm.Aktualisieren; |
||
695 | LevelForm.showmodal; |
||
696 | end; |
||
697 | |||
698 | procedure TMainForm.ScrollBarScroll(Sender: TObject; |
||
699 | ScrollCode: TScrollCode; var ScrollPos: Integer); |
||
700 | begin |
||
701 | ScrollP := ScrollPos; |
||
702 | end; |
||
703 | |||
24 | daniel-mar | 704 | function TMainForm.SelectedEnemyType: TEnemyType; |
1 | daniel-mar | 705 | begin |
24 | daniel-mar | 706 | if Enemy1.Checked then result := etEnemyAttacker |
707 | else if Enemy2.Checked then result := etEnemyAttacker2 |
||
708 | else if Enemy3.Checked then result := etEnemyAttacker3 |
||
709 | else if Enemy4.Checked then result := etEnemyMeteor |
||
710 | else if Enemy5.Checked then result := etEnemyUFO |
||
711 | else if Enemy6.Checked then result := etEnemyUFO2 |
||
712 | else if Enemy7.Checked then result := etEnemyBoss |
||
713 | else result := etUnknown; |
||
1 | daniel-mar | 714 | end; |
715 | |||
716 | end. |
||
717 |