Subversion Repositories spacemission

Compare Revisions

No changes between revisions

Regard whitespace Rev 2 → Rev 3

/SplCheat.dfm
File deleted
/SplSpeicherung.pas
File deleted
/SplText.pas
File deleted
/SplSplash.dfm
File deleted
/Compiler.bdsproj
File deleted
/SplText.dfm
File deleted
/SplSpeicherung.dfm
File deleted
/LevText.pas
File deleted
/SplInfo.pas
File deleted
/ComMain.pas
File deleted
/SplSplash.pas
File deleted
/LevText.dfm
File deleted
/SplMain.pas
File deleted
/SplInfo.dfm
File deleted
/ComMain.dfm
File deleted
/Compiler.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/Compiler.cfg
File deleted
/SplMain.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/Compiler.dof
File deleted
/Compiler.dpr
File deleted
/Compiler.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/SplCheat.pas
File deleted
/LevEdit.dpr
11,10 → 11,10
SysUtils,
MMSystem,
LevMain in 'LevMain.pas' {MainForm},
LevText in 'LevText.pas' {TextForm},
ComText in 'ComText.pas' {TextForm},
LevSplash in 'LevSplash.pas' {SplashForm},
LevSpeicherung in 'LevSpeicherung.pas' {SpeicherungForm},
SplInfo in 'SplInfo.pas' {InfoForm},
ComInfo in 'ComInfo.pas' {InfoForm},
LevSource in 'LevSource.pas' {SourceForm},
LevOptions in 'LevOptions.pas' {LevelForm},
Global in 'Global.pas';
/_InnoSetup/Output/setup.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/_InnoSetup/SpaceMission.iss
1,4 → 1,4
; SpaceMission Setup Script for InnoSetup 5.1.12
; SpaceMission Setup Script for InnoSetup
; by Daniel Marschall
 
; http://www.daniel-marschall.de/
33,12 → 33,12
[Tasks]
Name: "desktopicon"; Description: "Erstelle eine Verknüpfung auf dem &Desktop"; GroupDescription: "Programmverknüpfungen:"; MinVersion: 4,4
Name: "levedit"; Description: "Installiere den &Leveleditor"; GroupDescription: "Zusatzprogramme:"; MinVersion: 4,4
Name: "compiler"; Description: "Installiere den Level&compiler"; GroupDescription: "Zusatzprogramme:"; MinVersion: 4,4
Name: "converter"; Description: "Installiere den Level&converter"; GroupDescription: "Zusatzprogramme:"; MinVersion: 4,4; Flags: unchecked
 
[Files]
Source: "..\SpaceMission.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\LevEdit.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: levedit
Source: "..\Compiler.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: compiler
Source: "..\Converter.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: converter
Source: "..\Dokumentation.pdf"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\Bilder\Auswahl.bmp"; DestDir: "{app}\Bilder"; Flags: ignoreversion; Tasks: levedit
Source: "..\Bilder\Delphi.bmp"; DestDir: "{app}\Bilder"; Flags: ignoreversion
87,11 → 87,11
[Dirs]
Name: "{app}\Spielstände"
Name: "{app}\Levels"
Name: "{app}\Eingabe"; Tasks: compiler
Name: "{app}\Ausgabe"; Tasks: compiler
Name: "{app}\Temp"; Tasks: compiler
Name: "{app}\Temp\1"; Tasks: compiler
Name: "{app}\Temp\2"; Tasks: compiler
Name: "{app}\Eingabe"; Tasks: converter
Name: "{app}\Ausgabe"; Tasks: converter
Name: "{app}\Temp"; Tasks: converter
Name: "{app}\Temp\1"; Tasks: converter
Name: "{app}\Temp\2"; Tasks: converter
Name: "{group}\Webseiten"
Name: "{group}\Ordner"
 
102,11 → 102,11
Name: "{group}\SpaceMission"; Filename: "{app}\SpaceMission.exe"
Name: "{group}\Dokumentation"; Filename: "{app}\Dokumentation.pdf"
Name: "{group}\Leveleditor"; Filename: "{app}\LevEdit.exe"; Tasks: levedit
Name: "{group}\Levelcompiler"; Filename: "{app}\Compiler.exe"; Tasks: compiler
Name: "{group}\Levelconverter"; Filename: "{app}\Converter.exe"; Tasks: converter
Name: "{group}\Ordner\Levelordner"; Filename: "{app}\Levels\"
Name: "{group}\Ordner\Spielstände"; Filename: "{app}\Spielstände\"
Name: "{group}\Ordner\Compiler Eingabeordner"; Filename: "{app}\Eingabe\"; Tasks: compiler
Name: "{group}\Ordner\Compiler Ausgabeordner"; Filename: "{app}\Ausgabe\"; Tasks: compiler
Name: "{group}\Ordner\Converter Eingabeordner"; Filename: "{app}\Eingabe\"; Tasks: converter
Name: "{group}\Ordner\Converter Ausgabeordner"; Filename: "{app}\Ausgabe\"; Tasks: converter
Name: "{userdesktop}\SpaceMission"; Filename: "{app}\SpaceMission.exe"; MinVersion: 4,4; Tasks: desktopicon
Name: "{group}\SpaceMission deinstallieren"; Filename: "{uninstallexe}"
 
/GamSplash.dfm
0,0 → 1,28
object SplashForm: TSplashForm
Left = 241
Top = 158
BorderIcons = []
BorderStyle = bsNone
Caption = 'Bitte warten...'
ClientHeight = 497
ClientWidth = 658
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
PixelsPerInch = 106
TextHeight = 13
object SplashImage: TImage
Left = 8
Top = 8
Width = 640
Height = 480
AutoSize = True
Transparent = True
end
end
/ComText.dfm
0,0 → 1,37
object TextForm: TTextForm
Left = 432
Top = 156
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 361
ClientWidth = 297
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
PixelsPerInch = 106
TextHeight = 13
object OKBtn: TButton
Left = 64
Top = 328
Width = 169
Height = 25
Caption = '&OK'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 8
Top = 8
Width = 281
Height = 313
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
end
/GamMain.pas
0,0 → 1,2496
unit GamMain;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs,
StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws, DXInput,
DXSounds, INIFiles, ShellAPI, wininet;
 
type
TGameScene = (
gsNone,
gsTitle,
gsMain,
gsGameOver,
gsNewLevel,
gsWin
);
 
TGameInterval = (
giMittel,
giLeicht,
giSchwer,
giMaster
);
 
TMusicTrack = (
mtNone,
mtGame,
mtBoss,
mtScene,
mtTitle
);
 
{TSoundFile = (
sfNone,
sfSceneMov,
sfExplosion,
sfHit,
sfShoot,
sfDanger,
sfEnde,
sfFrage,
sfLevIntro
);}
 
TBackground = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TBackgroundSpecial = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TExplosion = class(TImageSprite)
private
FCounter: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TPlayerSprite = class(TImageSprite)
private
FCounter: Integer;
FMode: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
procedure FlyAway;
end;
 
TTamaSprite = class(TImageSprite)
private
FPlayerSprite: TPlayerSprite;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
end;
 
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;
destructor Destroy; override;
end;
 
