Subversion Repositories spacemission

Compare Revisions

Regard whitespace Rev 6 → Rev 7

/GamMain.pas
93,16 → 93,17
destructor Destroy; override;
end;
 
TEnemyClass = class of TEnemy;
TEnemy = class(TImageSprite)
private
FCounter: Integer;
FLife: integer;
FMode: Integer;
procedure Hit; virtual;
protected
procedure HitEnemy(ADead: Boolean); virtual;
public
constructor Create(AParent: TSprite); override;
procedure Hit(AHitStrength: integer = 1);
constructor Create(AParent: TSprite; ALifes: integer); virtual;
destructor Destroy; override;
end;
 
120,7 → 121,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyUFO = class(TEnemy)
128,7 → 129,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyUFO2 = class(TEnemy)
140,7 → 141,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyAttacker = class(TEnemy)
148,7 → 149,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyAttacker2 = class(TEnemy)
161,7 → 162,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyAttacker3 = class(TEnemy)
173,7 → 174,7
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TEnemyBoss = class(TEnemy)
187,15 → 188,11
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
constructor Create(AParent: TSprite; ALifes: integer); override;
end;
 
TNothing = class(TImageSprite);
 
TSpriteClass = class of TSprite;
 
TEnemyAdvent = record
spriteClass: TSpriteClass;
spriteClass: TEnemyClass;
x: extended;
y: extended;
lifes: integer;
265,6 → 262,7
FBlinkTime: DWORD;
FFrame, FAngle, FCounter, FEnemyAdventPos: Integer;
PlayerSprite: TPlayerSprite;
TimerCS: TRTLCriticalSection;
procedure StartScene(Scene: TGameScene);
procedure EndScene;
procedure BlinkStart;
292,7 → 290,7
FLevel: integer;
FMenuItem: integer;
FBossLife: integer;
FRestEnemys: integer;
FRestEnemies: integer;
FCheat: boolean;
{ VCL-Ersatz }
dxdraw: TDxDraw;
331,6 → 329,11
var
MainForm: TMainForm;
 
implementation
 
uses
GamSplash, GamSpeicherung, ComInfo, GamCheat, Global;
 
const
// TODO: ini file
conleicht = 650 div 60; // 10
339,10 → 342,14
conmaster = 2000 div 60; // 33
lives = 6;
 
implementation
// TODO: Auch für Enemies
PLAYER_MODE_NORMAL = 0;
PLAYER_MODE_DEAD = 1;
PLAYER_MODE_DEAD_VANISHED = 2;
PLAYER_MODE_FLYAWAY = 3;
PLAYER_MODE_ENTER = 4;
 
uses
GamSplash, GamSpeicherung, ComInfo, GamCheat, Global;
DEFAULT_ANIMSPEED = 15/1000;
 
resourcestring
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
350,12 → 357,9
{$R *.DFM}
 
var // TODO: irgendwo hinpacken. irgendwo!!!
EnemyAdventTable: array[0..9999] of TEnemyAdvent; // TODO: dyn
Crash2, ec: integer;
EnemyAdventTable: array of TEnemyAdvent;
Crash2, EnemyCounter: integer;
BossExists, Crash, crashsound: boolean;
pos: array[1..4] of integer;
enemys: array[1..27] of TSpriteClass;
levact: integer;
 
const
DXInputButton = [isButton1, isButton2, isButton3,
364,15 → 368,6
isButton19, isButton20, isButton21, isButton22, isButton23, isButton24, isButton25,
isButton26, isButton27, isButton28, isButton29, isButton30, isButton31, isButton32];
 
const // TODO: Auch für Enemies
PLAYER_MODE_NORMAL = 0;
PLAYER_MODE_DEAD = 1;
PLAYER_MODE_DEAD_VANISHED = 2;
PLAYER_MODE_FLYAWAY = 3;
PLAYER_MODE_ENTER = 4;
 
DEFAULT_ANIMSPEED = 15/1000;
 
// TODO: Code komplett überarbeiten. Bessere Ableitungen machen
 
