Subversion Repositories spacemission

Compare Revisions

Regard whitespace Rev HEAD → Rev 1

/LevMain.pas
5,8 → 5,7
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem,
Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws,
DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes,
WinAPI.DirectDraw{$ENDIF}, DirectX, ComLevelReader, Global;
DXSounds, Spin, ComCtrls, PjVersionInfo;
 
type
TMainForm = class(TDXForm)
14,9 → 13,11
Spiel: TMenuItem;
Beenden: TMenuItem;
Hilfe: TMenuItem;
Mitarbeiter: TMenuItem;
Leer1: TMenuItem;
Level: TMenuItem;
Informationen: TMenuItem;
Leer2: TMenuItem;
Enemy1: TRadioButton;
Enemy2: TRadioButton;
Enemy3: TRadioButton;
42,12 → 43,12
SLabel4a: TLabel;
SLabel4b: TLabel;
LivesLabel: TLabel;
Quelltext1: TMenuItem;
StatusBar: TStatusBar;
N1: TMenuItem;
Spielfelderweitern1: TMenuItem;
SidePanel: TPanel;
LivesEdit: TSpinEdit;
AlleLeveldateienaktualisieren1: TMenuItem;
LivesEdt: TEdit;
Lives: TUpDown;
procedure DXDrawFinalize(Sender: TObject);
procedure DXDrawInitialize(Sender: TObject);
procedure FormCreate(Sender: TObject);
54,6 → 55,7
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure BeendenClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MitarbeiterClick(Sender: TObject);
procedure LevelClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure InformationenClick(Sender: TObject);
61,35 → 63,40
procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure EnemyClick(Sender: TObject);
procedure EnemyAdd(x, y, art, lives: integer);
procedure NeuClick(Sender: TObject);
procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Quelltext1Click(Sender: TObject);
procedure Spielfelderweitern1Click(Sender: TObject);
procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure AlleLeveldateienaktualisieren1Click(Sender: TObject);
procedure LivesClick(Sender: TObject; Button: TUDBtnType);
procedure LivesEdtKeyPress(Sender: TObject; var Key: Char);
procedure LivesEdtChange(Sender: TObject);
public
{ VCL-Ersatz }
spriteengine: tdxspriteengine;
versioninfo: tpjversioninfo;
dxtimer: tdxtimer;
imagelist: tdximagelist;
dxdraw: tdxdraw;
{ Variablen }
FDirectory: string;
FEngineVersion: string;
FMenuItem: integer;
LevData: TLevelData;
Enemys: TStrings;
ArtChecked: integer;
LiveEdit: integer;
ScrollP: integer;
AltScrollPos: integer;
Boss: boolean;
LevChanged: boolean;
NumEnemys: integer;
function SelectedEnemyType: TEnemyType;
{ Grafik-Routinen }
function GetSpriteGraphic(Sprite: TSpaceMissionGraphicSprite): TPictureCollectionItem;
{ Level-Routinen }
procedure EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer);
procedure EnemyCreate(x, y: integer);
procedure DestroyLevel;
procedure RefreshFromLevData;
procedure AnzeigeAct;
{ Initialisiations-Routinen }
procedure DXInit;
97,91 → 104,107
{ Farb-Routinen }
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
{ Sonstiges }
procedure LivesChange(newval: integer);
end;
 
var
MainForm: TMainForm;
 
const
FCompVersion = '1.0';
 
implementation
 
uses
LevSplash, LevSpeicherung, ComInfo, LevOptions;
LevSplash, LevSpeicherung, LevText, LevInfo, LevSource, LevOptions;
 
const
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
status_info = ' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
status_lives = ' Leben: ';
status_nolives = ' Einheit hat keine Lebensangabe';
RasterW = 48;
RasterH = 32;
 
{$R *.DFM}
 
{$R WindowsXP.res}
 