TEnemyTama = class(TImageSprite)
private
FPlayerSprite: TSprite;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyMeteor = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyUFO = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyUFO2 = class(TEnemy)
private
FCounter: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker2 = class(TEnemy)
private
FCounter: Integer;
FTamaF: Integer;
FTamaT: Integer;
FPutTama: Boolean;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker3 = class(TEnemy)
private
FCounter: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyBoss = class(TEnemy)
private
FCounter: Integer;
FTamaF: Integer;
FTamaT: Integer;
FPutTama: Boolean;
waiter1, waiter2: integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(ADead: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TNothing = class(TImageSprite);
 
TSpriteClass = class of TSprite;
 
TEnemyAdvent = record
spriteClass: TSpriteClass;
x: extended;
y: extended;
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
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
GamSplash, GamSpeicherung, ComInfo, ComText, GamCheat, 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: boolean;
pos: array[1..4] of integer;
enemys: array[1..27] of TSpriteClass;
levact: integer;
 
const
DXInputButton = [isButton1, isButton2, isButton3,
isButton4, isButton5, isButton6, isButton7, isButton8, isButton9, isButton10, isButton11,
isButton12, isButton13, isButton14, isButton15, isButton16, isButton17, isButton18,
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);
Image := MainForm.ImageList.Items.Find('Machine');
Width := Image.Width;
Height := Image.Height;
X := -70{20};
Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
Z := 2;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FMode := PLAYER_MODE_ENTER;
end;
 
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if mainform.FCheat then exit;
if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
begin
if not crash then
begin
dec(MainForm.FLife);
Crash := true;
if MainForm.Flife=0 then
begin
MainForm.PlaySound('Explosion', false);
Collisioned := false;
FCounter := 0;
FMode := PLAYER_MODE_DEAD;
Done := false;
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end;
end
else
begin
if not crashsound then
begin
MainForm.PlaySound('Hit', False);
crashsound := true;
end;
end;
end;
end;
 
procedure TPlayerSprite.DoMove(MoveCount: Integer);
const
WegduesKonstante = 1.75;
begin
inherited DoMove(MoveCount);
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;
if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
if X<0 then X := 0;
if X>mainform.dxdraw.surfacewidth-Width then X := mainform.dxdraw.surfacewidth-Width;
if Y<0 then Y := 0;
if Y>mainform.dxdraw.surfaceheight-Height then Y := mainform.dxdraw.surfaceheight-Height;
if isButton1 in MainForm.DXInput.States then
begin
if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
begin
Inc(FTamaCount);
with TTamaSprite.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X+Self.Width;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end;
Collision;
end else if FMode=PLAYER_MODE_DEAD then
begin
if FCounter>200 then
begin
FCounter := 0;
FMode := PLAYER_MODE_DEAD_VANISHED;
Visible := false;
end;
end else if FMode=PLAYER_MODE_DEAD_VANISHED then
begin
if FCounter>1500 then
begin
MainForm.FNextScene := gsGameOver;
MainForm.PlaySound('SceneMov', false);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
end;
end else if FMode=PLAYER_MODE_FLYAWAY then
begin
// FUT: "Wusch" sound?
X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
if X > MainForm.DXDraw.Width+Width then
begin
Dead;
inc(mainform.FLevel);
MainForm.FNextScene := gsNewLevel;
MainForm.PlaySound('SceneMov', false);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
end;
end else if FMode = PLAYER_MODE_ENTER then
begin
X := X + MoveCount*(300/1000);
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
Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
OptionBreitBild.enabled := OptionFullScreen.checked;
DXDraw.Finalize;
if OptionFullScreen.Checked then
begin
if not (doFullScreen in DXDraw.Options) then StoreWindow;
DXDraw.Options := DXDraw.Options + [doFullScreen];
end else
begin
if doFullScreen in DXDraw.Options then RestoreWindow;
DXDraw.Options := DXDraw.Options - [doFullScreen];
end;
if not OptionBreitBild.checked then
begin
dxdraw.autosize := false;
dxdraw.Top := 0;
dxdraw.Left := 0;
dxdraw.width := 640;
dxdraw.height := 480;
dxdraw.surfacewidth := 640;
dxdraw.surfaceheight := 480;
end
else dxdraw.autosize := true;
DXDraw.Initialize;
except
//Imagelist.Items.clear;
//application.terminate;
end;
end;
 
constructor TTamaSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce');
Z := 2;
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
MainForm.PlaySound('Shoot', False);
end;
 
destructor TTamaSprite.Destroy;
begin
inherited Destroy;
Dec(FPlayerSprite.FTamaCount);
end;
 
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
begin
TEnemy(Sprite).Hit;
Dead;
end;
Done := False;
end;
 
procedure TTamaSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X+(800/1000)*MoveCount;
if X>=mainform.dxdraw.surfacewidth then Dead;
Collision;
end;
 
procedure TBackground.DoMove(MoveCount: Integer);
var
ran: integer;
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
randomize;
ran := Random(1500);
if ran = 150 then
begin
with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Background-Planet1');
Width := Image.Width;
Height := Image.Height;
 
Y := random(mainform.dxdraw.height);
X := mainform.dxdraw.width;
 
ran := Random(2);
if ran = 0 then
begin
Z := -20;
FSpeed := 1.8;
end
else if ran = 1 then
begin
Z := -40;
FSpeed := 0.8;
end
else if ran = 2 then
begin
Z := -60;
FSpeed := 0.3;
end;
end;
end
else if ran = 500 then
begin
with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
ran := Random(4);
if ran = 0 then
Image := mainform.ImageList.Items.Find('Background-Red')
else if ran = 1 then
Image := mainform.ImageList.Items.Find('Background-Blue')
else if ran = 2 then
Image := mainform.ImageList.Items.Find('Background-Yellow')
else if ran = 3 then
Image := mainform.ImageList.Items.Find('Hintergrund-Rot');
Width := Image.Width;
Height := Image.Height;
 
Y := random(mainform.dxdraw.height);
X := mainform.dxdraw.width;
 
{ ran := Random(2);
if ran = 0 then
begin
Z := -20;
FSpeed := 1.8;
end
else if ran = 1 then
begin
Z := -40;
FSpeed := 0.8;
end
else if ran = 2 then
begin }
Z := -60;
FSpeed := 0.3;
{ end; }
end;
end;
end;
 
procedure TBackgroundSpecial.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
if X<-Width then Dead;
end;
 
constructor TExplosion.Create(AParent: TSprite);
begin
inherited Create(AParent);
mainform.PlaySound('Explosion', false);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
AnimPos := Random(AnimCount);
end;
 
procedure TExplosion.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
inc(FCounter, MoveCount);
if FCounter > 2999 then dead;
end;
 
constructor TEnemyTama.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
MainForm.PlaySound('Shoot', False);
end;
 
procedure TEnemyTama.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(600/1000);
if X<-Width then Dead;
end;
 
procedure TEnemy.Hit;
begin
Dec(FLife);
if FLife<=0 then
begin
Collisioned := False;
HitEnemy(True);
end
else
HitEnemy(False);
end;
 
procedure TEnemy.HitEnemy(ADead: Boolean);
begin
if ADead then MainForm.PlaySound('Explosion', False);
end;
 
constructor TEnemyUFO.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-disk');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
constructor TEnemy.Create(AParent: TSprite);
begin
inherited Create(AParent);
dec(mainform.FRestEnemys);
inc(ec);
end;
 
destructor TEnemy.Destroy;
begin
inherited Destroy;
dec(ec);
end;
 
procedure TEnemyUFO.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
if FCounter-FOldTamaTime>=100 then
begin
Inc(FTamaCount);
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
procedure TEnemyUFO2.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
constructor TEnemyUFO2.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-disk2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyUFO.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyAttacker.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000)-FCounter div 128;
if X < -Width then Dead;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyBoss.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-boss');
Width := Image.Width;
Height := Image.Height;
BossExists := true;
MainForm.PlayMusic(mtBoss);
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
Collisioned := False;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
MainForm.FBossLife := FLife;
waiter1 := 0;
waiter2 := 0;
end;
 
procedure TEnemyBoss.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 100000);
BossExists := false;
dec(MainForm.FBossLife);
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
dec(MainForm.FBossLife);
end;
end;
 
procedure TEnemyBoss.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
X := X - MoveCount*(300/1000)
else
begin
Collisioned := True;
FMode := 1;
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
begin
if FTamaT>100 then
begin
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
Z := 1;
X := Self.X-Width;
Y := Self.Y+Self.Height div 2-Height div 2;
end;
Inc(FTamaF);
if FTamaF>Random(30) then FPutTama := False;
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
begin
FPutTama := True;
FTamaF := 0;
FTamaT := 0;
end;
end;
end else if FMode=2 then
begin
inc(waiter1);
if waiter1 = 3 then
begin
waiter1 := 0;
inc(waiter2);
if waiter2 <= 20 then
begin
with TExplosion.Create(Engine) do
begin
Z := 10;
X := Self.X+Random(Self.Width)-16;
Y := Self.Y+Random(Self.Height)-16;
end;
end
else
begin
Inc(MainForm.FScore, 1000);
FMode := 3;
end;
end;
end else if FMode=3 then
begin
if FCounter>4000 then dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker2.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 5000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
X := X - MoveCount*(300/1000)
else
begin
Collisioned := True;
FMode := 1;
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
begin
if FTamaT>100 then
begin
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
Z := 1;
X := Self.X-Width;
Y := Self.Y+Self.Height div 2-Height div 2;
end;
Inc(FTamaF);
if FTamaF>Random(30) then FPutTama := False;
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
begin
FPutTama := True;
FTamaF := 0;
FTamaT := 0;
end;
end;
end else if FMode=2 then
begin
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean);
begin
if ADead then
begin
MainForm.PlaySound('Explosion', False);
FMode := 1;
FCounter := 0;
Inc(MainForm.FScore, 5000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - (250/1000)*MoveCount;
if X<-Width then Dead;
if FCounter-FOldTamaTime>=100 then
begin
Inc(FTamaCount);
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end else if FMode=1 then
begin
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker3.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
end;
 
function TMainForm.SoundKarte: boolean;
begin
result := WaveOutGetNumDevs > 0;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
var
Ergebnis: string;
daten: textfile;
ok: boolean;
begin
{ Beginne VCL-Ersatz }
dxtimer := tdxtimer.Create(self);
dxtimer.Interval := 33;
dxtimer.OnActivate := DXTimerActivate;
dxtimer.OnDeactivate := DXTimerDeactivate;
dxtimer.OnTimer := DXTimerTimer;
dxtimer.ActiveOnly := false;
dxtimer.Enabled := false;
 
dxdraw := tdxdraw.Create(self);
dxdraw.Parent := self;
dxdraw.Align := alClient;
dxdraw.Left := 0;
dxdraw.Top := 0;
dxdraw.Width := 640;
dxdraw.Height := 480;
dxdraw.AutoInitialize := False;
dxdraw.AutoSize := False;
dxdraw.Color := clBlack;
dxdraw.Display.BitCount := 24;
dxdraw.Display.FixedBitCount := False;
dxdraw.Display.FixedRatio := False;
dxdraw.Display.FixedSize := False;
dxdraw.Display.Height := 600;
dxdraw.Display.Width := 800;
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, doRetainedMode, doHardware, doSelectDriver];
dxdraw.TabOrder := 0;
dxdraw.Visible := true;
dxdraw.OnFinalize := DXDrawFinalize;
dxdraw.OnInitialize := DXDrawInitialize;
dxdraw.OnInitializing := DXDrawInitializing;
 
dxsound := tdxsound.Create(self);
dxsound.AutoInitialize := false;
 