constructor TPlayerSprite.Create(AParent: TSprite);
457,7 → 452,8
end;
end;
Collision;
end else if FMode=PLAYER_MODE_DEAD then
end
else if FMode=PLAYER_MODE_DEAD then
begin
if FCounter>200 then
begin
465,7 → 461,8
FMode := PLAYER_MODE_DEAD_VANISHED;
Visible := false;
end;
end else if FMode=PLAYER_MODE_DEAD_VANISHED then
end
else if FMode=PLAYER_MODE_DEAD_VANISHED then
begin
if FCounter>1500 then
begin
474,7 → 471,8
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
end;
end else if FMode=PLAYER_MODE_FLYAWAY then
end
else if FMode=PLAYER_MODE_FLYAWAY then
begin
// FUT: "Wusch" sound?
X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
486,7 → 484,8
MainForm.PlaySound('SceneMov', false);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
end;
end else if FMode = PLAYER_MODE_ENTER then
end
else if FMode = PLAYER_MODE_ENTER then
begin
X := X + MoveCount*(300/1000);
if X > 19 then FMode := PLAYER_MODE_NORMAL;
513,7 → 512,8
begin
if not (doFullScreen in DXDraw.Options) then StoreWindow;
DXDraw.Options := DXDraw.Options + [doFullScreen];
end else
end
else
begin
if doFullScreen in DXDraw.Options then RestoreWindow;
DXDraw.Options := DXDraw.Options - [doFullScreen];
557,7 → 557,7
 
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
if (Sprite is TEnemy) and not (Sprite is TEnemyTama) then
begin
TEnemy(Sprite).Hit;
Dead;
697,9 → 697,9
if X<-Width then Dead;
end;
 
procedure TEnemy.Hit;
procedure TEnemy.Hit(AHitStrength: integer = 1);
begin
Dec(FLife);
Dec(FLife, AHitStrength);
if FLife<=0 then
begin
Collisioned := False;
711,12 → 711,15
 
procedure TEnemy.HitEnemy(ADead: Boolean);
begin
if ADead then MainForm.PlaySound('Explosion', False);
if ADead then
MainForm.PlaySound('Explosion', False)
else
MainForm.PlaySound('Hit', False);
end;
 
constructor TEnemyUFO.Create(AParent: TSprite);
constructor TEnemyUFO.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-disk');
Width := Image.Width;
Height := Image.Height;
723,27 → 726,27
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := DEFAULT_ANIMSPEED;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
constructor TEnemy.Create(AParent: TSprite);
constructor TEnemy.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
dec(mainform.FRestEnemys);
inc(ec);
FLife := ALifes;
inc(EnemyCounter);
end;
 
destructor TEnemy.Destroy;
begin
inherited Destroy;
dec(ec);
dec(EnemyCounter);
end;
 
procedure TEnemyUFO.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
754,9 → 757,9
AnimLooped := False;
AnimSpeed := DEFAULT_ANIMSPEED;
AnimPos := 0;
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
781,7 → 784,8
end;
FOldTamaTime := FCounter;
end;
end else if FMode=2 then
end
else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
791,9 → 795,10
 
procedure TEnemyUFO2.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
804,16 → 809,16
AnimLooped := False;
AnimSpeed := DEFAULT_ANIMSPEED;
AnimPos := 0;
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
constructor TEnemyUFO2.Create(AParent: TSprite);
constructor TEnemyUFO2.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-disk2');
Width := Image.Width;
Height := Image.Height;
820,7 → 825,6
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := DEFAULT_ANIMSPEED;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyUFO.DoMove(MoveCount: Integer);
831,7 → 835,8
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
end else if FMode=2 then
end
else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
839,9 → 844,9
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker.Create(AParent: TSprite);
constructor TEnemyAttacker.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
Width := Image.Width;
Height := Image.Height;
849,14 → 854,14
AnimLooped := True;
AnimSpeed := DEFAULT_ANIMSPEED;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyAttacker.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
867,9 → 872,9
AnimLooped := False;
AnimSpeed := DEFAULT_ANIMSPEED;
AnimPos := 0;
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
881,7 → 886,8
begin
X := X - MoveCount*(300/1000)-FCounter div 128;
if X < -Width then Dead;
end else if FMode=2 then
end
else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
889,9 → 895,9
inc(FCounter, MoveCount);
end;
 
constructor TEnemyBoss.Create(AParent: TSprite);
constructor TEnemyBoss.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-boss');
Width := Image.Width;
Height := Image.Height;
902,7 → 908,6
AnimSpeed := DEFAULT_ANIMSPEED;
PixelCheck := True;
Collisioned := False;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
MainForm.FBossLife := FLife;
waiter1 := 0;
waiter2 := 0;
910,17 → 915,18
 