type
TBackground = class(TBackgroundSprite)
strict protected
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TEnemy = class(TImageSprite)
strict private
FLives: integer;
FEnemyType: TEnemyType;
FXCor: integer;
FCorInit: boolean;
strict protected
private
Lives: integer;
Art: integer;
XCor: integer;
CorInit: boolean;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); reintroduce;
constructor Create(AParent: TSprite); override;
end;
 
{ TBackground }
 
procedure TBackground.DoMove(MoveCount: Integer);
procedure TMainForm.DXInit;
begin
X := -(MainForm.ScrollP * RasterW);
Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
DXDraw.Initialize;
end;
 
{ TEnemy }
 
procedure TEnemy.DoMove(MoveCount: Integer);
begin
if not FCorInit then
if not CorInit then
begin
FXCor := trunc(x) + (MainForm.ScrollP * RasterW);
FCorInit := true;
XCor := trunc(x) + (MainForm.ScrollP * RasterW);
CorInit := true;
end;
if MainForm.LevData.IndexOfEnemy(FXCor, integer(round(Y)), FEnemyType, FLives) = -1 then dead;
X := FXCor - (MainForm.ScrollP * RasterW);
if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+
inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead;
X := XCor - (MainForm.ScrollP * RasterW);
end;
 
constructor TEnemy.Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer);
procedure TBackground.DoMove(MoveCount: Integer);
begin
X := -(MainForm.ScrollP * RasterW);
end;
 
constructor TEnemy.Create(AParent: TSprite);
begin
inherited Create(AParent);
if AEnemyType = etEnemyAttacker then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker);
if AEnemyType = etEnemyAttacker2 then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker2);
if AEnemyType = etEnemyAttacker3 then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker3);
if AEnemyType = etEnemyMeteor then Image := MainForm.GetSpriteGraphic(smgEnemyMeteor);
if AEnemyType = etEnemyUFO then Image := MainForm.GetSpriteGraphic(smgEnemyDisk);
if AEnemyType = etEnemyUFO2 then Image := MainForm.GetSpriteGraphic(smgEnemyDisk2);
if AEnemyType = etEnemyBoss then Image := MainForm.GetSpriteGraphic(smgEnemyBoss);
 
if AEnemyType = etEnemyMeteor then FLives := 0 else FLives := ALives;
FEnemyType := AEnemyType;
if MainForm.ArtChecked = 1 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
if MainForm.ArtChecked = 2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
if MainForm.ArtChecked = 3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
if MainForm.ArtChecked = 4 then Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
if MainForm.ArtChecked = 5 then Image := MainForm.ImageList.Items.Find('Enemy-Disk');
if MainForm.ArtChecked = 6 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2');
if MainForm.ArtChecked = 7 then Image := MainForm.ImageList.Items.Find('Enemy-Boss');
if MainForm.ArtChecked = 4 then Lives := 0 else Lives := MainForm.LiveEdit;
Art := MainForm.ArtChecked;
Width := Image.Width;
Height := Image.Height;
PixelCheck := True;
end;
 
{ TMainForm }
 
procedure TMainForm.DXInit;
begin
Imagelist.Items.LoadFromFile(OwnDirectory+'DirectX\Graphics.dxg');
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
DXDraw.Initialize;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
resourcestring
SFileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
var
Ergebnis: string;
daten: textfile;
i: integer;
punkt: integer;
ok: boolean;
begin
{ VCL-Ersatz start }
 
versioninfo := tpjversioninfo.create(self);
 