dxinput := tdxinput.Create(self);
dxinput.Joystick.ForceFeedback := true;
dxinput.Keyboard.ForceFeedback := true;
 
wavelist := tdxwavelist.Create(self);
wavelist.DXSound := dxsound;
 
imagelist := tdximagelist.create(self);
imagelist.DXDraw := dxdraw;
 
spriteengine := tdxspriteengine.create(self);
spriteengine.DXDraw := dxdraw;
 
{ Ende VCL-Ersatz }
 
Application.Title := 'SpaceMission '+ProgramVersion;
LoadOptions;
DXInit;
SoundInit;
MusicInit;
DeleteArray;
if (paramcount = 0) and (fileexists(paramstr(1))) then // (paramcount > 0)
begin
AssignFile(daten, paramstr(1));
Reset(daten);
ok := true;
ReadLN(daten, Ergebnis);
if Ergebnis <> '; SpaceMission '+ProgramVersion then ok := false;
ReadLN(daten, Ergebnis);
if ergebnis <> '; SAV-File' then ok := false;
if not ok then
begin
showmessage(FileError);
CloseFile(daten);
GameStartClick(GameStart);
exit;
end;
ReadLN(daten, mainform.FScore);
ReadLN(daten, mainform.FLife);
ReadLN(daten, mainform.Flevel);
ReadLN(daten, mainform.FMenuItem);
CloseFile(daten);
mainform.FNextScene := gsNewLevel;
exit;
end;
GameStartClick(GameStart);
end;
 
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssAlt in Shift) and (Key=VK_RETURN) then
OptionFullScreenClick(OptionFullScreen);
end;
 
procedure TMainForm.GameStartClick(Sender: TObject);
begin
StartScene(gsTitle);
end;
 
procedure TMainForm.GamePauseClick(Sender: TObject);
begin
GamePause.Checked := not GamePause.Checked;
DXTimer.Enabled := not GamePause.Checked;
if GamePause.Checked then PauseMusic(FMusic) else
ResumeMusic(FMusic);
end;
 
// http://www.delphipraxis.net/post43515.html
Function GetHTML(AUrl: string): string;
var
databuffer : array[0..4095] of char;
ResStr : string;
hSession, hfile: hInternet;
dwindex,dwcodelen,dwread,dwNumber: cardinal;
dwcode : array[1..20] of char;
res : pchar;
Str : pchar;
begin
ResStr:='';
if system.pos('http://',lowercase(AUrl))=0 then
AUrl:='http://'+AUrl;
 
// Hinzugefügt
application.ProcessMessages;
 
hSession:=InternetOpen('InetURL:/1.0',
INTERNET_OPEN_TYPE_PRECONFIG,
nil,
nil,
0);
if assigned(hsession) then
begin
// Hinzugefügt
application.ProcessMessages;
 
hfile:=InternetOpenUrl(
hsession,
pchar(AUrl),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
dwIndex := 0;
dwCodeLen := 10;
 
// Hinzugefügt
application.ProcessMessages;
 
HttpQueryInfo(hfile,
HTTP_QUERY_STATUS_CODE,
@dwcode,
dwcodeLen,
dwIndex);
res := pchar(@dwcode);
dwNumber := sizeof(databuffer)-1;
if (res ='200') or (res ='302') then
begin
while (InternetReadfile(hfile,
@databuffer,
dwNumber,
DwRead)) do
begin
 
// Hinzugefügt
application.ProcessMessages;
 
if dwRead =0 then
break;
databuffer[dwread]:=#0;
Str := pchar(@databuffer);
resStr := resStr + Str;
end;
end
else
ResStr := 'Status:'+res;
if assigned(hfile) then
InternetCloseHandle(hfile);
end;
 
// Hinzugefügt
application.ProcessMessages;
 
InternetCloseHandle(hsession);
Result := resStr;
end;
 
procedure TMainForm.CheckUpdatesClick(Sender: TObject);
var
temp: string;
begin
temp := GetHTML('http://www.viathinksoft.de/update/?id=spacemission');
if copy(temp, 0, 7) = 'Status:' then
begin
Application.MessageBox('Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.', 'Fehler', MB_OK + MB_ICONERROR)
end
else
begin
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);
end
else
begin
Application.MessageBox('Es ist keine neue Programmversion vorhanden.', 'Information', MB_OK + MB_ICONASTERISK);
end;
end;
end;
 
procedure TMainForm.BeendenClick(Sender: TObject);
begin
close;
end;
 
procedure TMainForm.OptionFullScreenClick(Sender: TObject);
begin
OptionFullScreen.Checked := not OptionFullScreen.Checked;
DXInit;
writeoptions;
end;
 
procedure TMainForm.OptionSoundClick(Sender: TObject);
begin
OptionSound.Checked := not OptionSound.Checked;
SoundInit;
WriteOptions;
end;
 
procedure TMainForm.SoundInit;
begin
if OptionSound.Checked then
begin
if not DXSound.Initialized then
begin
try
DXSound.Initialize;
WaveList.Items.LoadFromFile(FDirectory+'DirectX\Sound.dxw');
except
OptionSound.enabled := False;
WaveList.items.clear;
end;
end;
end
else DXSound.Finalize;
end;
 
procedure TMainForm.MusicInit;
begin
optionmusic.enabled := SoundKarte;
end;
 
procedure TMainForm.DestroyMusic(Name: TMusicTrack);
begin
if Name = mtBoss then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
end;
if Name = mtGame then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
end;
if Name = mtScene then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
end;
if Name = mtTitle then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
end;
 
