5,7 → 5,7 |
uses |
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs, |
StdCtrls, ExtCtrls, Menus, SplInfo, DIB, DXClass, DXSprite, DXDraws, DXInput, |
DXSounds, PJVersionInfo, INIFiles, shellapi, wininet; |
DXSounds, INIFiles, ShellAPI, wininet; |
|
type |
TGameScene = ( |
20,7 → 20,8 |
TGameInterval = ( |
giMittel, |
giLeicht, |
giSchwer |
giSchwer, |
giMaster |
); |
|
TMusicTrack = ( |
43,158 → 44,6 |
sfLevIntro |
);} |
|
TMainForm = class(TDXForm) |
MainMenu: TMainMenu; |
Spiel: TMenuItem; |
GameStart: TMenuItem; |
GamePause: TMenuItem; |
Beenden: TMenuItem; |
Einstellungen: TMenuItem; |
OptionFullScreen: TMenuItem; |
OptionMusic: TMenuItem; |
Leer2: TMenuItem; |
Leer4: TMenuItem; |
Hilfe: TMenuItem; |
OptionSound: TMenuItem; |
Mitarbeiter: TMenuItem; |
Leer3: TMenuItem; |
Spielstand: TMenuItem; |
Leer5: TMenuItem; |
Neustart: TMenuItem; |
OptionBreitbild: TMenuItem; |
Spielgeschwindigkeit: TMenuItem; |
Leicht: TMenuItem; |
Mittel: TMenuItem; |
Schwer: TMenuItem; |
Informationen: TMenuItem; |
Leer6: TMenuItem; |
Leer1: TMenuItem; |
Cheat: TMenuItem; |
AufUpdatesprfen1: TMenuItem; |
procedure DXDrawFinalize(Sender: TObject); |
procedure DXDrawInitialize(Sender: TObject); |
procedure FormCreate(Sender: TObject); |
procedure DXTimerTimer(Sender: TObject; LagCount: Integer); |
procedure DXTimerActivate(Sender: TObject); |
procedure DXTimerDeactivate(Sender: TObject); |
procedure OptionFullScreenClick(Sender: TObject); |
procedure DXDrawInitializing(Sender: TObject); |
procedure GameStartClick(Sender: TObject); |
procedure GamePauseClick(Sender: TObject); |
procedure BeendenClick(Sender: TObject); |
procedure OptionSoundClick(Sender: TObject); |
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); |
procedure OptionMusicClick(Sender: TObject); |
procedure MitarbeiterClick(Sender: TObject); |
procedure SpielstandClick(Sender: TObject); |
procedure NeustartClick(Sender: TObject); |
procedure OptionBreitbildClick(Sender: TObject); |
procedure LeichtClick(Sender: TObject); |
procedure MittelClick(Sender: TObject); |
procedure SchwerClick(Sender: TObject); |
procedure FormShow(Sender: TObject); |
procedure InformationenClick(Sender: TObject); |
procedure CheatClick(Sender: TObject); |
procedure FormClose(Sender: TObject; var Action: TCloseAction); |
procedure FormDestroy(Sender: TObject); |
procedure AufUpdatesprfen1Click(Sender: TObject); |
private |
FInterval: TGameInterval; |
FScene: TGameScene; |
FMusic: TMusicTrack; |
FBlink: DWORD; |
FBlinkTime: DWORD; |
FFrame, FAngle, FCounter, FEnemyAdventPos: Integer; |
procedure StartScene(Scene: TGameScene); |
procedure EndScene; |
procedure BlinkStart; |
procedure BlinkUpdate; |
procedure StartSceneTitle; |
procedure SceneTitle; |
procedure EndSceneTitle; |
procedure StartSceneMain; |
procedure SceneMain; |
procedure EndSceneMain; |
procedure StartSceneGameOver; |
procedure SceneGameOver; |
procedure EndSceneGameOver; |
procedure StartSceneWin; |
procedure SceneWin; |
procedure EndSceneWin; |
procedure StartSceneNewLevel; |
procedure SceneNewLevel; |
procedure EndSceneNewLevel; |
public |
FDirectory: string; |
FEngineVersion: string; |
FNextScene: TGameScene; |
FScore: Integer; |
FNotSave: boolean; |
FLife: integer; |
FLevel: integer; |
FMenuItem: integer; |
FBossLife: integer; |
FRestEnemys: integer; |
FCheat: boolean; |
{ VCL-Ersatz } |
dxdraw: TDxDraw; |
imagelist: TDxImageList; |
spriteengine: tdxspriteengine; |
dxsound: tdxsound; |
wavelist: tdxwavelist; |
dxinput: tdxinput; |
dxtimer: tdxtimer; |
versioninfo: tpjversioninfo; |
{ Level-Routinen } |
procedure NewLevel(lev: integer); |
procedure DeleteArray; |
{ MCI-Routinen } |
function StatusMusic(Name: TMusicTrack): string; |
procedure PlayMusic(Name: TMusicTrack); |
//procedure StopMusic(Name: TMusicTrack); |
procedure PauseMusic(Name: TMusicTrack); |
procedure ResumeMusic(Name: TMusicTrack); |
procedure DestroyMusic(Name: TMusicTrack); |
procedure OpenMusic(Name: TMusicTrack); |
{ Sound-Routinen } |
function SoundKarte: boolean; |
procedure PlaySound(Name: string; Wait: Boolean); |
{ Initialisiations-Routinen } |
procedure DXInit; |
procedure SoundInit; |
procedure MusicInit; |
{ Einstellungs-Routinen } |
procedure LoadOptions; |
procedure WriteOptions; |
{ Farb-Routinen } |
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad; |
procedure PalleteAnim(Col: TRGBQuad; Time: Integer); |
end; |
|
var |
MainForm: TMainForm; |
|
const |
conleicht = 650 div 60; |
conmittel = 1000 div 60; |
conschwer = 1350 div 60; |
lives = 6; |
FCompVersion = '1.0'; |
|
implementation |
|
uses |
SplSplash, SplSpeicherung, SplText, SplCheat; |
|
const |
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!'; |
|
{$R *.DFM} |
|
{$R WindowsXP.res} |
|
type |
|
TBackground = class(TBackgroundSprite) |
private |
FSpeed: Double; |
229,6 → 78,7 |
procedure DoMove(MoveCount: Integer); override; |
public |
constructor Create(AParent: TSprite); override; |
procedure FlyAway; |
end; |
|
TTamaSprite = class(TImageSprite) |
249,7 → 99,7 |
FMode: Integer; |
procedure Hit; virtual; |
protected |
procedure HitEnemy(Deaded: Boolean); virtual; |
procedure HitEnemy(ADead: Boolean); virtual; |
public |
constructor Create(AParent: TSprite); override; |
destructor Destroy; override; |
267,7 → 117,7 |
TEnemyMeteor= class(TEnemy) |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
275,7 → 125,7 |
TEnemyUFO = class(TEnemy) |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
287,7 → 137,7 |
FOldTamaTime: Integer; |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
295,7 → 145,7 |
TEnemyAttacker = class(TEnemy) |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
308,7 → 158,7 |
FPutTama: Boolean; |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
320,7 → 170,7 |
FOldTamaTime: Integer; |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
334,28 → 184,180 |
waiter1, waiter2: integer; |
protected |
procedure DoMove(MoveCount: Integer); override; |
procedure HitEnemy(Deaded: Boolean); override; |
procedure HitEnemy(ADead: Boolean); override; |
public |
constructor Create(AParent: TSprite); override; |
end; |
|
TNoting = class(TImageSprite); |
TNothing = class(TImageSprite); |
|
TSpriteClass = class of TSprite; |
|
TEnemyAdvent = record |
c: TSpriteClass; |
spriteClass: TSpriteClass; |
x: extended; |
y: extended; |
l: integer; |
lifes: integer; |
end; |
|
TMainForm = class(TDXForm) |
MainMenu: TMainMenu; |
Spiel: TMenuItem; |
GameStart: TMenuItem; |
GamePause: TMenuItem; |
Beenden: TMenuItem; |
Einstellungen: TMenuItem; |
OptionFullScreen: TMenuItem; |
OptionMusic: TMenuItem; |
Leer2: TMenuItem; |
Leer4: TMenuItem; |
Hilfe: TMenuItem; |
OptionSound: TMenuItem; |
Mitarbeiter: TMenuItem; |
Leer3: TMenuItem; |
Spielstand: TMenuItem; |
Leer5: TMenuItem; |
Neustart: TMenuItem; |
OptionBreitbild: TMenuItem; |
Spielgeschwindigkeit: TMenuItem; |
Leicht: TMenuItem; |
Mittel: TMenuItem; |
Schwer: TMenuItem; |
Informationen: TMenuItem; |
Leer6: TMenuItem; |
Leer1: TMenuItem; |
Cheat: TMenuItem; |
CheckUpdates: TMenuItem; |
Master: TMenuItem; |
procedure DXDrawFinalize(Sender: TObject); |
procedure DXDrawInitialize(Sender: TObject); |
procedure FormCreate(Sender: TObject); |
procedure DXTimerTimer(Sender: TObject; LagCount: Integer); |
procedure DXTimerActivate(Sender: TObject); |
procedure DXTimerDeactivate(Sender: TObject); |
procedure OptionFullScreenClick(Sender: TObject); |
procedure DXDrawInitializing(Sender: TObject); |
procedure GameStartClick(Sender: TObject); |
procedure GamePauseClick(Sender: TObject); |
procedure BeendenClick(Sender: TObject); |
procedure OptionSoundClick(Sender: TObject); |
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); |
procedure OptionMusicClick(Sender: TObject); |
procedure MitarbeiterClick(Sender: TObject); |
procedure SpielstandClick(Sender: TObject); |
procedure NeustartClick(Sender: TObject); |
procedure OptionBreitbildClick(Sender: TObject); |
procedure LeichtClick(Sender: TObject); |
procedure MittelClick(Sender: TObject); |
procedure SchwerClick(Sender: TObject); |
procedure FormShow(Sender: TObject); |
procedure InformationenClick(Sender: TObject); |
procedure CheatClick(Sender: TObject); |
procedure FormClose(Sender: TObject; var Action: TCloseAction); |
procedure FormDestroy(Sender: TObject); |
procedure CheckUpdatesClick(Sender: TObject); |
procedure MasterClick(Sender: TObject); |
private |
ProgrammGestartet: boolean; |
FInterval: TGameInterval; |
FScene: TGameScene; |
FMusic: TMusicTrack; |
FBlink: DWORD; |
FBlinkTime: DWORD; |
FFrame, FAngle, FCounter, FEnemyAdventPos: Integer; |
PlayerSprite: TPlayerSprite; |
procedure StartScene(Scene: TGameScene); |
procedure EndScene; |
procedure BlinkStart; |
procedure BlinkUpdate; |
procedure StartSceneTitle; |
procedure SceneTitle; |
procedure EndSceneTitle; |
procedure StartSceneMain; |
procedure SceneMain; |
procedure EndSceneMain; |
procedure StartSceneGameOver; |
procedure SceneGameOver; |
procedure EndSceneGameOver; |
procedure StartSceneWin; |
procedure SceneWin; |
procedure EndSceneWin; |
procedure StartSceneNewLevel; |
procedure SceneNewLevel; |
procedure EndSceneNewLevel; |
public |
FNextScene: TGameScene; |
FScore: Integer; |
FNotSave: boolean; |
FLife: integer; |
FLevel: integer; |
FMenuItem: integer; |
FBossLife: integer; |
FRestEnemys: integer; |
FCheat: boolean; |
{ VCL-Ersatz } |
dxdraw: TDxDraw; |
imagelist: TDxImageList; |
spriteengine: tdxspriteengine; |
dxsound: tdxsound; |
wavelist: tdxwavelist; |
dxinput: tdxinput; |
dxtimer: tdxtimer; |
{ Level-Routinen } |
procedure NewLevel(lev: integer); |
procedure DeleteArray; |
{ MCI-Routinen } |
function StatusMusic(Name: TMusicTrack): string; |
procedure PlayMusic(Name: TMusicTrack); |
//procedure StopMusic(Name: TMusicTrack); |
procedure PauseMusic(Name: TMusicTrack); |
procedure ResumeMusic(Name: TMusicTrack); |
procedure DestroyMusic(Name: TMusicTrack); |
procedure OpenMusic(Name: TMusicTrack); |
{ Sound-Routinen } |
function SoundKarte: boolean; |
procedure PlaySound(Name: string; Wait: Boolean); |
{ Initialisiations-Routinen } |
procedure DXInit; |
procedure SoundInit; |
procedure MusicInit; |
{ Einstellungs-Routinen } |
procedure LoadOptions; |
procedure WriteOptions; |
{ Farb-Routinen } |
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad; |
procedure PalleteAnim(Col: TRGBQuad; Time: Integer); |
end; |
|
var |
EnemyAdventTable: array[0..9999] of TEnemyAdvent; |
MainForm: TMainForm; |
|
const |
conleicht = 650 div 60; // 10 |
conmittel = 1000 div 60; // 16 |
conschwer = 1350 div 60; // 22 |
conmaster = 2000 div 60; // 33 |
lives = 6; |
|
implementation |
|
uses |
SplSplash, SplSpeicherung, SplText, SplCheat, Global; |
|
resourcestring |
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!'; |
|
{$R *.DFM} |
|
{$R WindowsXP.res} |
|
var // TODO: irgendwo hinpacken. irgendwo!!! |
EnemyAdventTable: array[0..9999] of TEnemyAdvent; // TODO: dyn |
Crash2, ec: integer; |
BossExists, Crash, crashsound, SpielerFliegtFort: boolean; |
BossExists, Crash, crashsound: boolean; |
pos: array[1..4] of integer; |
enemys: array[1..27] of TSpriteClass; |
levact: integer; |
|
const |
DXInputButton = [isButton1, isButton2, isButton3, |
364,6 → 366,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; |
|
// TODO: Code komplett überarbeiten. Bessere Ableitungen machen |
|
constructor TPlayerSprite.Create(AParent: TSprite); |
begin |
inherited Create(AParent); |
376,7 → 387,7 |
AnimCount := Image.PatternCount; |
AnimLooped := True; |
AnimSpeed := 15/1000; |
FMode := 4; |
FMode := PLAYER_MODE_ENTER; |
end; |
|
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean); |
393,7 → 404,7 |
MainForm.PlaySound('Explosion', false); |
Collisioned := false; |
FCounter := 0; |
FMode := 1; |
FMode := PLAYER_MODE_DEAD; |
Done := false; |
Image := MainForm.ImageList.Items.Find('Explosion'); |
Width := Image.Width; |
416,10 → 427,11 |
end; |
|
procedure TPlayerSprite.DoMove(MoveCount: Integer); |
const |
WegduesKonstante = 1.75; |
begin |
inherited DoMove(MoveCount); |
if SpielerFliegtFort then FMode := 3; |
if FMode=0 then |
if FMode=PLAYER_MODE_NORMAL then |
begin |
if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount; |
if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount; |
445,15 → 457,15 |
end; |
end; |
Collision; |
end else if FMode=1 then |
end else if FMode=PLAYER_MODE_DEAD then |
begin |
if FCounter>200 then |
begin |
FCounter := 0; |
FMode := 2; |
FMode := PLAYER_MODE_DEAD_VANISHED; |
Visible := false; |
end; |
end else if FMode=2 then |
end else if FMode=PLAYER_MODE_DEAD_VANISHED then |
begin |
if FCounter>1500 then |
begin |
462,9 → 474,10 |
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300); |
Sleep(200); |
end; |
end else if FMode=3 then |
end else if FMode=PLAYER_MODE_FLYAWAY then |
begin |
X := X + MoveCount*(300/1000); |
// FUT: "Wusch" sound? |
X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante); |
if X > MainForm.DXDraw.Width+Width then |
begin |
Dead; |
473,14 → 486,19 |
MainForm.PlaySound('SceneMov', false); |
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300); |
end; |
end else if FMode=4 then |
end else if FMode = PLAYER_MODE_ENTER then |
begin |
X := X + MoveCount*(300/1000); |
if X > 19 then FMode := 0; |
if X > 19 then FMode := PLAYER_MODE_NORMAL; |
end; |
inc(FCounter, MoveCount); |
end; |
|
procedure TPlayerSprite.FlyAway; |
begin |
FMode := PLAYER_MODE_FLYAWAY; |
end; |
|
procedure TMainForm.DXInit; |
begin |
try |
691,9 → 709,9 |
HitEnemy(False); |
end; |
|
procedure TEnemy.HitEnemy(Deaded: Boolean); |
procedure TEnemy.HitEnemy(ADead: Boolean); |
begin |
if Deaded then MainForm.PlaySound('Explosion', False); |
if ADead then MainForm.PlaySound('Explosion', False); |
end; |
|
constructor TEnemyUFO.Create(AParent: TSprite); |
705,7 → 723,7 |
AnimCount := Image.PatternCount; |
AnimLooped := True; |
AnimSpeed := 15/1000; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
end; |
|
constructor TEnemy.Create(AParent: TSprite); |
721,9 → 739,9 |
dec(ec); |
end; |
|
procedure TEnemyUFO.HitEnemy(Deaded: Boolean); |
procedure TEnemyUFO.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 2; |
771,9 → 789,9 |
inc(FCounter, MoveCount); |
end; |
|
procedure TEnemyUFO2.HitEnemy(Deaded: Boolean); |
procedure TEnemyUFO2.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 2; |
802,7 → 820,7 |
AnimCount := Image.PatternCount; |
AnimLooped := True; |
AnimSpeed := 15/1000; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
end; |
|
procedure TEnemyUFO.DoMove(MoveCount: Integer); |
831,12 → 849,12 |
AnimLooped := True; |
AnimSpeed := 15/1000; |
PixelCheck := True; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
end; |
|
procedure TEnemyAttacker.HitEnemy(Deaded: Boolean); |
procedure TEnemyAttacker.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 2; |
884,15 → 902,15 |
AnimSpeed := 15/1000; |
PixelCheck := True; |
Collisioned := False; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
MainForm.FBossLife := FLife; |
waiter1 := 0; |
waiter2 := 0; |
end; |
|
procedure TEnemyBoss.HitEnemy(Deaded: Boolean); |
procedure TEnemyBoss.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 2; |
990,12 → 1008,12 |
AnimLooped := True; |
AnimSpeed := 15/1000; |
PixelCheck := True; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
end; |
|
procedure TEnemyAttacker2.HitEnemy(Deaded: Boolean); |
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 2; |
1065,9 → 1083,9 |
inc(FCounter, MoveCount); |
end; |
|
procedure TEnemyAttacker3.HitEnemy(Deaded: Boolean); |
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean); |
begin |
if Deaded then |
if ADead then |
begin |
MainForm.PlaySound('Explosion', False); |
FMode := 1; |
1123,7 → 1141,7 |
AnimLooped := True; |
AnimSpeed := 15/1000; |
PixelCheck := True; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l; |
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes; |
end; |
|
function TMainForm.SoundKarte: boolean; |
1135,13 → 1153,9 |
var |
Ergebnis: string; |
daten: textfile; |
i: integer; |
punkt: integer; |
ok: boolean; |
begin |
{ Beginne VCL-Ersatz } |
versioninfo := tpjversioninfo.Create(self); |
|
dxtimer := tdxtimer.Create(self); |
dxtimer.Interval := 33; |
dxtimer.OnActivate := DXTimerActivate; |
1191,15 → 1205,7 |
|
{ Ende VCL-Ersatz } |
|
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; |
Application.Title := 'SpaceMission '+ProgramVersion; |
LoadOptions; |
DXInit; |
SoundInit; |
1211,7 → 1217,7 |
Reset(daten); |
ok := true; |
ReadLN(daten, Ergebnis); |
if Ergebnis <> '; SpaceMission '+mainform.FEngineVersion then ok := false; |
if Ergebnis <> '; SpaceMission '+ProgramVersion then ok := false; |
ReadLN(daten, Ergebnis); |
if ergebnis <> '; SAV-File' then ok := false; |
if not ok then |
1331,7 → 1337,7 |
Result := resStr; |
end; |
|
procedure TMainForm.AufUpdatesprfen1Click(Sender: TObject); |
procedure TMainForm.CheckUpdatesClick(Sender: TObject); |
var |
temp: string; |
begin |
1342,7 → 1348,7 |
end |
else |
begin |
if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> '1.1d' then |
if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> ProgramVersion then |
begin |
if Application.MessageBox('Eine neue Programmversion ist vorhanden. Möchten Sie diese jetzt herunterladen?', 'Information', MB_YESNO + MB_ICONASTERISK) = ID_YES then |
shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@spacemission'), '', '', sw_normal); |
1468,9 → 1474,6 |
DXTimer.Enabled := False; |
end; |
|
var |
ProgrammGestartet: boolean; |
|
procedure TMainForm.DXTimerActivate(Sender: TObject); |
begin |
Caption := Application.Title; |
1557,6 → 1560,7 |
if FInterval = giLeicht then INIDatei.WriteInteger('Settings', 'Speed', 1); |
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); |
INIDatei.Free; |
end; |
|
1584,6 → 1588,11 |
FInterval := giSchwer; |
Schwer.checked := true; |
end; |
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 4 then |
begin |
FInterval := giMaster; |
Master.checked := true; |
end; |
INIDatei.Free; |
WriteOptions; |
end; |
1704,7 → 1713,6 |
i, j: Integer;} |
begin |
sleep(500); |
SpielerFliegtFort := false; |
FCounter := 0; |
NewLevel(FLevel); |
BossExists := false; |
1711,7 → 1719,7 |
PlayMusic(mtGame); |
FEnemyAdventPos := 1; |
FFrame := -4; |
TPlayerSprite.Create(SpriteEngine.Engine); |
PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine); |
with TBackground.Create(SpriteEngine.Engine) do |
begin |
SetMapSize(1, 1); |
1854,20 → 1862,19 |
var |
i: integer; |
begin |
for i := 1 to 9999 do |
for i := Low(EnemyAdventTable) to High(EnemyAdventTable) do |
begin |
EnemyAdventTable[i].c := tnoting; |
EnemyAdventTable[i].spriteClass := TNothing; |
EnemyAdventTable[i].x := 0; |
EnemyAdventTable[i].y := 0; |
EnemyAdventTable[i].l := 0; |
EnemyAdventTable[i].lifes := 0; |
end; |
FRestEnemys := 0; |
end; |
|
var |
levact: integer; |
|
procedure TMainForm.NewLevel(lev: integer); |
resourcestring |
LNG_LEVEL_INVALID = 'Das Level Nr. %d ist ungültig!'+#13#10+'Das Programm wird beendet.'; |
var |
act: integer; |
filex: textfile; |
1907,17 → 1914,17 |
for act := 1 to lev*75-1 do |
begin |
inc(FRestEnemys); |
EnemyAdventTable[act].c := enemys[random(lev+2)+1]; |
if EnemyAdventTable[act].c = TEnemyAttacker2 then EnemyAdventTable[act].c := enemys[random(lev+2)+1]; {O_o} |
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].c <> TEnemyMeteor) and (EnemyAdventTable[act].c <> TEnemyAttacker2) then EnemyAdventTable[act].l := random(lev)+1; |
if EnemyAdventTable[act].c = TEnemyAttacker2 then EnemyAdventTable[act].l := random(6)+1{O_o}; |
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; |
EnemyAdventTable[lev*75].c := TEnemyBoss; |
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].l := lev*5; |
EnemyAdventTable[lev*75].lifes := lev*5; |
inc(FRestEnemys); |
end |
else |
1941,7 → 1948,7 |
readln(filex, ergebniss); |
if ergebniss <> '; SpaceMission '+FCompVersion then |
begin |
showmessage('Das Level '+inttostr(lev)+' ist ungültig!'+#13#10+'Das Programm wird beendet.'); |
showmessage(Format(LNG_LEVEL_INVALID, [lev])); |
application.terminate; |
exit; |
end; |
1948,7 → 1955,7 |
readln(filex, ergebniss); |
if ergebniss <> '; LEV-File' then |
begin |
showmessage('Das Level '+inttostr(lev)+' ist ungültig!'+#13#10+'Das Programm wird beendet.'); |
showmessage(Format(LNG_LEVEL_INVALID, [lev])); |
application.terminate; |
exit; |
end; |
1961,7 → 1968,7 |
begin |
inc(pos[levact]); |
inc(FRestEnemys); |
EnemyAdventTable[pos[levact]].c := enemys[strtoint(ergebniss)]; |
EnemyAdventTable[pos[levact]].spriteClass := enemys[strtoint(ergebniss)]; |
end; |
if levact = 2 then |
begin |
1976,7 → 1983,7 |
if levact = 4 then |
begin |
inc(pos[levact]); |
EnemyAdventTable[pos[levact]].l := strtoint(ergebniss); |
EnemyAdventTable[pos[levact]].lifes := strtoint(ergebniss); |
end; |
end; |
closefile(filex); |
2027,17 → 2034,18 |
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel'); |
Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2), '>'); |
end; |
if (FBlink div 300) mod 2=0 then |
{ if (FBlink div 300) mod 2=0 then |
begin |
Font.Color := clGreen; |
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste'); |
Font.Color := clLime; |
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste'); |
end; |
end; } |
BlinkUpdate; |
Release; |
end; |
if isButton1 in DXInput.States then |
// Weiter mit Leertaste oder Enter |
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 |
2060,6 → 2068,7 |
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 (Low(EnemyAdventTable)<=FEnemyAdventPos) and |
(FEnemyAdventPos<=High(EnemyAdventTable)) and |
2066,11 → 2075,11 |
((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and |
(FRestEnemys>0) do |
begin |
if EnemyAdventTable[FEnemyAdventPos].c <> TNoting then |
if EnemyAdventTable[FEnemyAdventPos].spriteClass <> TNothing then |
begin |
with EnemyAdventTable[FEnemyAdventPos] do |
begin |
Enemy := c.Create(SpriteEngine.Engine); |
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) |
2132,8 → 2141,10 |
Font.Color := clFuchsia; |
Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten)); |
end;} |
if BossExists and (FBossLife>0) and (FRestEnemys>0) then |
if BossExists and (FBossLife>0) then |
begin |
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(FRestEnemys)); |
2141,7 → 2152,7 |
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife)); |
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys)); |
end; |
if BossExists and (FBossLife>0) and (FRestEnemys<1) then |
if (FRestEnemys<1) then |
begin |
Font.Color := clGreen; |
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife)); |
2148,7 → 2159,8 |
Font.Color := clLime; |
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife)); |
end; |
if (FRestEnemys>0) and (Bossexists=false) then |
end; |
if (FRestEnemys>0) and not Bossexists then |
begin |
Font.Color := clGreen; |
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys)); |
2160,7 → 2172,7 |
end |
else |
begin |
DXDraw.Surface.Canvas.Font.Color := clGreen; |
DXDraw.Surface.Canvas.Font.Color := clGreen; // Grüne schrift bei gescheitert? FIXME |
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission gescheitert!'); |
DXDraw.Surface.Canvas.Font.Color := clLime; |
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!'); |
2167,7 → 2179,8 |
DXDraw.Surface.Canvas.Release; |
end; |
if FRestEnemys<0 then FRestEnemys := 0; //Muss das sein? |
if (Ec=0) and (FRestEnemys=0){ and (SpielerFliegtFort = false)} then |
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; |
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!'); |
2176,7 → 2189,7 |
DXDraw.Surface.Canvas.Release; |
Sleep(1); |
inc(FCounter); |
if FCounter>150{200} then SpielerFliegtFort := true; |
if FCounter>150{200} then PlayerSprite.FlyAway; |
end; |
end; |
end; |
2312,23 → 2325,38 |
procedure TMainForm.OptionMusicClick(Sender: TObject); |
begin |
OptionMusic.Checked := not OptionMusic.Checked; |
if OptionMusic.Checked then PlayMusic(FMusic) |
else DestroyMusic(FMusic); |
if OptionMusic.Checked then |
begin |
PlayMusic(FMusic) |
end |
else |
begin |
DestroyMusic(FMusic); |
end; |
WriteOptions; |
end; |
|
procedure TMainForm.MasterClick(Sender: TObject); |
begin |
master.checked := true; |
FInterval := giMaster; |
writeoptions; |
end; |
|
procedure TMainForm.MitarbeiterClick(Sender: TObject); |
resourcestring |
LNG_NOTFOUND = 'Die Datei "Texte\Mitwirkende.txt" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!'; |
const |
MitwirkendeTxt = 'Texte\Mitwirkende.txt'; |
begin |
if not fileexists(mainform.fdirectory+'Texte\Mitwirkende.txt') then |
if not fileexists(fdirectory+MitwirkendeTxt) then |
begin |
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; |
MessageDLG(Format(LNG_NOTFOUND, [MitwirkendeTxt]), mtWarning, [mbOK], 0); |
Exit; |
end; |
|
TextForm.memo1.lines.loadfromfile(FDirectory+MitwirkendeTxt); |
TextForm.ShowModal; |
end; |
|
procedure TEnemyMeteor.DoMove(MoveCount: Integer); |
2337,9 → 2365,9 |
if X < -Width then Dead; |
end; |
|
procedure TEnemyMeteor.HitEnemy(Deaded: Boolean); |
procedure TEnemyMeteor.HitEnemy(ADead: Boolean); |
begin |
if deaded then Collisioned := True; |
if ADead then Collisioned := True; |
MainForm.PlaySound('Hit', False); |
end; |
|
2431,7 → 2459,9 |
|
procedure TMainForm.InformationenClick(Sender: TObject); |
begin |
dxtimer.enabled := false; |
InfoForm.showmodal; |
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true; |
end; |
|
procedure TMainForm.CheatClick(Sender: TObject); |
2450,7 → 2480,6 |
|
procedure TMainForm.FormDestroy(Sender: TObject); |
begin |
versioninfo.free; |
imagelist.free; |
spriteengine.free; |
dxdraw.Free; |