procedure TEnemyBoss.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 100000);
BossExists := false;
dec(MainForm.FBossLife);
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
dec(MainForm.FBossLife);
end;
940,7 → 946,8
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
end
else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
959,7 → 966,8
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
end
else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
969,7 → 977,8
FTamaT := 0;
end;
end;
end else if FMode=2 then
end
else if FMode=2 then
begin
inc(waiter1);
if waiter1 = 3 then
991,16 → 1000,17
FMode := 3;
end;
end;
end else if FMode=3 then
end
else if FMode=3 then
begin
if FCounter>4000 then dead;
if FCounter>4000 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker2.Create(AParent: TSprite);
constructor TEnemyAttacker2.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
Width := Image.Width;
Height := Image.Height;
1008,14 → 1018,14
AnimLooped := True;
AnimSpeed := DEFAULT_ANIMSPEED;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 5000);
1026,9 → 1036,9
AnimLooped := False;
AnimSpeed := DEFAULT_ANIMSPEED;
AnimPos := 0;
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
1047,7 → 1057,8
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
end
else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
1066,7 → 1077,8
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
end
else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
1076,7 → 1088,8
FTamaT := 0;
end;
end;
end else if FMode=2 then
end
else if FMode=2 then
begin
if FCounter>200 then Dead;
end;
1085,9 → 1098,10
 
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(ADead);
 
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 1;
FCounter := 0;
Inc(MainForm.FScore, 5000);
1098,9 → 1112,9
AnimLooped := False;
AnimSpeed := DEFAULT_ANIMSPEED;
AnimPos := 0;
end else
end
else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
1124,7 → 1138,8
end;
FOldTamaTime := FCounter;
end;
end else if FMode=1 then
end
else if FMode=1 then
begin
if FCounter>200 then Dead;
end;
1131,9 → 1146,9
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker3.Create(AParent: TSprite);
constructor TEnemyAttacker3.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
Width := Image.Width;
Height := Image.Height;
1141,7 → 1156,6
AnimLooped := True;
AnimSpeed := DEFAULT_ANIMSPEED;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
function TMainForm.SoundKarte: boolean;
1203,6 → 1217,8
spriteengine := tdxspriteengine.create(self);
spriteengine.DXDraw := dxdraw;
 
InitializeCriticalSection(TimerCS);
 
{ Ende VCL-Ersatz }
 
Application.Title := 'SpaceMission '+ProgramVersion;
1254,7 → 1270,9
begin
GamePause.Checked := not GamePause.Checked;
DXTimer.Enabled := not GamePause.Checked;
if GamePause.Checked then PauseMusic(FMusic) else
if GamePause.Checked then
PauseMusic(FMusic)
else
ResumeMusic(FMusic);
end;
 
1457,7 → 1475,8
begin
BorderStyle := bsNone;
DXDraw.Cursor := crNone;
end else
end
else
begin
BorderStyle := bsSingle;
DXDraw.Cursor := crDefault;
1509,6 → 1528,8
 
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
EnterCriticalSection(TimerCS);
try
if StatusMusic(FMusic) = 'stopped' then
PlayMusic(FMusic); {...}
if crash then
1536,7 → 1557,10
FNextScene := gsNone;
end;
DXDraw.Flip;
finally
LeaveCriticalSection(TimerCS);
end;
end;
 
procedure TMainForm.BlinkStart;
begin
1549,6 → 1573,7
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
try
if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
else INIDatei.WriteBool('Settings', 'Music', false);
if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
1561,8 → 1586,10
if FInterval = giMittel then INIDatei.WriteInteger('Settings', 'Speed', 2);
if FInterval = giSchwer then INIDatei.WriteInteger('Settings', 'Speed', 3);
if FInterval = giMaster then INIDatei.WriteInteger('Settings', 'Speed', 4);
finally
INIDatei.Free;
end;
end;
 
procedure TMainForm.LoadOptions;
var
1569,6 → 1596,7
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
try
optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
1593,7 → 1621,9
FInterval := giMaster;
Master.checked := true;
end;
finally
INIDatei.Free;
end;
WriteOptions;
end;
 