procedure TMainForm.OpenMusic(Name: TMusicTrack);
begin
if Name = mtBoss then
MCISendString(pchar('open "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('open "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('open "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('open "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
procedure TMainForm.PauseMusic(Name: TMusicTrack);
begin
if not OptionMusic.checked then exit;
if Name = mtBoss then
MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
procedure TMainForm.DXDrawInitializing(Sender: TObject);
begin
if doFullScreen in DXDraw.Options then
begin
BorderStyle := bsNone;
DXDraw.Cursor := crNone;
end else
begin
BorderStyle := bsSingle;
DXDraw.Cursor := crDefault;
end;
end;
 
procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
DXTimer.Enabled := True;
end;
 
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
DXTimer.Enabled := False;
end;
 
procedure TMainForm.DXTimerActivate(Sender: TObject);
begin
Caption := Application.Title;
if not ProgrammGestartet then
begin
Programmgestartet := true;
exit;
end;
ResumeMusic(FMusic);
end;
 
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
begin
Caption := Application.Title + ' [Pause]';
PauseMusic(FMusic);
end;
 
function TMainForm.StatusMusic(Name: TMusicTrack): string;
var
MCIStatus: array[0..255] of char;
begin
if not OptionMusic.checked then exit;
if FMusic = mtGame then
MCISendString(pchar('status "'+FDirectory+'Musik\Game.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtBoss then
MCISendString(pchar('status "'+FDirectory+'Musik\Boss.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtScene then
MCISendString(pchar('status "'+FDirectory+'Musik\Scene.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtTitle then
MCISendString(pchar('status "'+FDirectory+'Musik\Title.mid" mode'), MCIStatus, 255, 0);
result := MCIStatus;
end;
 
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if StatusMusic(FMusic) = 'stopped' then
PlayMusic(FMusic); {...}
if crash then
begin
inc(Crash2);
if crash2=30 then
begin
Crash2 := 0;
crash := false;
crashsound := false;
end;
end;
if not DXDraw.CanDraw then exit;
DXInput.Update;
case FScene of
gsTitle : SceneTitle;
gsMain : SceneMain;
gsGameOver: SceneGameOver;
gsWin : SceneWin;
gsNewLevel: SceneNewLevel;
end;
if FNextScene<>gsNone then
begin
StartScene(FNextScene);
FNextScene := gsNone;
end;
DXDraw.Flip;
end;
 
procedure TMainForm.BlinkStart;
begin
FBlink := 0;
FBlinkTime := GetTickCount;
end;
 
procedure TMainForm.WriteOptions;
var
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
else INIDatei.WriteBool('Settings', 'Music', false);
if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
else INIDatei.WriteBool('Settings', 'Sound', false);
if OptionFullScreen.checked then INIDatei.WriteBool('Settings', 'FullScreen', true)
else INIDatei.WriteBool('Settings', 'FullScreen', false);
if OptionBreitbild.checked then INIDatei.WriteBool('Settings', 'ScreenAutoSize', true)
else INIDatei.WriteBool('Settings', 'ScreenAutoSize', false);
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;
 
procedure TMainForm.LoadOptions;
var
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
OptionBreitBild.checked := INIDatei.ReadBool('Settings', 'ScreenAutoSize', true);
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 1 then
begin
FInterval := giLeicht;
Leicht.checked := true;
end;
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 2 then
begin
FInterval := giMittel;
Mittel.checked := true;
end;
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 3 then
begin
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;
 
procedure TMainForm.BlinkUpdate;
begin
if GetTickCount<>FBlinkTime then
begin
FBlink := FBlink + (GetTickCount-FBlinkTime);
FBlinkTime := GetTickCount;
end;
end;
 
procedure TMainForm.PlaySound(Name: string; Wait: Boolean);
begin
if (OptionSound.Checked) and (OptionSound.Enabled) then
WaveList.Items.Find(Name).Play(Wait);
end;
 
procedure TMainForm.PlayMusic(Name: TMusicTrack);
begin
if (not mainform.active) and (mainform.visible) then //1st Programmstart
exit;
if (OptionMusic.checked) and (OptionMusic.enabled) then
begin
DestroyMusic(FMusic);
OpenMusic(Name);
ResumeMusic(Name);
end;
FMusic := Name;
end;
 
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
begin
with Result do
begin
rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
rgbReserved := 0;
end;
end;
 
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
var
i: Integer;
t, t2: DWORD;
ChangePalette: Boolean;
c: Integer;
begin
if DXDraw.Initialized then
begin
c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
ChangePalette := False;
if DXDraw.CanPaletteAnimation then
begin
t := GetTickCount;
while Abs(GetTickCount-t)<Time do
begin
t2 := Trunc(Abs(GetTickCount-t)/Time*255);
for i := 0 to 255 do
DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
DXDraw.UpdatePalette;
ChangePalette := True;
end;
end else
Sleep(Time);
for i := 0 to 4 do
begin
DXDraw.Surface.Fill(c);
DXDraw.Flip;
end;
if ChangePalette then
begin
DXDraw.ColorTable := DXDraw.DefColorTable;
DXDraw.UpdatePalette;
end;
DXDraw.Surface.Fill(c);
DXDraw.Flip;
end;
end;
 
procedure TMainForm.StartScene(Scene: TGameScene);
begin
EndScene;
DXInput.States := DXInput.States - DXInputButton;
FScene := Scene;
BlinkStart;
case FScene of
gsTitle : StartSceneTitle;
gsMain : StartSceneMain;
gsGameOver: StartSceneGameOver;
gsWin : StartSceneWin;
gsNewLevel: StartSceneNewLevel;
end;
end;
 
procedure TMainForm.StartSceneTitle;
begin
sleep(500);
FCheat := false;
BossExists := false;
FLife := Lives;
FLevel := 0;
FScore := 0;
FNotSave := true;
Cheat.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
GameStart.enabled := false;
Spielgeschwindigkeit.enabled := false;
mainform.Visible := true;
PlayMusic(mtTitle);
end;
 
procedure TMainForm.StartSceneMain;
{var
i, j: Integer;}
begin
sleep(500);
FCounter := 0;
NewLevel(FLevel);
BossExists := false;
PlayMusic(mtGame);
FEnemyAdventPos := 1;
FFrame := -4;
PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine);
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star3');
Z := -13;
Y := 40;
FSpeed := 1 / 2;
Tile := True;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star2');
Z := -12;
Y := 30;
FSpeed := 1;
Tile := True;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star1');
Z := -11;
Y := 10;
FSpeed := 2;
Tile := True;
end;
{with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 10;
Z := -13;
FSpeed := 1 / 2;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 30;
Z := -12;
FSpeed := 1;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 40;
Z := -11;
FSpeed := 2;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;}
FNotSave := false;
Cheat.enabled := true;
Neustart.enabled := true;
GamePause.enabled := true;
GameStart.enabled := true;
Spielgeschwindigkeit.enabled := true;
end;
 
procedure TMainForm.StartSceneGameOver;
begin
sleep(500);
FNotSave := true;
Cheat.enabled := false;
Spielgeschwindigkeit.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
PlayMusic(mtScene);
BossExists := false;
end;
 
procedure TMainForm.StartSceneWin;
begin
sleep(500);
FNotSave := true;
Cheat.enabled := false;
Spielgeschwindigkeit.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
PlayMusic(mtScene);
BossExists := false;
end;
 
procedure TMainForm.EndScene;
begin
case FScene of
gsTitle : EndSceneTitle;
gsMain : EndSceneMain;
gsGameOver: EndSceneGameOver;
gsWin : EndSceneWin;
gsNewLevel: EndSceneNewLevel;
end;
end;
 
procedure TMainForm.EndSceneTitle;
begin
{ Ende Title }
end;
 
procedure TMainForm.EndSceneMain;
begin
SpriteEngine.Engine.Clear;
end;
 
procedure TMainForm.EndSceneGameOver;
begin
{ Ende GameOver }
end;
 
procedure TMainForm.EndSceneWin;
begin
{ Ende Win }
end;
 
procedure TMainForm.DeleteArray();
var
i: integer;
begin
for i := Low(EnemyAdventTable) to High(EnemyAdventTable) do
begin
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
LNG_LEVEL_INVALID = 'Das Level Nr. %d ist ungültig!'+#13#10+'Das Programm wird beendet.';
var
act: integer;
filex: textfile;
ergebniss: string;
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;
randomize;
for act := 1 to lev*75-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};
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);
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
begin
levact := 0;
assignfile(filex, FDirectory+'Levels\Level '+inttostr(lev)+'.lev');
reset(filex);
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;
readln(filex, 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);
if levact = 5 then levact := 1;
if levact = 1 then
begin
inc(pos[levact]);
inc(FRestEnemys);
EnemyAdventTable[pos[levact]].spriteClass := enemys[strtoint(ergebniss)];
end;
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;
end;
 
procedure TMainForm.SceneTitle;
var
Logo: TPictureCollectionItem;
begin
DXDraw.Surface.Fill(0);
Logo := ImageList.Items.Find('Logo');
{Logo.DrawWaveX(DXDraw.Surface, (dxdraw.surfaceWidth div 2) - 181, 65, Logo.Width, Logo.Height, 0,
Trunc(16 - Cos256(FBlink div 60) * 16), 32, -FBlink div 5);}
Logo.DrawWaveX(DXDraw.Surface, trunc((dxdraw.surfaceWidth / 2) - (Logo.Width / 2)), 65, Logo.Width, Logo.Height, 0,
2, 80, Fangle * 4);
inc(Fangle);
with DXDraw.Surface.Canvas do
begin
if (isDown in MainForm.DXInput.States) and (FMenuItem=1) then FMenuItem := 2;
if ((isUp in MainForm.DXInput.States) and (FMenuItem=2)) or (FMenuItem=0) then FMenuItem := 1;
Brush.Style := bsClear;
Font.Size := 30;
if FMenuItem = 1 then
begin
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-52, '>');
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2)-50, '>');
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
end
else
begin
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-2, '>');
Font.Color := clRed;
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
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; }
BlinkUpdate;
Release;
end;
// 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
begin
//PlaySound('Frage', False);
exit;
end;
NewLevel(FLevel);
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsMain);
end;
end;
 
procedure TMainForm.SceneMain;
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);
SpriteEngine.Dead;
while (Low(EnemyAdventTable)<=FEnemyAdventPos) and
(FEnemyAdventPos<=High(EnemyAdventTable)) and
((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and
(FRestEnemys>0) do
begin
if EnemyAdventTable[FEnemyAdventPos].spriteClass <> TNothing then
begin
with EnemyAdventTable[FEnemyAdventPos] do
begin
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;
end;
end;
Inc(FEnemyAdventPos);
end;
Inc(FFrame);
DXDraw.Surface.Fill(0);
if FNextScene=gsNone then
begin
SpriteEngine.Draw;
if MainForm.flife > 0 then
begin
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Size := 20;
Font.Color := clOlive;
Textout(9, 9, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
Font.Color := clYellow;
Textout(10, 10, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
Font.Color := clMaroon;
Textout(dxdraw.surfacewidth-141, 9, 'Level: ' + IntToStr(MainForm.flevel));
Font.Color := clRed;
Textout(dxdraw.surfacewidth-140, 10, 'Level: ' + IntToStr(MainForm.flevel));
if FLife<0 then mainform.FLife := 0;
if FCheat then
begin
Font.Color := clPurple;
Textout(9, dxdraw.surfaceheight-41, 'Leben: ?');
Font.Color := clFuchsia;
Textout(10, dxdraw.surfaceheight-40, 'Leben: ?');
end
else
begin
if ((Flife = 1) and ((FBlink div 300) mod 2=0)) or (Flife <> 1) then
begin
Font.Color := clPurple;
Textout(9, dxdraw.surfaceheight-41, 'Leben: ' + IntToStr(MainForm.flife));
Font.Color := clFuchsia;
Textout(10, dxdraw.surfaceheight-40, 'Leben: ' + IntToStr(MainForm.flife));
end;
if Flife = 1 then BlinkUpdate;
end;
{if BossExists and (FBossLife>0) then
begin
Font.Color := clPurple;
Textout(449, 439, 'Boss: ' + IntToStr(FBossLife));
Font.Color := clFuchsia;
Textout(450, 440, 'Boss: ' + IntToStr(FBossLife));
end
else
if RestlicheEinheiten>0 then
begin
Font.Color := clPurple;
Textout(449, 439, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
Font.Color := clFuchsia;
Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
end;}
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));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
end;
if (FRestEnemys<1) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
end;
end;
if (FRestEnemys>0) and not Bossexists then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
end;
Release;
end;
end
else
begin
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!');
DXDraw.Surface.Canvas.Release;
end;
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;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
DXDraw.Surface.Canvas.Font.Color := clLime;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
DXDraw.Surface.Canvas.Release;
Sleep(1);
inc(FCounter);
if FCounter>150{200} then PlayerSprite.FlyAway;
end;
end;
end;
 
procedure TMainForm.SceneGameOver;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
FNotSave := true;
Cheat.enabled := false;
GamePause.enabled := false;
Neustart.enabled := false;
Brush.Style := bsClear;
Font.Size := 35;
Font.Color := clMaroon;
Textout((dxdraw.surfacewidth div 2)-127, 98, 'Verloren!');
Font.Color := clRed;
Textout((dxdraw.surfacewidth div 2)-125, 100, 'Verloren!');
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsTitle);
end;
end;
 
procedure TMainForm.SceneWin;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
FNotSave := true;
Cheat.enabled := false;
GamePause.enabled := false;
Neustart.enabled := false;
Brush.Style := bsClear;
Font.Size := 35;
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-127, 98, 'Gewonnen!');
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-125, 100, 'Gewonnen!');
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsTitle);
end;
end;
 
