2,6 → 2,7 |
|
// TODO 2024: |
// - Wenn man ein Level "X" lädt, und dann Verwalten wieder öffnet, sollte diese Level-Nummer vorgeschlagen werden, sodass man direkt Speichern klicken kann |
// - Remove "Source edit" form |
|
interface |
|
9,7 → 10,7 |
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; |
WinAPI.DirectDraw{$ENDIF}, DirectX, ComLevelReader; |
|
type |
TMainForm = class(TDXForm) |
49,8 → 50,8 |
StatusBar: TStatusBar; |
N1: TMenuItem; |
Spielfelderweitern1: TMenuItem; |
LivesEdt: TEdit; |
Lives: TUpDown; |
SidePanel: TPanel; |
LivesEdit: TSpinEdit; |
procedure DXDrawFinalize(Sender: TObject); |
procedure DXDrawInitialize(Sender: TObject); |
procedure FormCreate(Sender: TObject); |
73,9 → 74,6 |
procedure Spielfelderweitern1Click(Sender: TObject); |
procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode; |
var ScrollPos: Integer); |
procedure LivesClick(Sender: TObject; Button: TUDBtnType); |
procedure LivesEdtKeyPress(Sender: TObject; var Key: Char); |
procedure LivesEdtChange(Sender: TObject); |
public |
{ VCL-Ersatz } |
spriteengine: tdxspriteengine; |
85,15 → 83,15 |
{ Variablen } |
FMenuItem: integer; |
Enemys: TStrings; |
ArtChecked: integer; |
LiveEdit: integer; |
ScrollP: integer; |
AltScrollPos: integer; |
Boss: boolean; |
LevChanged: boolean; |
NumEnemys: integer; |
function SelectedEnemyType: TEnemyType; |
{ Level-Routinen } |
procedure EnemyCreate(x, y: integer); |
procedure EnemyCreate(x, y: integer); overload; |
procedure EnemyCreate(x, y: integer; AEnemyType: TEnemyType; ALives: integer); overload; |
procedure DestroyLevel; |
procedure AnzeigeAct; |
{ Initialisiations-Routinen } |
102,8 → 100,6 |
{ Farb-Routinen } |
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad; |
procedure PalleteAnim(Col: TRGBQuad; Time: Integer); |
{ Sonstiges } |
procedure LivesChange(newval: integer); |
end; |
|
var |
112,14 → 108,9 |
implementation |
|
uses |
Global, LevSplash, LevSpeicherung, ComInfo, LevSource, LevOptions, |
ComLevelReader; |
Global, LevSplash, LevSpeicherung, ComInfo, 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; |
|
127,67 → 118,76 |
|
type |
TBackground = class(TBackgroundSprite) |
protected |
strict protected |
procedure DoMove(MoveCount: Integer); override; |
end; |
|
TEnemy = class(TImageSprite) |
private |
Lives: integer; |
Art: integer; |
XCor: integer; |
CorInit: boolean; |
protected |
strict private |
FLives: integer; |
FEnemyType: TEnemyType; |
FXCor: integer; |
FCorInit: boolean; |
strict protected |
procedure DoMove(MoveCount: Integer); override; |
public |
constructor Create(AParent: TSprite); override; |
constructor Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); reintroduce; |
end; |
|
procedure TMainForm.DXInit; |
{ TBackground } |
|
procedure TBackground.DoMove(MoveCount: Integer); |
begin |
Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg'); |
ImageList.Items.MakeColorTable; |
DXDraw.ColorTable := ImageList.Items.ColorTable; |
DXDraw.DefColorTable := ImageList.Items.ColorTable; |
DXDraw.UpdatePalette; |
DXDraw.Initialize; |
X := -(MainForm.ScrollP * RasterW); |
end; |
|
{ TEnemy } |
|
procedure TEnemy.DoMove(MoveCount: Integer); |
begin |
if not CorInit then |
if not FCorInit then |
begin |
XCor := trunc(x) + (MainForm.ScrollP * RasterW); |
CorInit := true; |
FXCor := trunc(x) + (MainForm.ScrollP * RasterW); |
FCorInit := true; |
end; |
if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+ |
inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead; |
X := XCor - (MainForm.ScrollP * RasterW); |
if MainForm.Enemys.IndexOf(floattostr(FXCor)+'-'+floattostr(y)+':'+ |
inttostr(Ord(FEnemyType))+'('+inttostr(FLives)+')') = -1 then dead; |
X := FXCor - (MainForm.ScrollP * RasterW); |
end; |
|
procedure TBackground.DoMove(MoveCount: Integer); |
constructor TEnemy.Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); |
begin |
X := -(MainForm.ScrollP * RasterW); |
end; |
inherited Create(AParent); |
if AEnemyType = etEnemyAttacker then Image := MainForm.ImageList.Items.Find('Enemy-Attacker'); |
if AEnemyType = etEnemyAttacker2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2'); |
if AEnemyType = etEnemyAttacker3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3'); |
if AEnemyType = etEnemyMeteor then Image := MainForm.ImageList.Items.Find('Enemy-Meteor'); |
if AEnemyType = etEnemyUFO then Image := MainForm.ImageList.Items.Find('Enemy-Disk'); |
if AEnemyType = etEnemyUFO2 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2'); |
if AEnemyType = etEnemyBoss then Image := MainForm.ImageList.Items.Find('Enemy-Boss'); |
|
constructor TEnemy.Create(AParent: TSprite); |
begin |
inherited Create(AParent); |
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; |
if AEnemyType = etEnemyMeteor then FLives := 0 else FLives := ALives; |
FEnemyType := AEnemyType; |
Width := Image.Width; |
Height := Image.Height; |
PixelCheck := True; |
end; |
|
{ TMainForm } |
|
procedure TMainForm.DXInit; |
begin |
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; |
|
procedure TMainForm.FormCreate(Sender: TObject); |
resourcestring |
SFileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!'; |
var |
LevelData: TLevelData; |
begin |
202,11 → 202,12 |
dxdraw.Parent := self; |
dxdraw.Left := 0; |
dxdraw.Top := 0; |
dxdraw.Width := 640; |
dxdraw.Height := 480; |
dxdraw.Width := SidePanel.Left; |
dxdraw.Height := ScrollBar.Top; |
dxdraw.AutoInitialize := False; |
dxdraw.AutoSize := False; |
dxdraw.Color := clBlack; |
(* |
dxdraw.Display.BitCount := 24; |
dxdraw.Display.FixedBitCount := False; |
dxdraw.Display.FixedRatio := False; |
213,6 → 214,7 |
dxdraw.Display.FixedSize := False; |
dxdraw.Display.Height := 600; |
dxdraw.Display.Width := 800; |
*) |
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver]; |
dxdraw.OnFinalize := DXDrawFinalize; |
dxdraw.OnInitialize := DXDrawInitialize; |
230,8 → 232,8 |
|
{ VCL-Ersatz ende } |
|
ArtChecked := 1; |
LiveEdit := 1; |
Enemy1.Checked := true; |
EnemyClick(Enemy1); |
// Leeres Level am Anfang braucht keine Beenden-Bestätigung. |
// LevChanged := true; |
|
245,7 → 247,7 |
try |
LevelData.Load(paramstr(1)); |
except |
showmessage(FileError); |
showmessage(SFileError); |
ProgramInit; |
exit; |
end; |
255,10 → 257,6 |
{ Laden } |
exit; |
end; |
if fileexists(fdirectory+'Bilder\Auswahl.bmp') then |
Image1.Picture.LoadFromFile(fdirectory+'Bilder\Auswahl.bmp'); |
{else |
SelPanel.visible := false;} |
ProgramInit; |
end; |
|
478,7 → 476,8 |
if Button = mbLeft then |
begin |
ok := true; |
if (ArtChecked = 7) and boss then ok := false |
if (SelectedEnemyType = etEnemyBoss) and boss then |
ok := false // boss already exists |
else |
begin |
for i := 1 to 7 do |
513,14 → 512,14 |
end; |
if ok then |
begin |
if ArtChecked <> 4 then |
if SelectedEnemyType <> etEnemyMeteor then |
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(ArtChecked)+'('+inttostr(LiveEdit)+')') |
inttostr(Ord(SelectedEnemyType))+'('+inttostr(LivesEdit.Value)+')') |
else |
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+ |
inttostr(ArtChecked)+'(0)'); |
inttostr(Ord(SelectedEnemyType))+'(0)'); |
inc(NumEnemys); |
if ArtChecked = 7 then boss := true; |
if SelectedEnemyType = etEnemyBoss then boss := true; |
end |
else beep; |
end |
568,30 → 567,29 |
end; |
|
procedure TMainForm.EnemyClick(Sender: TObject); |
var |
et: TEnemyType; |
begin |
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; |
et := SelectedEnemyType; |
Image1.Left := -(87 * (Ord(et) - 1)) + 1; |
LivesEdit.Enabled := et <> etEnemyMeteor; |
LivesLabel.Enabled := et <> etEnemyMeteor; |
end; |
|
procedure TMainForm.EnemyCreate(x, y: integer); |
procedure TMainForm.EnemyCreate(x, y: integer; AEnemyType: TEnemyType; ALives: integer); |
var |
Enemy: TSprite; |
begin |
Enemy := TEnemy.Create(SpriteEngine.Engine); |
Enemy := TEnemy.Create(SpriteEngine.Engine, AEnemyType, ALives); |
Enemy.x := x; |
Enemy.y := y; |
end; |
|
procedure TMainForm.EnemyCreate(x, y: integer); |
begin |
EnemyCreate(x, y, SelectedEnemyType, LivesEdit.Value); |
end; |
|
procedure TMainForm.DestroyLevel; |
begin |
ScrollBar.Position := 0; // this doesn't call ScrollBarScroll() |
600,8 → 598,7 |
NumEnemys := 0; |
Boss := false; |
LevChanged := true; |
Lives.Position := 1; |
LivesChange(Lives.Position); |
LivesEdit.Value := 1; |
Enemy1.Checked := true; |
EnemyClick(Enemy1); |
AnzeigeAct; |
639,6 → 636,10 |
|
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, wert: integer; |
breaked: boolean; |
645,7 → 646,7 |
begin |
if sender <> DxDraw then |
begin |
StatusBar.SimpleText := status_info; |
StatusBar.SimpleText := ' ' + status_info; |
exit; |
end; |
ex := trunc(x/RasterW) * RasterW; |
685,12 → 686,12 |
if wert <> -1 then |
begin |
if wert > 0 then |
StatusBar.SimpleText := status_lives + inttostr(wert) |
StatusBar.SimpleText := ' ' + status_lives + inttostr(wert) |
else |
StatusBar.SimpleText := 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); |
717,32 → 718,17 |
ScrollP := ScrollPos; |
end; |
|
procedure TMainForm.LivesChange(newval: integer); |
function TMainForm.SelectedEnemyType: TEnemyType; |
begin |
LiveEdit := newval; |
livesedt.Text := inttostr(LiveEdit); |
lives.Position := newval; |
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; |
end; |
|
procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType); |
begin |
LivesChange(lives.Position); |
end; |
|
procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char); |
begin |
{$IFDEF UNICODE} |
if not CharInSet(Key, [#13, #08, '0'..'9']) then |
{$ELSE} |
if not (Key in [#13, #08, '0'..'9']) then |
{$ENDIF} |
Key := #0; |
end; |
|
procedure TMainForm.LivesEdtChange(Sender: TObject); |
begin |
LivesChange(strtoint(livesedt.text)); |
end; |
|
end. |
|