1658,8 → 1688,11
DXDraw.UpdatePalette;
ChangePalette := True;
end;
end else
end
else
begin
Sleep(Time);
end;
for i := 0 to 4 do
begin
DXDraw.Surface.Fill(c);
1717,7 → 1750,7
NewLevel(FLevel);
BossExists := false;
PlayMusic(mtGame);
FEnemyAdventPos := 1;
FEnemyAdventPos := 0;
FFrame := -4;
PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine);
with TBackground.Create(SpriteEngine.Engine) do
1859,18 → 1892,18
end;
 
procedure TMainForm.DeleteArray();
var
i: integer;
begin
for i := Low(EnemyAdventTable) to High(EnemyAdventTable) do
SetLength(EnemyAdventTable, 0);
FRestEnemies := 0;
end;
 
const
ADDITIONAL_ENEMIES_PER_LEVEL = 75;
 
function GetLevelFileName(lev: integer): string;
begin
EnemyAdventTable[i].spriteClass := TNothing;
EnemyAdventTable[i].x := 0;
EnemyAdventTable[i].y := 0;
EnemyAdventTable[i].lifes := 0;
result := FDirectory+'Levels\Level '+inttostr(lev)+'.lev';
end;
FRestEnemys := 0;
end;
 
procedure TMainForm.NewLevel(lev: integer);
resourcestring
1879,116 → 1912,112
act: integer;
filex: textfile;
ergebniss: string;
Enemies: array[1..27] of TEnemyClass;
e: TEnemyAdvent;
begin
DeleteArray;
if FMenuItem = 2 then
begin
enemys[1] := TEnemyAttacker;
enemys[2] := TEnemyMeteor;
enemys[3] := TEnemyUFO;
enemys[4] := TEnemyAttacker;
enemys[5] := TEnemyMeteor;
enemys[6] := TEnemyUFO;
enemys[7] := TEnemyAttacker;
enemys[8] := TEnemyMeteor;
enemys[9] := TEnemyUFO;
enemys[10] := TEnemyAttacker;
enemys[11] := TEnemyMeteor;
enemys[12] := TEnemyUFO;
enemys[13] := TEnemyAttacker;
enemys[14] := TEnemyMeteor;
enemys[15] := TEnemyUFO;
enemys[16] := TEnemyAttacker3;
enemys[17] := TEnemyAttacker;
enemys[18] := TEnemyMeteor;
enemys[19] := TEnemyUFO;
enemys[20] := TEnemyUFO2;
enemys[21] := TEnemyAttacker;
enemys[22] := TEnemyMeteor;
enemys[23] := TEnemyUFO;
enemys[24] := TEnemyAttacker2;
enemys[25] := TEnemyMeteor;
enemys[26] := TEnemyUFO;
enemys[27] := TEnemyAttacker;
Enemies[1] := TEnemyAttacker;
Enemies[2] := TEnemyMeteor;
Enemies[3] := TEnemyUFO;
Enemies[4] := TEnemyAttacker;
Enemies[5] := TEnemyMeteor;
Enemies[6] := TEnemyUFO;
Enemies[7] := TEnemyAttacker;
Enemies[8] := TEnemyMeteor;
Enemies[9] := TEnemyUFO;
Enemies[10] := TEnemyAttacker;
Enemies[11] := TEnemyMeteor;
Enemies[12] := TEnemyUFO;
Enemies[13] := TEnemyAttacker;
Enemies[14] := TEnemyMeteor;
Enemies[15] := TEnemyUFO;
Enemies[16] := TEnemyAttacker3;
Enemies[17] := TEnemyAttacker;
Enemies[18] := TEnemyMeteor;
Enemies[19] := TEnemyUFO;
Enemies[20] := TEnemyUFO2;
Enemies[21] := TEnemyAttacker;
Enemies[22] := TEnemyMeteor;
Enemies[23] := TEnemyUFO;
Enemies[24] := TEnemyAttacker2;
Enemies[25] := TEnemyMeteor;
Enemies[26] := TEnemyUFO;
Enemies[27] := TEnemyAttacker;
randomize;
for act := 1 to lev*75-1 do
FRestEnemies := lev*ADDITIONAL_ENEMIES_PER_LEVEL+1;
SetLength(EnemyAdventTable, FRestEnemies);
for act := 0 to lev*ADDITIONAL_ENEMIES_PER_LEVEL-1 do
begin
inc(FRestEnemys);
EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1];
if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1]; {O_o}
EnemyAdventTable[act].x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
EnemyAdventTable[act].y := random(dxdraw.surfaceheight);
if (EnemyAdventTable[act].spriteClass <> TEnemyMeteor) and (EnemyAdventTable[act].spriteClass <> TEnemyAttacker2) then EnemyAdventTable[act].lifes := random(lev)+1;
if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].lifes := random(6)+1{O_o};
e.spriteClass := Enemies[min(random(lev+2)+1, High(Enemies))];
if e.spriteClass = TEnemyAttacker2 then
begin
e.spriteClass := Enemies[min(random(lev+2)+1, High(Enemies))]; {O_o}
end;
EnemyAdventTable[lev*75].spriteClass := TEnemyBoss;
EnemyAdventTable[lev*75].x := lev*75*30{O_o} div lev;
EnemyAdventTable[lev*75].y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
EnemyAdventTable[lev*75].lifes := lev*5;
inc(FRestEnemys);
e.x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
e.y := random(dxdraw.surfaceheight);
if e.spriteClass = TEnemyAttacker2 then
begin
e.lifes := random(6)+1{O_o};
end
else
begin
enemys[1] := TEnemyAttacker;
enemys[2] := TEnemyAttacker2;
enemys[3] := TEnemyAttacker3;
enemys[4] := TEnemyMeteor;
enemys[5] := TEnemyUFO;
enemys[6] := TEnemyUFO2;
enemys[7] := TEnemyBoss;
if fileexists(FDirectory+'Levels\Level '+inttostr(lev)+'.lev') then
e.lifes := random(lev)+1;
end;
 