procedure TMainForm.StartSceneNewLevel;
begin
sleep(500);
FNotSave := false;
Cheat.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
GameStart.enabled := true;
Spielgeschwindigkeit.enabled := false;
BossExists := false;
Spielgeschwindigkeit.enabled := false;
if ((FMenuItem=1) and (not fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev'))) or ((FMenuItem=2) and (FLevel > 25)) then
begin
//PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsWin);
exit;
end;
PlayMusic(mtScene);
end;
 
procedure TMainForm.EndSceneNewLevel;
begin
{ Ende NewLevel }
end;
 
procedure TMainForm.SceneNewLevel;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Size := 40;
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-(83+(length(inttostr(flevel))*22)), 98, 'Level '+inttostr(flevel));
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-(81+(length(inttostr(flevel))*22)), 100, 'Level '+inttostr(flevel));
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsMain);
end;
end;
 
procedure TMainForm.OptionMusicClick(Sender: TObject);
begin
OptionMusic.Checked := not OptionMusic.Checked;
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(fdirectory+MitwirkendeTxt) then
begin
MessageDLG(Format(LNG_NOTFOUND, [MitwirkendeTxt]), mtWarning, [mbOK], 0);
Exit;
end;
 
TextForm.memo1.lines.loadfromfile(FDirectory+MitwirkendeTxt);
 
dxtimer.enabled := false;
TextForm.ShowModal;
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TEnemyMeteor.DoMove(MoveCount: Integer);
begin
X := X - MoveCount*(250/1000);
if X < -Width then Dead;
end;
 
procedure TEnemyMeteor.HitEnemy(ADead: Boolean);
begin
if ADead then Collisioned := True;
MainForm.PlaySound('Hit', False);
end;
 
{procedure TMainForm.StopMusic;
begin
PauseMusic(FMusic);
MCISendString(pchar('seek "'+FDirectory+'Musik\Boss.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Game.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Title.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Scene.mid" to start'), nil, 255, 0);
end;}
 
procedure TMainForm.ResumeMusic(Name: TMusicTrack);
begin
if not OptionMusic.checked then exit;
if Name = mtBoss then
MCISendString(pchar('play "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('play "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('play "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
constructor TEnemyMeteor.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
end;
 
procedure TMainForm.SpielstandClick(Sender: TObject);
begin
speicherungform.showmodal;
end;
 
procedure TMainForm.NeustartClick(Sender: TObject);
begin
FLife := Lives;
FLevel := 1; // ???
FScore := 0;
ec := 0;
StartScene(gsMain);
PlayMusic(mtGame);
end;
 
procedure TMainForm.OptionBreitbildClick(Sender: TObject);
begin
OptionBreitbild.Checked := not OptionBreitbild.Checked;
DXInit;
writeoptions;
end;
 
procedure TMainForm.LeichtClick(Sender: TObject);
begin
leicht.checked := true;
FInterval := giLeicht;
writeoptions;
end;
 
procedure TMainForm.MittelClick(Sender: TObject);
begin
mittel.checked := true;
FInterval := giMittel;
writeoptions;
end;
 
procedure TMainForm.SchwerClick(Sender: TObject);
begin
schwer.checked := true;
FInterval := giSchwer;
writeoptions;
end;
 
procedure TMainForm.FormShow(Sender: TObject);
begin
SplashForm.Hide;
SplashForm.Free;
 
dxtimer.Enabled := true;
dxtimer.ActiveOnly := true;
end;
 
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);
begin
CheatForm.showmodal;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if optionMusic.checked then DestroyMusic(FMusic);
SpriteEngine.Engine.Clear;
dxsound.Finalize;
dxinput.Destroy;
DXTimer.Enabled := False;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
imagelist.free;
spriteengine.free;
dxdraw.Free;
wavelist.free;
dxsound.free;
//dxinput.free;
dxtimer.Free;
end;
 
end.
 
/Converter.cfg
0,0 → 1,38
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J+
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"C:\Users\Daniel Marschall\Documents\Borland Studio-Projekte\Bpl"
-LN"C:\Users\Daniel Marschall\Documents\Borland Studio-Projekte\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
/_PostBuild.bat
5,4 → 5,4
 
"C:\Programme\Inno Setup 5\iscc.exe" "%~dp0_InnoSetup\SpaceMission.iss"
 
call "%~dp0_Batch\processDir.bat" "%~dp0\_InnoSetup\Output"
call "%~dp0_Batch\processDir.bat" "%~dp0_InnoSetup\Output"
/GamMain.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/GamCheat.pas
0,0 → 1,133
unit GamCheat;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ShellAPI;
 
type
TCheatForm = class(TForm)
Label1: TLabel;
CheatEdit: TEdit;
OKBtn: TButton;
AbbBtn: TButton;
GroupBox1: TGroupBox;
CheatBox: TListBox;
Label2: TLabel;
Label3: TLabel;
procedure AbbBtnClick(Sender: TObject);
procedure OKBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure CheatEditKeyPress(Sender: TObject; var Key: Char);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
public
procedure SearchCheats;
end;
 
var
CheatForm: TCheatForm;
 
implementation
 
uses
GamMain, Global;
 
{$R *.DFM}
 
const
// Cheat1 = 'Kmkjk'+#39+'Khyc'; {Johnny Cash}
Cheat1 = #75+#109+#107+#106+#107+#127+#39+#75+#104+#121+#99;
Cheat1Text = 'Unendlich Leben!';
 
procedure TCheatForm.AbbBtnClick(Sender: TObject);
begin
close;
end;
 
procedure TCheatForm.SearchCheats;
begin
Cheatbox.Items.Clear;
if mainform.FCheat then Cheatbox.Items.Append(Cheat1Text);
end;
 
procedure TCheatForm.OKBtnClick(Sender: TObject);
var
temp: string;
i, j: integer;
begin
temp := '';
j := 0;
for i := 1 to length(CheatEdit.text) do
begin
inc(j);
temp := temp + chr(byte(copy(CheatEdit.text, i, 1)[1]) xor j);
end;
if lowercase(temp) = lowercase(Cheat1) then
begin
if mainform.FCheat then
showmessage('Dieser Cheat wurde bereits freigeschaltet!')
else
begin
showmessage('Dieser Cheat wurde freigeschaltet!');
mainform.FCheat := true;
SearchCheats;
end;
close;
end
else
begin
showmessage('Dies ist kein offizieller Cheat!');
CheatEdit.text := '';
CheatEdit.setfocus;
end;
end;
 
procedure TCheatForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
SearchCheats;
CheatEdit.text := '';
CheatEdit.setfocus;
end;
 
procedure TCheatForm.FormHide(Sender: TObject);
begin
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TCheatForm.CheatEditKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
// key := #0;
OKBtn.click;
end;
end;
 
procedure TCheatForm.Label2Click(Sender: TObject);
begin
if not CheatBox.items.IndexOf(Cheat1Text) = -1 then
begin
if CheatBox.Selected[CheatBox.items.IndexOf(Cheat1Text)] then
begin
if MessageDlg('Diesen Cheat wirklich deaktivieren?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
mainform.FCheat := false;
showmessage('Dieser Cheat wurde deakiviert!');
SearchCheats;
end;
end;
end;
end;
 
procedure TCheatForm.Label3Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar('mailto:daniel-marschall@viathinksoft.de?subject=Cheats für SpaceMission '+ProgramVersion), '', '', 1);
end;
 
end.
 
/Converter.dpr
0,0 → 1,30
program Converter;
 
uses
SysUtils,
Windows,
Forms,
Dialogs,
CnvMain in 'CnvMain.pas' {MainForm};
 
{$Description 'SpaceMission 1.1 Converter'}
 
var
Sem: THandle;
 
{$R *.RES}
 
begin
{ Programm schon gestartet? }
Sem := CreateSemaphore(nil, 0, 1, 'SpaceMission Converter');
if (Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
begin
CloseHandle(Sem);
MessageDlg('Das Programm wurde bereits gestartet.', mtInformation, [mbOK], 0);
exit;
end;
Application.Initialize;
Application.Title := 'Levelconverter';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
/Converter.bdsproj
0,0 → 1,176
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{99DF80C5-B3F5-4637-8685-0C3B4D0CA5B6}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">Converter.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">1</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">True</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription">Levelcompiler 1.1</Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath"></Directories>
<Directories Name="Packages">Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;DelphiX_for5;pielib</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">1</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Umwandlungssoftware...</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">SpaceMission Compiler</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">© Copyright 2001 - 2007 ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks">Keine</VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">Compiler.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">SpaceMission 1.1</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Homepage">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>
/LevEdit.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/ComInfo.pas
0,0 → 1,60
unit ComInfo;
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellAPI, ExtCtrls;
 
type
TInfoForm = class(TForm)
OkBtn: TButton;
HomeLbl: TLabel;
Image: TImage;
FirmaLbl: TLabel;
NameLbl: TLabel;
VersionLbl: TLabel;
EMailLbl: TLabel;
CopyrightLbl: TLabel;
Copyright2Lbl: TLabel;
URL2: TLabel;
URL1: TLabel;
procedure OkBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure URL2Click(Sender: TObject);
procedure URL1Click(Sender: TObject);
end;
 
var
InfoForm: TInfoForm;
 
implementation
 
uses
Global;
 
{$R *.DFM}
 
procedure TInfoForm.OkBtnClick(Sender: TObject);
begin
close;
end;
 
procedure TInfoForm.FormCreate(Sender: TObject);
begin
VersionLbl.caption := 'Version ' + ProgramVersion;
image.picture.loadfromfile(FDirectory + 'Bilder\Delphi.bmp');
end;
 
procedure TInfoForm.URL2Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('http://'+url2.caption+'/'), nil, nil, SW_SHOW);
end;
 
procedure TInfoForm.URL1Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('mailto:'+url1.Caption+'?subject=SpaceMission ' + ProgramVersion), nil, nil, SW_SHOW);
end;
 
