Subversion Repositories spacemission

Rev

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

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