EnemyAdventTable[act] := e;
end;
e.spriteClass := TEnemyBoss;
e.x := lev*75*30{O_o} div lev;
e.y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
e.lifes := lev*5;
EnemyAdventTable[lev*ADDITIONAL_ENEMIES_PER_LEVEL] := e;
end
else
begin
levact := 0;
assignfile(filex, FDirectory+'Levels\Level '+inttostr(lev)+'.lev');
Enemies[1] := TEnemyAttacker;
Enemies[2] := TEnemyAttacker2;
Enemies[3] := TEnemyAttacker3;
Enemies[4] := TEnemyMeteor;
Enemies[5] := TEnemyUFO;
Enemies[6] := TEnemyUFO2;
Enemies[7] := TEnemyBoss;
if fileexists(GetLevelFileName(lev)) then
begin
assignfile(filex, GetLevelFileName(lev));
reset(filex);
try
readln(filex, ergebniss);
Assert(ergebniss = '; SpaceMission '+FCompVersion);
readln(filex, ergebniss);
Assert(ergebniss = '; LEV-File');
 
readln(filex); // Länge der Karte
 
while not seekEoF(filex) do
begin
if levact = 0 then
begin
readln(filex, ergebniss);
if ergebniss <> '; SpaceMission '+FCompVersion then
begin
showmessage(Format(LNG_LEVEL_INVALID, [lev]));
application.terminate;
exit;
end;
e.spriteClass := Enemies[strtoint(ergebniss)];
readln(filex, ergebniss);
if ergebniss <> '; LEV-File' then
begin
showmessage(Format(LNG_LEVEL_INVALID, [lev]));
application.terminate;
exit;
end;
readln(filex);
end;
inc(levact);
e.x := strtoint(ergebniss);
readln(filex, ergebniss);
if levact = 5 then levact := 1;
if levact = 1 then
begin
inc(pos[levact]);
inc(FRestEnemys);
EnemyAdventTable[pos[levact]].spriteClass := enemys[strtoint(ergebniss)];
e.y := strtoint(ergebniss);
readln(filex, ergebniss);
e.lifes := strtoint(ergebniss);
 
inc(FRestEnemies);
SetLength(EnemyAdventTable, FRestEnemies);
EnemyAdventTable[FRestEnemies-1] := e;
end;
if levact = 2 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].x := strtoint(ergebniss);
except
showmessage(Format(LNG_LEVEL_INVALID, [lev]));
DeleteArray;
end;
if levact = 3 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].y := strtoint(ergebniss);
end;
if levact = 4 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].lifes := strtoint(ergebniss);
end;
end;
closefile(filex);
end;
end;
Assert(FRestEnemies = Length(EnemyAdventTable));
end;
 