end.
 
/CnvMain.pas
0,0 → 1,276
unit CnvMain;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Gauges, ShellAPI, ExtCtrls, ComCtrls;
 
type
TMainForm = class(TForm)
Run: TButton;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
comb: TComboBox;
gauge: TProgressBar;
procedure RunClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
public
FDirectory: string;
procedure c02t03(von, an: string);
procedure c03t04(von, an: string);
procedure c04t10(von, an: string);
end;
 
var
MainForm: TMainForm;
m: array[1..5] of tstrings;
 
implementation
 
{$R *.DFM}
 
{$R WindowsXP.res}
 
procedure TMainForm.RunClick(Sender: TObject);
var
i: integer;
begin
if comb.ItemIndex = -1 then
begin
MessageDLG('Bitte Umwandlungsmethode wählen!', mtError, [mbOK], 0);
exit;
end;
if not DirectoryExists(FDirectory+'Temp') then CreateDir(FDirectory+'Temp');
if not DirectoryExists(FDirectory+'Temp\1') then CreateDir(FDirectory+'Temp\1');
if not DirectoryExists(FDirectory+'Temp\2') then CreateDir(FDirectory+'Temp\2');
if not DirectoryExists(FDirectory+'Eingabe') then CreateDir(FDirectory+'Eingabe');
if not DirectoryExists(FDirectory+'Ausgabe') then CreateDir(FDirectory+'Ausgabe');
for i := 1 to 999 do
begin
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A1.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A1.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A1.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A1.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A2.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A2.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A2.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A2.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A3.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A3.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A3.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A3.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A4.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A4.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A4.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A4.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A5.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A5.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A5.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A5.sav');
if fileexists(FDirectory+'Temp\1\Level '+inttostr(i)+'.lev') then DeleteFile(FDirectory+'Temp\1\Level '+inttostr(i)+'.lev');
if fileexists(FDirectory+'Temp\2\Level '+inttostr(i)+'.lev') then DeleteFile(FDirectory+'Temp\2\Level '+inttostr(i)+'.lev');
end;
if comb.ItemIndex = 0 then c02t03(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 1 then
begin
c02t03(FDirectory+'Eingabe', FDirectory+'Temp\1');
c03t04(FDirectory+'Temp\1', FDirectory+'Ausgabe');
end;
if comb.ItemIndex = 2 then c03t04(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 3 then c04t10(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 4 then
begin
c02t03(FDirectory+'Eingabe', FDirectory+'Temp\1');
c03t04(FDirectory+'Temp\1', FDirectory+'Test\2');
c04t10(FDirectory+'Temp\2', FDirectory+'Ausgabe');
end;
if comb.ItemIndex = 5 then
begin
c03t04(FDirectory+'Eingabe', FDirectory+'Temp\1');
c04t10(FDirectory+'Temp\1', FDirectory+'Ausgabe');
end;
end;
 
procedure TMainForm.c02t03(von, an: string);
var
daten: textfile;
lev, i, j: integer;
ergebnis, temp: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Lev'+inttostr(lev)+'A1.sav') then
begin
m[1].loadfromfile(von+'\Lev'+inttostr(lev)+'A1.sav');
m[2].loadfromfile(von+'\Lev'+inttostr(lev)+'A2.sav');
m[3].loadfromfile(von+'\Lev'+inttostr(lev)+'A3.sav');
m[4].loadfromfile(von+'\Lev'+inttostr(lev)+'A4.sav');
m[5].loadfromfile(von+'\Lev'+inttostr(lev)+'A5.sav');
m[1].strings[0]:='-624';
if fileexists(an+'\Lev'+inttostr(lev)+'A6.sav') then
begin
assignfile(daten, an+'\Lev'+inttostr(lev)+'A6.sav');
reset(daten);
readln(daten, ergebnis);
temp:=ergebnis;
closefile(daten);
end
else
begin
temp:='30000';
end;
assignfile(daten, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten);
append(daten);
writeln(daten, '; SpaceMission 0.3');
writeln(daten, temp);
for j := 0 to m[1].count-2 do
begin
for i := 0 to m[1].count-2 do
begin
if strtoint(m[1].strings[i]) > strtoint(m[1].strings[i+1]) then
begin
m[1].exchange(i, i+1);
m[2].exchange(i, i+1);
m[3].exchange(i, i+1);
m[4].exchange(i, i+1);
m[5].exchange(i, i+1);
end;
end;
end;
for i := 0 to m[3].count-1 do
begin
for j := 1 to 4 do
begin
if j = 1 then writeln(daten, m[3].strings[i]);
if j = 2 then writeln(daten, m[1].strings[i]);
if j = 3 then writeln(daten, m[2].strings[i]);
if j = 4 then writeln(daten, m[4].strings[i]);
end;
end;
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.c03t04(von, an: string);
var
daten, daten2: textfile;
lev: integer;
ergebniss: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Level '+inttostr(lev)+'.lev') then
begin
assignfile(daten, von+'\Level '+inttostr(lev)+'.lev');
reset(daten);
assignfile(daten2, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten2);
while not seekeof(daten) do
begin
readln(daten, ergebniss);
if ergebniss = '; SpaceMission 0.3' then
begin
writeln(daten2, '; SpaceMission 0.4');
writeln(daten2, '; LEV-File');
end
else
begin
writeln(daten2, ergebniss);
end;
end;
closefile(daten2);
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.c04t10(von, an: string);
var
daten, daten2: textfile;
lev, z, act: integer;
ergebnis: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Level '+inttostr(lev)+'.lev') then
begin
assignfile(daten, von+'\Level '+inttostr(lev)+'.lev');
reset(daten);
assignfile(daten2, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten2);
z := 0;
act := 0;
while not seekeof(daten) do
begin
inc(z);
if z > 2 then inc(act);
if act = 5 then act := 1;
readln(daten, ergebnis);
if ergebnis = '; SpaceMission 0.4' then
writeln(daten2, '; SpaceMission 1.0')
else
begin
if (ergebnis = '30000') and (z = 3) then
writeln(daten2, '1200')
else
begin
//if not (((ergebnis = '0') and (z = 4)) or ((ergebnis = '-624') and (z = 5)) or ((ergebnis = '222') and (z = 6)) or ((ergebnis = '3') and (z = 7))) then
if (z < 4) or (z > 7) then
begin
if act = 4 then
writeln(daten2, inttostr(strtoint(ergebnis) + 32 - (5 * (strtoint(ergebnis) div 37))))
else
writeln(daten2, ergebnis);
end;
end;
end;
end;
closefile(daten2);
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
FDirectory := extractfilepath(paramstr(0));
m[1] := TStringList.create;
m[2] := TStringList.create;
m[3] := TStringList.create;
m[4] := TStringList.create;
m[5] := TStringList.create;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m[1].Free;
m[2].Free;
m[3].Free;
m[4].Free;
m[5].Free;
end;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Eingabe\'), '', '', 1);
end;
 
procedure TMainForm.Button2Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Ausgabe\'), '', '', 1);
end;
 
procedure TMainForm.Button3Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Levels\'), '', '', 1);
end;
 
end.
 
/GamCheat.dfm
0,0 → 1,104
object CheatForm: TCheatForm
Left = 275
Top = 165
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Cheatverwaltung'
ClientHeight = 233
ClientWidth = 313
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 106
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 8
Width = 152
Height = 13
Caption = 'Bitte geben Sie einen Cheat ein!'
end
object Label3: TLabel
Left = 200
Top = 8
Width = 106
Height = 13
Cursor = crHandPoint
Caption = 'Herausgeber anfragen'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = Label3Click
end
object CheatEdit: TEdit
Left = 8
Top = 32
Width = 297
Height = 21
Cursor = crIBeam
Ctl3D = True
ParentCtl3D = False
PasswordChar = '*'
TabOrder = 0
OnKeyPress = CheatEditKeyPress
end
object OKBtn: TButton
Left = 192
Top = 200
Width = 115
Height = 25
Caption = 'OK'
TabOrder = 1
OnClick = OKBtnClick
end
object AbbBtn: TButton
Left = 8
Top = 200
Width = 113
Height = 25
Caption = 'Abbrechen'
TabOrder = 2
OnClick = AbbBtnClick
end
object GroupBox1: TGroupBox
Left = 8
Top = 64
Width = 297
Height = 129
Caption = 'Aktivierte Cheats'
TabOrder = 3
object Label2: TLabel
Left = 8
Top = 104
Width = 83
Height = 13
Cursor = crHandPoint
Caption = 'Cheat deaktiviren'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = Label2Click
end
object CheatBox: TListBox
Left = 8
Top = 24
Width = 281
Height = 73
ItemHeight = 13
TabOrder = 0
end
end
end
/SpaceMission.dpr
8,12 → 8,12
Dialogs,
SysUtils,
MMSystem,
SplMain in 'SplMain.pas' {MainForm},
SplText in 'SplText.pas' {TextForm},
SplSplash in 'SplSplash.pas' {SplashForm},
SplSpeicherung in 'SplSpeicherung.pas' {SpeicherungForm},
SplInfo in 'SplInfo.pas' {InfoForm},
SplCheat in 'SplCheat.pas' {CheatForm},
GamMain in 'GamMain.pas' {MainForm},
ComText in 'ComText.pas' {TextForm},
GamSplash in 'GamSplash.pas' {SplashForm},
GamSpeicherung in 'GamSpeicherung.pas' {SpeicherungForm},
ComInfo in 'ComInfo.pas' {InfoForm},
GamCheat in 'GamCheat.pas' {CheatForm},
Global in 'Global.pas';
 
{$R *.RES}
/GamSpeicherung.pas
0,0 → 1,336
unit GamSpeicherung;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin;
 
type
TSpeicherungForm = class(TForm)
Bevel1: TBevel;
LadenBtn: TButton;
LoeschenBtn: TButton;
AktualisierenBtn: TButton;
SpeichernBtn: TButton;
AbbrechenBtn: TButton;
LevelListBox: TListBox;
Label2: TLabel;
Label3: TLabel;
Label1: TLabel;
LevelName: TEdit;
ElPanel1: TPanel;
li4a: TLabel;
li1: TLabel;
li3b: TLabel;
li3a: TLabel;
li4b: TLabel;
liu: TLabel;
liw: TLabel;
li2a: TLabel;
li2b: TLabel;
procedure LoeschenBtnClick(Sender: TObject);
procedure LadenBtnClick(Sender: TObject);
procedure SpeichernBtnClick(Sender: TObject);
procedure LevelListBoxClick(Sender: TObject);
procedure LevelNameChange(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DsFancyButton2Click(Sender: TObject);
procedure AbbrechenBtnClick(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure LevelListBoxDblClick(Sender: TObject);
public
procedure SearchSaves;
end;
 
var
SpeicherungForm: TSpeicherungForm;
 
implementation
 
uses
Global, GamMain;
 
{$R *.DFM}
 
procedure TSpeicherungForm.SearchSaves;
var
sr: TSearchRec;
res: integer;
begin
LevelName.text := '';
LevelListBox.items.clear;
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := true;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
res := FindFirst(fdirectory+'Spielstände\*.sav', 0, sr);
try
while (res = 0) do
begin
if (sr.name <> '.') and (sr.name <> '..') then
LevelListBox.items.Add(copy(sr.Name, 0, length(sr.name)-4));
res := FindNext(sr);
end;
finally
FindClose(sr);
end;
end;
 
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
var
Markiert: boolean;
i: integer;
begin
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if LevelListBox.Selected[i] then Markiert := true;
end;
if not Markiert then exit;
if MessageDlg('Diesen Spielstand wirklich löschen?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
deletefile(FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
searchsaves;
end;
end;
 
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
var
Markiert: boolean;
i: integer;
SavGame: textfile;
begin
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if LevelListBox.Selected[i] then Markiert := true;
end;
if not Markiert then exit;
if LevelListBox.items.count = 0 then
begin
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
end;
{if liu.visible or (LevelListBox.items.count=0) then
exit;}
AssignFile(SavGame, FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
Reset(SavGame);
ReadLN(SavGame);
ReadLN(SavGame);
ReadLN(SavGame, mainform.FScore);
ReadLN(SavGame, mainform.FLife);
ReadLN(SavGame, mainform.Flevel);
ReadLN(SavGame, mainform.FMenuItem);
CloseFile(SavGame);
mainform.playsound('SceneMov', false);
mainform.FNextScene := gsNewLevel;
mainform.FCheat := false;
close;
end;
 
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
var
SavGame: textfile;
i: integer;
begin
if Levelname.text = '' then
begin
MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
LevelName.setfocus;
exit;
end;
for i := 0 to length(LevelName.text) do
begin
if (copy(LevelName.text, i, 1) = '\') or
(copy(LevelName.text, i, 1) = '/') or
(copy(LevelName.text, i, 1) = ':') or
(copy(LevelName.text, i, 1) = '*') or
(copy(LevelName.text, i, 1) = '?') or
(copy(LevelName.text, i, 1) = '"') or
(copy(LevelName.text, i, 1) = '<') or
(copy(LevelName.text, i, 1) = '>') or
(copy(LevelName.text, i, 1) = '|') then
begin
MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
LevelName.setfocus;
exit;
end;
end;
if LevelListBox.items.IndexOf(LevelName.text) > -1 then
begin
if MessageDlg('Spielstand ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
exit;
end;
AssignFile(SavGame, FDirectory+'Spielstände\'+LevelName.text+'.sav');
Rewrite(SavGame);
WriteLN(SavGame, '; SpaceMission '+FCompVersion);
WriteLN(SavGame, '; SAV-File');
WriteLN(SavGame, mainform.FScore);
WriteLN(SavGame, mainform.FLife);
WriteLN(SavGame, mainform.FLevel);
WriteLN(SavGame, mainform.FMenuItem);
CloseFile(SavGame);
SearchSaves;
end;
 
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
var
Ergebniss: String;
SavGame: textfile;
Punkte, Leben, Level, Art: integer;
begin
ladenbtn.enabled := true;
loeschenbtn.enabled := true;
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
begin
ladenbtn.enabled := false;
loeschenbtn.enabled := false;
liw.visible := true;
exit;
end;
LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
AssignFile(SavGame, FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
Reset(SavGame);
ReadLN(SavGame, Ergebniss);
if Ergebniss <> '; SpaceMission '+FCompVersion then
begin
liu.visible := true;
ladenbtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, Ergebniss);
if Ergebniss <> '; SAV-File' then
begin
liu.visible := true;
ladenbtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, Punkte);
ReadLN(SavGame, Leben);
ReadLN(SavGame, Level);
ReadLN(SavGame, Art);
CloseFile(SavGame);
li1.visible := true;
li2a.visible := true;
li2b.visible := true;
li3a.visible := true;
li3b.visible := true;
li4a.visible := true;
li4b.visible := true;
if Art = 1 then
li1.caption := 'Das Level ist ein normales Level.'
else
li1.caption := 'Das Level ist ein Zufallslevel.';
li3b.caption := inttostr(Level);
li4b.caption := inttostr(Leben);
li2b.caption := inttostr(Punkte);
end;
 
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
begin
//listbox1.Items.indexof('Level '+spinedit1.text);
end;
 
procedure TSpeicherungForm.Button4Click(Sender: TObject);
begin
mainform.dxtimer.enabled := not mainform.gamepause.checked;
close;
end;
 
procedure TSpeicherungForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
SearchSaves;
if mainform.FNotSave then
begin
label1.enabled := false;
LevelName.enabled := false;
SpeichernBtn.enabled := false;
end
else
begin
label1.enabled := true;
LevelName.enabled := true;
SpeichernBtn.enabled := true;
end;
end;
 
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
begin
SearchSaves;
end;
 
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
begin
close;
end;
 
procedure TSpeicherungForm.FormHide(Sender: TObject);
begin
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
begin
LadenBtn.click;
end;
 
end.
 
/_Projektgruppe.bdsgroup
8,13 → 8,11
<Option Name="GUID">{637A9A64-27A5-4C05-A11F-C60A2B40C1DB}</Option>
</Option>
</PersonalityInfo>
<Default.Personality>
<Projects>
<Default.Personality> <Projects>
<Projects Name="LevEdit.exe">LevEdit.bdsproj</Projects>
<Projects Name="SpaceMission.exe">SpaceMission.bdsproj</Projects>
<Projects Name="Compiler.exe">Compiler.bdsproj</Projects>
<Projects Name="Targets">LevEdit.exe SpaceMission.exe Compiler.exe</Projects>
<Projects Name="Converter.exe">Converter.bdsproj</Projects>
<Projects Name="Targets">LevEdit.exe SpaceMission.exe Converter.exe</Projects>
</Projects>
<Dependencies/>
</Default.Personality>
/ComInfo.dfm
0,0 → 1,131
object InfoForm: TInfoForm
Left = 289
Top = 184
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 193
ClientWidth = 321
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnCreate = FormCreate
PixelsPerInch = 106
TextHeight = 13
object HomeLbl: TLabel
Left = 32
Top = 136
Width = 48
Height = 13
Caption = 'Webseite:'
Transparent = True
end
object Image: TImage
Left = 8
Top = 8
Width = 65
Height = 57
Center = True
Stretch = True
end
object FirmaLbl: TLabel
Left = 88
Top = 8
Width = 74
Height = 13
Caption = 'ViaThinkSoft'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
Transparent = True
end
object NameLbl: TLabel
Left = 104
Top = 24
Width = 66
Height = 13
Caption = 'SpaceMission'
Transparent = True
end
object VersionLbl: TLabel
Left = 232
Top = 24
Width = 35
Height = 13
Caption = 'Version'
Transparent = True
end
object EMailLbl: TLabel
Left = 32
Top = 120
Width = 32
Height = 13
Caption = 'E-Mail:'
Transparent = True
end
object CopyrightLbl: TLabel
Left = 8
Top = 80
Width = 137
Height = 13
Caption = '(C) 2001 - 2011 ViaThinkSoft'
Transparent = True
end
object Copyright2Lbl: TLabel
Left = 8
Top = 96
Width = 117
Height = 13
Caption = 'Alle Rechte vorbehalten!'
Transparent = True
end
object URL2: TLabel
Left = 152
Top = 136
Width = 117
Height = 13
Cursor = crHandPoint
Caption = 'www.daniel-marschall.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL2Click
end
object URL1: TLabel
Left = 152
Top = 120
Width = 155
Height = 13
Cursor = crHandPoint
Caption = 'daniel-marschall@viathinksoft.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL1Click
end
object OkBtn: TButton
Left = 208
Top = 160
Width = 107
Height = 25
Caption = 'OK'
TabOrder = 0
OnClick = OkBtnClick
end
end
/Converter.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SpaceMission.bdsproj
172,8 → 172,7
<VersionInfoKeys Name="Homepage">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
<VersionInfoKeys Name="Webseite">www.viathinksoft.de</VersionInfoKeys>
</VersionInfoKeys>
<Excluded_Packages>
</VersionInfoKeys> <Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIntraweb_80_100.bpl">Intraweb 8.0 Design Package for Borland Development Studio 2006</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
/CnvMain.dfm
0,0 → 1,114
object MainForm: TMainForm
Left = 268
Top = 153
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'SpaceMission Levelconverter'
ClientHeight = 201
ClientWidth = 345
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnClose = FormClose
OnCreate = FormCreate
PixelsPerInch = 106
TextHeight = 13
object Bevel1: TBevel
Left = 8
Top = 136
Width = 329
Height = 2
Shape = bsBottomLine
end
object Label1: TLabel
Left = 8
Top = 8
Width = 301
Height = 26
Caption =
'Der SpaceMission Levelconverter wandelt die Levels Ihrer alten'#13#10 +
'SpaceMission-Version in die aktuelle Version 1.0 / 1.1 um.'
Transparent = True
end
object Label2: TLabel
Left = 8
Top = 184
Width = 322
Height = 13
Caption =
'Die korrekte Umschreibung der Levels kann nicht garantiert werde' +
'n!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clMaroon
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Run: TButton
Left = 176
Top = 96
Width = 161
Height = 25
Caption = 'Converter starten'
Default = True
TabOrder = 0
OnClick = RunClick
end
object Button1: TButton
Left = 8
Top = 152
Width = 105
Height = 25
Caption = 'Eingabeordner'
TabOrder = 1
OnClick = Button1Click
end
object Button2: TButton
Left = 120
Top = 152
Width = 105
Height = 25
Caption = 'Ausgabeordner'
TabOrder = 2
OnClick = Button2Click
end
object Button3: TButton
Left = 232
Top = 152
Width = 105
Height = 25
Caption = 'Levelordner'
TabOrder = 3
OnClick = Button3Click
end
object comb: TComboBox
Left = 8
Top = 96
Width = 161
Height = 21
Style = csDropDownList
ItemHeight = 13
TabOrder = 4
Items.Strings = (
'Version 0.2 --> Version 0.3'
'Version 0.2 --> Version 0.4'
'Version 0.3 --> Version 0.4'
'Version 0.4 --> Version 1.0'
'Version 0.2 --> Version 1.0'
'Version 0.3 --> Version 1.0')
end
object gauge: TProgressBar
Left = 8
Top = 48
Width = 329
Height = 33
Smooth = True
TabOrder = 5
end
end
/GamSpeicherung.dfm
0,0 → 1,205
object SpeicherungForm: TSpeicherungForm
Left = 280
Top = 152
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Spielst'#228'nde'
ClientHeight = 425
ClientWidth = 451
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 106
TextHeight = 13
object Bevel1: TBevel
Left = 8
Top = 56
Width = 433
Height = 2
Shape = bsBottomLine
end
object Label2: TLabel
Left = 8
Top = 72
Width = 58
Height = 13
Caption = 'Spielst'#228'nde:'
end
object Label3: TLabel
Left = 8
Top = 336
Width = 67
Height = 13
Caption = 'Informationen:'
end
object Label1: TLabel
Left = 8
Top = 20
Width = 78
Height = 13
Caption = 'Spielstandname:'
Enabled = False
end
object LadenBtn: TButton
Left = 336
Top = 72
Width = 105
Height = 25
Caption = '&Laden'
Enabled = False
TabOrder = 0
OnClick = LadenBtnClick
end
object LoeschenBtn: TButton
Left = 336
Top = 104
Width = 105
Height = 25
Caption = 'L'#246'&schen'
Enabled = False
TabOrder = 1
OnClick = LoeschenBtnClick
end
object AktualisierenBtn: TButton
Left = 336
Top = 144
Width = 105
Height = 25
Caption = '&Aktualisieren'
TabOrder = 2
OnClick = DsFancyButton2Click
end
object SpeichernBtn: TButton
Left = 336
Top = 16
Width = 105
Height = 25
Caption = '&Speichern'
Enabled = False
TabOrder = 3
OnClick = SpeichernBtnClick
end
object AbbrechenBtn: TButton
Left = 336
Top = 392
Width = 105
Height = 25
Cancel = True
Caption = 'Schli&e'#223'en'
Default = True
ModalResult = 1
TabOrder = 4
OnClick = AbbrechenBtnClick
end
object LevelListBox: TListBox
Left = 112
Top = 72
Width = 201
Height = 249
ItemHeight = 13
TabOrder = 5
OnClick = LevelListBoxClick
OnDblClick = LevelListBoxDblClick
end
object LevelName: TEdit
Left = 112
Top = 16
Width = 201
Height = 21
Enabled = False
TabOrder = 6
end
object ElPanel1: TPanel
Left = 112
Top = 336
Width = 201
Height = 81
BevelOuter = bvLowered
Color = clWindow
TabOrder = 7
object li4a: TLabel
Left = 8
Top = 56
Width = 33
Height = 13
Caption = 'Leben:'
end
object li1: TLabel
Left = 8
Top = 8
Width = 17
Height = 13
Caption = 'n/a'
end
object li3b: TLabel
Left = 96
Top = 40
Width = 17
Height = 13
Caption = 'n/a'
end
object li3a: TLabel
Left = 8
Top = 40
Width = 29
Height = 13
Caption = 'Level:'
end
object li4b: TLabel
Left = 96
Top = 56
Width = 17
Height = 13
Caption = 'n/a'
end
object liu: TLabel
Left = 8
Top = 8
Width = 156
Height = 13
Caption = 'Der Spielstand ist nicht einlesbar!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clMaroon
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Visible = False
end
object liw: TLabel
Left = 8
Top = 8
Width = 139
Height = 13
Caption = 'W'#228'hlen Sie einen Spielstand.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clNavy
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Visible = False
end
object li2a: TLabel
Left = 8
Top = 24
Width = 37
Height = 13
Caption = 'Punkte:'
end
object li2b: TLabel
Left = 96
Top = 24
Width = 17
Height = 13
Caption = 'n/a'
end
end
end
/LevMain.pas
111,7 → 111,7
implementation
 
uses
Global, LevSplash, LevSpeicherung, LevText, SplInfo, LevSource, LevOptions;
Global, LevSplash, LevSpeicherung, ComText, ComInfo, LevSource, LevOptions;
 
const
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
448,13 → 448,14
begin
MessageDLG('Die Datei "Texte\Mitwirkende.txt" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!',
mtWarning, [mbOK], 0);
end
else
begin
exit;
end;
 
TextForm.memo1.lines.loadfromfile(FDirectory+'Texte\Mitwirkende.txt');
mainform.dxtimer.enabled := false;
TextForm.showmodal;
mainform.dxtimer.enabled := true;
end;
end;
 
procedure TMainForm.LevelClick(Sender: TObject);
begin
472,7 → 473,9
 
procedure TMainForm.InformationenClick(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
InfoForm.showmodal;
mainform.dxtimer.enabled := true;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
/Converter.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevMain.dfm
4,7 → 4,7
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Leveleditor'
ClientHeight = 536
ClientHeight = 558
ClientWidth = 753
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
265,7 → 265,7
end
object StatusBar: TStatusBar
Left = 0
Top = 517
Top = 539
Width = 753
Height = 19
Panels = <>
/GamSplash.pas
0,0 → 1,32
unit GamSplash;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls, StdCtrls;
 
type
TSplashForm = class(TForm)
SplashImage: TImage;
procedure FormCreate(Sender: TObject);
end;
 
var
SplashForm: TSplashForm;
 
implementation
 
{$R *.DFM}
 
procedure TSplashForm.FormCreate(Sender: TObject);
var
FDirectory: string;
begin
if copy(extractfiledir(application.ExeName), length(extractfiledir(application.ExeName))-1, 2) = ':\' then FDirectory := ''
else FDirectory := extractfiledir(application.ExeName)+'\';
SplashImage.Picture.loadfromfile(FDirectory+'Bilder/SplSplash.jpg');
end;
 
end.
 
/ComText.pas
0,0 → 1,29
unit ComText;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
 
type
TTextForm = class(TForm)
OKBtn: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
 
var
TextForm: TTextForm;
 
implementation
 
{$R *.DFM}
 
procedure TTextForm.Button1Click(Sender: TObject);
begin
close;
end;
 
end.
 
/SpaceMission.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream