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