procedure TMainForm.SceneTitle;
2048,7 → 2077,7
if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
begin
FLevel := 1;
if ((FMenuItem=1) and (fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev')=false)) or ((FMenuItem=2) and (FLevel > 20)) then
if ((FMenuItem=1) and not fileexists(GetLevelFileName(FLevel))) or ((FMenuItem=2) and (FLevel > 20)) then
begin
//PlaySound('Frage', False);
exit;
2065,27 → 2094,29
var
Enemy: TSprite;
begin
if FInterval = giLeicht then SpriteEngine.Move(conleicht);
if FInterval = giMittel then SpriteEngine.Move(conmittel);
if FInterval = giSchwer then SpriteEngine.Move(conschwer);
if FInterval = giMaster then SpriteEngine.Move(conmaster);
case FInterval of
giMittel: SpriteEngine.Move(conleicht);
giLeicht: SpriteEngine.Move(conmittel);
giSchwer: SpriteEngine.Move(conschwer);
giMaster: SpriteEngine.Move(conmaster);
end;
SpriteEngine.Dead;
while (Low(EnemyAdventTable)<=FEnemyAdventPos) and
while (FEnemyAdventPos >= Low(EnemyAdventTable)) and
(FEnemyAdventPos<=High(EnemyAdventTable)) and
((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and
(FRestEnemys>0) do
(FRestEnemies > 0) do
begin
if EnemyAdventTable[FEnemyAdventPos].spriteClass <> TNothing then
begin
Dec(FRestEnemies);
with EnemyAdventTable[FEnemyAdventPos] do
begin
Enemy := spriteClass.Create(SpriteEngine.Engine);
Enemy := spriteClass.Create(SpriteEngine.Engine, lifes);
Enemy.x := dxdraw.surfacewidth;
//Enemy.y := y;
if y <> 0 then Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
else Enemy.y := 0;
if y <> 0 then
Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
else
Enemy.y := 0;
end;
end;
Inc(FEnemyAdventPos);
end;
Inc(FFrame);
2143,16 → 2174,16
end;}
if BossExists and (FBossLife>0) then
begin
if (FRestEnemys>0) then
if (FRestEnemies>0) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-81, 'Boss: ' + IntToStr(FBossLife));
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemies));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemies));
end;
if (FRestEnemys<1) then
if (FRestEnemies<1) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
2160,12 → 2191,12
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
end;
end;
if (FRestEnemys>0) and not Bossexists then
if (FRestEnemies>0) and not Bossexists then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemies));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemies));
end;
Release;
end;
2178,8 → 2209,7
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!');
DXDraw.Surface.Canvas.Release;
end;
if FRestEnemys<0 then FRestEnemys := 0; //Muss das sein?
if (Ec=0) and (FRestEnemys=0){ and (SpielerFliegtFort = false)}
if (EnemyCounter=0) and (FRestEnemies=0){ and (SpielerFliegtFort = false)}
and ((BossExists and (FBossLife=0)) or not BossExists) then
begin
DXDraw.Surface.Canvas.Font.Color := clGreen;
2351,8 → 2381,9
 
procedure TEnemyMeteor.HitEnemy(ADead: Boolean);
begin
inherited HitEnemy(False);
 
if ADead then Collisioned := True;
MainForm.PlaySound('Hit', False);
end;
 
{procedure TMainForm.StopMusic;
2377,9 → 2408,9
MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
constructor TEnemyMeteor.Create(AParent: TSprite);
constructor TEnemyMeteor.Create(AParent: TSprite; ALifes: integer);
begin
inherited Create(AParent);
inherited Create(AParent, ALifes);
Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
Width := Image.Width;
Height := Image.Height;
2399,7 → 2430,7
FLife := Lives;
FLevel := 1; // ???
FScore := 0;
ec := 0;
EnemyCounter := 0;
StartScene(gsMain);
PlayMusic(mtGame);
end;
2434,8 → 2465,11
 
procedure TMainForm.FormShow(Sender: TObject);
begin
if Assigned(SplashForm) then
begin
SplashForm.Hide;
SplashForm.Free;
FreeAndNil(SplashForm);
end;
 
dxtimer.Enabled := true;
dxtimer.ActiveOnly := true;
2464,13 → 2498,14
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
imagelist.free;
spriteengine.free;
imagelist.Free;
spriteengine.Free;
dxdraw.Free;
wavelist.free;
dxsound.free;
//dxinput.free;
wavelist.Free;
dxsound.Free;
//dxinput.Free;
dxtimer.Free;
DeleteCriticalSection(TimerCS);
end;
 
end.