dxtimer := tdxtimer.create(self);
dxtimer.Interval := 100;
dxtimer.ActiveOnly := false;
192,12 → 215,11
dxdraw.Parent := self;
dxdraw.Left := 0;
dxdraw.Top := 0;
dxdraw.Width := SidePanel.Left;
dxdraw.Height := ScrollBar.Top;
dxdraw.Width := 640;
dxdraw.Height := 480;
dxdraw.AutoInitialize := False;
dxdraw.AutoSize := False;
dxdraw.Color := clBlack;
(*
dxdraw.Display.BitCount := 24;
dxdraw.Display.FixedBitCount := False;
dxdraw.Display.FixedRatio := False;
204,8 → 226,7
dxdraw.Display.FixedSize := False;
dxdraw.Display.Height := 600;
dxdraw.Display.Width := 800;
*)
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, doRetainedMode, doHardware, doSelectDriver];
dxdraw.OnFinalize := DXDrawFinalize;
dxdraw.OnInitialize := DXDrawInitialize;
dxdraw.ParentShowHint := False;
222,46 → 243,57
 
{ VCL-Ersatz ende }
 
LivesEdit.MinValue := 1;
LivesEdit.MaxValue := MaxPossibleEnemyLives;
LivesEdit.Value := 1;
 
Enemy1.Checked := true;
EnemyClick(Enemy1);
ArtChecked := 1;
LiveEdit := 1;
// Leeres Level am Anfang braucht keine Beenden-Bestätigung.
// LevChanged := true;
 
//Application.Title := 'SpaceMission '+ProgramVersion+' - Leveleditor';
Caption := 'SpaceMission '+ProgramVersion+' - Leveleditor';
punkt := 0;
FDirectory := extractfilepath(paramstr(0));
versioninfo.filename := paramstr(0);
for i := 1 to length(versioninfo.ProductVersion) do
begin
if copy(versioninfo.ProductVersion, i, 1) = '.' then inc(punkt);
if punkt < 2 then fengineversion :=
fengineversion+copy(versioninfo.ProductVersion, i, 1);
end;
//Application.Title := 'SpaceMission '+FEngineVersion+' - Leveleditor';
Caption := 'SpaceMission '+FEngineVersion+' - Leveleditor';
DXInit;
LevData := TLevelData.create;
ProgramInit;
DestroyLevel;
if (paramcount > 0) and (fileexists(paramstr(1))) and (ExtractFileExt(paramstr(1)).ToLower = '.lev') then
if (paramcount > 0) and (fileexists(paramstr(1))) then
begin
try
LevData.RasterErzwingen := true;
LevData.LoadFromFile(paramstr(1));
except
on E: Exception do
AssignFile(daten, paramstr(1));
Reset(daten);
ok := true;
ReadLN(daten, Ergebnis);
if Ergebnis <> '; SpaceMission '+FCompVersion then ok := false;
ReadLN(daten, Ergebnis);
if ergebnis <> '; LEV-File' then ok := false;
if not ok then
begin
showmessage(SFileError + ' ' +E.Message);
DestroyLevel;
showmessage(FileError);
CloseFile(daten);
ProgramInit;
exit;
end;
{ Laden }
CloseFile(daten);
exit;
end;
RefreshFromLevData;
LevChanged := false;
AnzeigeAct;
if fileexists(fdirectory+'Bilder\Auswahl.bmp') then
Image1.Picture.LoadFromFile(fdirectory+'Bilder\Auswahl.bmp');
{else
SelPanel.visible := false;}
ProgramInit;
end;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(dxdraw);
FreeAndNil(LevData);
//FreeAndNil(spriteengine);
FreeAndNil(dxtimer);
FreeAndNil(imagelist);
Enemys.Free;
//spriteengine.Free;
versioninfo.free;
dxtimer.Free;
imagelist.Free;
dxdraw.free;
end;
 
procedure TMainForm.BeendenClick(Sender: TObject);
271,12 → 303,12
 
procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
if Assigned(DXTimer) then DXTimer.Enabled := True;
DXTimer.Enabled := True;
end;
 
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
if Assigned(DXTimer) then DXTimer.Enabled := False;
DXTimer.Enabled := False;
end;
 
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
344,12 → 376,13
{var
i, j: Integer;}
begin
Enemys := TStringList.create;
sleep(500);
//PlayerSprite
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar3);
Image := mainform.ImageList.Items.Find('Star3');
Z := -13;
Y := 40;
Tile := True;
357,7 → 390,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar2);
Image := mainform.ImageList.Items.Find('Star2');
Z := -12;
Y := 30;
Tile := True;
365,7 → 398,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar1);
Image := mainform.ImageList.Items.Find('Star1');
Z := -11;
Y := 10;
Tile := True;
373,7 → 406,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgMatrix);
Image := mainform.ImageList.Items.Find('Matrix');
Z := -10;
Tile := True;
end;
429,23 → 462,18
mainform.Visible := true;
end;
 
procedure TMainForm.RefreshFromLevData;
var
i: integer;
procedure TMainForm.MitarbeiterClick(Sender: TObject);
begin
MainForm.ScrollBar.Max := MainForm.LevData.LevelEditorLength;
for i := 0 to MainForm.LevData.CountEnemies - 1 do
if not fileexists(mainform.fdirectory+'Texte\Mitwirkende.txt') then
begin
MainForm.EnemyCreateSprite(
MainForm.LevData.EnemyAdventTable[i].x,
MainForm.LevData.EnemyAdventTable[i].y,
MainForm.LevData.EnemyAdventTable[i].enemyType,
MainForm.LevData.EnemyAdventTable[i].lifes
);
MessageDLG('Die Datei "Texte\Mitwirkende.txt" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!',
mtWarning, [mbOK], 0);
end
else
begin
TextForm.memo1.lines.loadfromfile(mainform.FDirectory+'Texte\Mitwirkende.txt');
TextForm.showmodal;
end;
MainForm.NumEnemys := MainForm.LevData.CountEnemies;
MainForm.Boss := MainForm.LevData.HasBoss;
AnzeigeAct;
end;
 
procedure TMainForm.LevelClick(Sender: TObject);
455,30 → 483,16
 
procedure TMainForm.FormShow(Sender: TObject);
begin
if Assigned(SplashForm) then
begin
SplashForm.Hide;
FreeAndNil(SplashForm);
end;
SplashForm.Free;
 
dxtimer.Enabled := true;
dxtimer.ActiveOnly := true;
end;
 
function TMainForm.GetSpriteGraphic(
Sprite: TSpaceMissionGraphicSprite): TPictureCollectionItem;
begin
if (Sprite<>smgNone) and (imagelist.Items.Count >= Ord(Sprite)) then
result := imagelist.Items.Items[Ord(Sprite)-1]
else
result := nil;
end;
 
procedure TMainForm.InformationenClick(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
InfoForm.showmodal;
mainform.dxtimer.enabled := true;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
495,19 → 509,18
begin
ex := trunc(x/RasterW) * RasterW;
ey := trunc(y/RasterH) * RasterH;
EnemyCreateSprite(ex, ey, SelectedEnemyType, LivesEdit.Value);
EnemyCreate(ex, ey);
breaked := false;
{ Setzen }
if Button = mbLeft then
begin
ok := true;
if (SelectedEnemyType = etEnemyBoss) and boss then
ok := false // boss already exists
if (ArtChecked = 7) and boss then ok := false
else
begin
for i := 1 to NumEnemyTypes do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss then
begin
515,7 → 528,7
begin
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), etEnemyBoss, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':7('+inttostr(j)+')') <> -1 then
begin
ok := false;
break;
525,7 → 538,8
end;
if not ok then break;
end;
if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
ok := false;
break;
536,12 → 550,14
end;
if ok then
begin
if SelectedEnemyType <> etEnemyMeteor then
LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, LivesEdit.Value)
if ArtChecked <> 4 then
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(ArtChecked)+'('+inttostr(LiveEdit)+')')
else
LevData.AddEnemy(ex + (ScrollP * RasterW), ey, SelectedEnemyType, 0);
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(ArtChecked)+'(0)');
inc(NumEnemys);
if SelectedEnemyType = etEnemyBoss then boss := true;
if ArtChecked = 7 then boss := true;
end
else beep;
end
548,19 → 564,19
{ Löschen }
else if Button = mbRight then
begin
for i := 1 to NumEnemyTypes do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss and (TEnemyType(i) = etEnemyBoss) then
if boss and (i = 7) then
begin
for k := 0 to 3 do
begin
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
LevData.DeleteEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j);
Enemys.Delete(Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')'));
Boss := false;
dec(NumEnemys);
breaked := true;
570,10 → 586,12
if breaked then break;
end;
end;
if LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1 then
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
LevData.DeleteEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j);
if TEnemyType(i) = etEnemyBoss then Boss := false;
Enemys.Delete(Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+
':'+inttostr(i)+'('+inttostr(j)+')'));
if i = 7 then Boss := false;
dec(NumEnemys);
breaked := true;
break;
587,20 → 605,26
end;
 
procedure TMainForm.EnemyClick(Sender: TObject);
var
et: TEnemyType;
begin
et := SelectedEnemyType;
Image1.Left := -(87 * (Ord(et) - 1)) + 1;
LivesEdit.Enabled := et <> etEnemyMeteor;
LivesLabel.Enabled := et <> etEnemyMeteor;
if sender = Enemy1 then ArtChecked := 1;
if sender = Enemy2 then ArtChecked := 2;
if sender = Enemy3 then ArtChecked := 3;
if sender = Enemy4 then ArtChecked := 4;
if sender = Enemy5 then ArtChecked := 5;
if sender = Enemy6 then ArtChecked := 6;
if sender = Enemy7 then ArtChecked := 7;
Image1.Left := -(87 * (ArtChecked - 1)) + 1;
Lives.Enabled := sender <> Enemy4;
LivesLabel.Enabled := sender <> Enemy4;
if sender = Enemy4 then LivesEdt.Font.Color := clBtnShadow // andere farbe?
else LivesEdt.Font.Color := clWindowText;
end;
 
procedure TMainForm.EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer);
procedure TMainForm.EnemyCreate(x, y: integer);
var
Enemy: TSprite;
begin
Enemy := TEnemy.Create(SpriteEngine.Engine, AEnemyType, ALives);
Enemy := TEnemy.Create(SpriteEngine.Engine);
Enemy.x := x;
Enemy.y := y;
end;
607,35 → 631,18
 
procedure TMainForm.DestroyLevel;
begin
ScrollBar.Position := 0; // this doesn't call ScrollBarScroll()
ScrollP := 0;
LevData.Clear;
ScrollBar.Max := LevData.LevelEditorLength;
ScrollBar.Position := 0;
Enemys.Clear;
NumEnemys := 0;
Boss := false;
LevChanged := true;
LivesEdit.Value := 1;
Lives.Position := 1;
LivesChange(Lives.Position);
Enemy1.Checked := true;
EnemyClick(Enemy1);
AnzeigeAct;
end;
 
procedure TMainForm.AlleLeveldateienaktualisieren1Click(Sender: TObject);
var
i: integer;
begin
// Just for internal/development purposes
for i := 1 to MaxPossibleLevels do
begin
if FileExists('Levels\Level '+IntToStr(i)+'.lev') then
begin
LevData.RasterErzwingen := true;
LevData.LoadFromFile('Levels\Level '+IntToStr(i)+'.lev');
LevData.SaveToFile('Levels\Level '+IntToStr(i)+'.lev');
end;
end;
end;
 
procedure TMainForm.AnzeigeAct;
begin
SLabel1b.Caption := inttostr(NumEnemys);
655,48 → 662,45
end;
end;
 
procedure TMainForm.EnemyAdd(x, y, art, lives: integer);
begin
Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')');
end;
 
procedure TMainForm.NeuClick(Sender: TObject);
begin
if MessageDlg('Level wirklich löschen?', mtConfirmation, mbYesNoCancel, 0) = mrYes then
if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
DestroyLevel;
end;
 
procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
resourcestring
status_info = 'Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
status_lives = 'Leben: ';
status_nolives = 'Einheit hat keine Lebensangabe';
var
ex, ey, i, j, k, l: integer;
lifes: integer;
enemyType: TEnemyType;
enemyName: string;
ex, ey, i, j, k, l, wert: integer;
breaked: boolean;
begin
if sender <> DxDraw then
begin
StatusBar.SimpleText := ' ' + status_info;
StatusBar.SimpleText := status_info;
exit;
end;
ex := trunc(x/RasterW) * RasterW;
ey := trunc(y/RasterH) * RasterH;
lifes := -1;
enemyType := etUnknown;
wert := -1;
breaked := false;
for i := 1 to NumEnemyTypes do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss and (TEnemyType(i) = etEnemyBoss) then
if boss and (i = 7) then
begin
for k := 0 to 3 do
begin
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * RasterW), ey - (RasterH * l), TEnemyType(i), j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
lifes := j;
wert := j;
breaked := true;
break;
end;
704,10 → 708,10
if breaked then break;
end;
end;
if (breaked = false) and (LevData.IndexOfEnemy(ex + (ScrollP * RasterW), ey, TEnemyType(i), j) <> -1) then
if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1) then
begin
lifes := j;
enemyType := TEnemyType(i);
wert := j;
breaked := true;
break;
end;
714,31 → 718,29
end;
if breaked then break;
end;
if lifes <> -1 then
if wert <> -1 then
begin
if Ord(enemyType) = 1 then enemyName := Enemy1.Caption
else if Ord(enemyType) = 2 then enemyName := Enemy2.Caption
else if Ord(enemyType) = 3 then enemyName := Enemy3.Caption
else if Ord(enemyType) = 4 then enemyName := Enemy4.Caption
else if Ord(enemyType) = 5 then enemyName := Enemy5.Caption
else if Ord(enemyType) = 6 then enemyName := Enemy6.Caption
else if Ord(enemyType) = 7 then enemyName := Enemy7.Caption
else enemyName := '???';
if lifes > 0 then
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_lives + inttostr(lifes)
if wert > 0 then
StatusBar.SimpleText := status_lives + inttostr(wert)
else
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_nolives;
StatusBar.SimpleText := status_nolives;
end
else
StatusBar.SimpleText := ' ' + status_info;
StatusBar.SimpleText := status_info;
end;
 
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(LevData) and LevChanged and (LevData.CountEnemies>0) then
CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, mbYesNoCancel, 0) = mrYes;
if LevChanged then
CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
 
procedure TMainForm.Quelltext1Click(Sender: TObject);
begin
SourceForm.Aktualisieren;
SourceForm.showmodal;
end;
 
procedure TMainForm.Spielfelderweitern1Click(Sender: TObject);
begin
LevelForm.Aktualisieren;
751,17 → 753,28
ScrollP := ScrollPos;
end;
 
function TMainForm.SelectedEnemyType: TEnemyType;
procedure TMainForm.LivesChange(newval: integer);
begin
if Enemy1.Checked then result := etEnemyAttacker
else if Enemy2.Checked then result := etEnemyAttacker2
else if Enemy3.Checked then result := etEnemyAttacker3
else if Enemy4.Checked then result := etEnemyMeteor
else if Enemy5.Checked then result := etEnemyUFO
else if Enemy6.Checked then result := etEnemyUFO2
else if Enemy7.Checked then result := etEnemyBoss
else result := etUnknown;
LiveEdit := newval;
livesedt.Text := inttostr(LiveEdit);
lives.Position := newval;
end;
 
procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType);
begin
LivesChange(lives.Position);
end;
 
procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [#13, #08, '0'..'9']) then
Key := #0;
end;
 
procedure TMainForm.LivesEdtChange(Sender: TObject);
begin
LivesChange(strtoint(livesedt.text));
end;
 
end.