home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* WESP + Weltraumspringen *)
- (* (C) 1990 Thomas Perner, Gerald Arend & toolbox *)
- (* Compiler: Turbo Pascal ab 5.0 *)
- (* ====================================================== *)
-
- PROGRAM Wesp;
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
- {$M 4000,0,100000}
-
- USES
- Crt, Dos, Graph;
-
- CONST
- AnzMaxRaeume = 99;
- AnzLevel = 99;
- LevelFileName: STRING = 'WESP.LEV';
-
- TYPE
- Str20 = STRING[20];
- Str80 = STRING[80];
- HiScoreTyp = RECORD { High-Scores }
- Name: Str20;
- Punkte: WORD;
- END;
- GrafikTyp = (EGAScr, CGAScr, HERCScr);
- FlaechenTyp = RECORD { Parameter Flächen }
- Rahmen, Flaeche,
- FillType: ARRAY[1..4] OF BYTE;
- END;
- DatenRec = RECORD { Daten für Level }
- Zeile: ARRAY[1..8] OF BYTE;
- x,y : BYTE;
- END;
- DatenArray = RECORD
- Kennung: STRING[10];
- Level: ARRAY[1..AnzMaxRaeume] OF DatenRec; { Alle Level }
- END;
-
- CONST
- Flaechen: ARRAY[EGAScr..HERCScr] OF FlaechenTyp = { Parameter Flächen }
- ((Rahmen: (14,5,7,15); Flaeche: (12,14,10,9); FillType: (1,1,1,1)),
- (Rahmen: (1,1,2,2); Flaeche: (2,3,1,3); FillType: (1,1,1,1)),
- (Rahmen: (1,1,1,1); Flaeche: (1,1,1,1); FillType: (1,1,1,1)));
- Punkte: WORD = 0;
- Start_Ebene: BYTE = 1;
- Zeitspeicher: WORD = 0;
- Schwarz = 0; { Farben für CGA }
- Gruen = 1;
- Rot = 2;
- Gelb = 3;
- AnzSterne = 600;
- GameOver: STRING[8] = 'GAMEOVER';
-
- VAR
- Treiber, Modus: INTEGER;
- TreiberTyp: GrafikTyp;
- Figur, Leer: POINTER;
- FeldHintergrund: ARRAY[1..8, 1..8] OF POINTER; { Für die Hintergründe }
- AnzBilder, BildZeiger: BYTE;
- BildName: ARRAY[1..50] OF STRING[12]; { Dateinamen der Bilder }
- BildNr,
- PCXFrequenz: BYTE; { Alle wieviel Level soll ein PCX-Bild geladen werden? }
- Ext: STRING[3];
- BilderVorhanden, BildGeladen: BOOLEAN;
- BildDatei: FILE OF DatenArray;
- BildDaten: DatenArray;
- MultX, MultY,
- OffsetX, OffsetY,
- OffsetFigurX, OffsetFigurY,
- Figur_Spalte, Figur_Zeile,
- FigBreite, FigTiefe, FigHoehe,
- FBreite, FTiefe, FHoehe: INTEGER;
- Anzahl_Felder, Felder_Vernichtet: BYTE;
- FeldGesetzt: ARRAY[-1..10, -1..10] OF BOOLEAN;
- HiScoreDatei: FILE OF HiScoreTyp;
- HiScoreListe: ARRAY[0..12] OF HiScoreTyp;
- Eintrag: HiScoreTyp;
- Punkte_Str: STRING[5];
- Ebene_Str, Zeit_Str: STRING[3];
- Sterne: ARRAY[1..AnzSterne] OF PointType;
- I, J, X, Y: INTEGER;
- Ende: BOOLEAN;
- Dummy: STRING[6];
- Hilfe: str80;
- Schrift, Hell, Hintergrund, Header, Taste, Ebene, Zeit,
- A, TastByteAlt: BYTE;
- Regs: REGISTERS;
- TastByte: BYTE ABSOLUTE $0040:$0017; { Tastatur-Status-Byte }
- ZZ: WORD;
- SoundOn: BOOLEAN;
-
- PROCEDURE MakeAstronaut(Ofx, Ofy: INTEGER;
- FX, FY, Hell, Mittel, Dunkel: BYTE);
- CONST
- Astronaut: ARRAY[1..47] OF STRING[20] =
- (' * ',
- ' * * ',
- ' * * ',
- ' * * ',
- ' * * ',
- ' ****** * ',
- ' *------** ',
- ' *--------* ',
- ' *******---** ',
- ' * *-*** ',
- ' * *-*** ',
- ' * *-*** ',
- ' * *---* ',
- ' *****----* ',
- ' **------* ',
- ' ************** ',
- ' ***-------*-----* ',
- ' *-*-------*------* ',
- ' *-*-------*-***---*',
- ' *-*-------**---**-*',
- '*--*-------*------**',
- '*--*---**-****----* ',
- '****--*--*----*---* ',
- '*--*-*---*----*---* ',
- '*--*--*---*---*--* ',
- '*--*-*----*----** ',
- ' ****-*---*---*-* ',
- ' *****-*****--* ',
- ' *--**-*--------* ',
- ' *---*----------* ',
- ' *----*--------* ',
- ' *----*-------** ',
- ' **----**-----** ',
- ' ***--**-*****-* ',
- ' *-**--***---* ',
- ' *****-*-**--* ',
- ' ***** ******* ',
- ' *.....* *.......* ',
- '*......* *.......* ',
- '*.....* *.......* ',
- ' ***** ******* ',
- ' *** *** ',
- ' * * ',
- ' * *** *** * ',
- ' **** **** ',
- ' * * ',
- ' *** *** ');
-
- PROCEDURE Punkt(x, y: INTEGER; col: WORD);
- VAR
- xx, yy: INTEGER;
- BEGIN
- IF FX=1 THEN
- BEGIN
- PutPixel(OfX+x,OfY+y,col);
- exit;
- END;
- SetFillStyle(SolidFill, col);
- SetColor(col);
- Bar(FX*x+OfX, FY*y+OfY, FX*x+OfX+FX-1, FY*y+OfY+FY-1);
- END;
-
- VAR
- z, n: BYTE;
- BEGIN
- FOR z:=1 to 47 DO
- FOR n:=1 to 20 DO
- CASE Astronaut[z,n] OF
- '*': Punkt(n, z, Hell);
- '.': Punkt(n, z, Dunkel);
- '-': Punkt(n, z, Mittel);
- END;
- END;
-
- PROCEDURE Draw_Flaeche(x, y, Breite, Tiefe, Hoehe, ColRand, { Eine Fläche }
- ColFlaeche: INTEGER; FillStyle: BYTE); { zeichnen }
- BEGIN
- Inc(y, Tiefe+Hoehe);
- SetColor(ColRand);
- SetFillStyle(FillStyle, ColFlaeche);
- Bar3D(X, Y, X+Breite, Y-Hoehe, Tiefe, TopOn);
- FloodFill(X+Breite+2, Y-2, ColRand);
- FloodFill(X+Breite+2, Y-Hoehe-2, ColRand);
- IF Treiber=HercMono THEN { Schwarzer Rahmen für Hercules }
- BEGIN
- SetColor(Hintergrund);
- Bar3D(X, Y, X+Breite, Y-Hoehe, Tiefe, TopOn);
- END;
- END;
-
- PROCEDURE Create_Sprites; { Figur und "Lochmaske" als Image speichern }
- BEGIN
- FigBreite:=GetMaxX div 40; { Maße Figur }
- FigHoehe:=GetMaxY div 90;
- FigTiefe:=GetMaxY div 40;
- SetFillStyle(SolidFill, GetMaxColor);
- Bar(0, 0, FBreite+FTiefe, FBreite+FHoehe);
- Draw_Flaeche(0, 0, FigBreite, FigTiefe, FigHoehe,
- Schrift, Hintergrund, SolidFill);
- ZZ:=ImageSize(0, 0, FigBreite+FigTiefe, FigTiefe+FigHoehe);
- GetMem(Figur, ZZ);
- GetImage(0, 0, FigBreite+FigTiefe, FigTiefe+FigHoehe, Figur^);
- OffsetFigurX:=3*FigBreite div 4+1;
- OffsetFigurY:=FigTiefe div 2+1;
- ClearDevice;
- SetFillStyle(SolidFill, GetMaxColor);
- Bar(0, 0, FBreite+FTiefe, FBreite+FHoehe);
- Draw_Flaeche(0, 0, FBreite, FTiefe, FHoehe, { "Lochmaske" zeichnen }
- Hintergrund, Hintergrund, SolidFill);
- ZZ:=ImageSize(0, 0, FBreite+FTiefe, FTiefe+FHoehe);
- GetMem(Leer, ZZ);
- GetImage(0, 0, FBreite+FTiefe, FTiefe+FHoehe, Leer^);
- END;
-
- PROCEDURE Schreibe(Spalte, Zeile: WORD; { Textausgabe im Grafikmodus }
- Text: Str80; Farbe: BYTE);
- BEGIN
- Y:=TextHeight(Text)*5 DIV 4;
- X:=TextWidth(Text);
- SetFillStyle(SolidFill, Hintergrund); { Hintergrund löschen }
- Bar(Spalte, Zeile, Spalte+X, Zeile+Y);
- SetColor(Farbe);
- OutTextXY(Spalte, Zeile, Text);
- END;
-
- PROCEDURE Vorbereitungen; { Diverse Dinge erledigen }
- VAR
- DirInfo: SearchRec; { Zum Suchen der Bilddateien }
- BEGIN
- Assign(HiScoreDatei, 'WESP.DAT'); { Hi-Scores laden... }
- Reset(HiScoreDatei);
- IF IOResult=0 THEN
- BEGIN
- FOR I:=1 TO 10 DO
- BEGIN
- Read(HiScoreDatei, Eintrag);
- HiScoreListe[I]:=Eintrag;
- END;
- Close(HiScoreDatei);
- END
- ELSE
- FOR I:=1 TO 10 DO { ...oder neu erstellen }
- BEGIN
- HiScoreListe[I].Name:='Nobody';
- HiScoreListe[I].Punkte:=110-I*10;
- END;
- Treiber:=Detect;
- DetectGraph(Treiber, Modus);
- CASE Treiber OF { Variablen auf Grafikkarte anpassen }
- EGA,
- VGA: BEGIN
- Treiber:=EGA;
- Modus:=EGAHi;
- Schrift:=LightGray;
- Hell:=LightRed;
- Hintergrund:=Black;
- Header:=LightMagenta;
- A:=1;
- TreiberTyp:=EGAScr;
- Ext:='EGA';
- END;
- HercMono:
- BEGIN
- Treiber:=HercMono;
- Modus:=HercMonoHi;
- Schrift:=1;
- Hell:=1;
- Header:=1;
- Hintergrund:=Black;
- A:=1;
- TreiberTyp:=HERCScr;
- Ext:='HGC';
- END;
- MCGA,
- CGA: BEGIN
- Treiber:=CGA;
- Modus:=CGAC0;
- Schrift:=Rot;
- Hell:=Gruen;
- Header:=Gelb;
- Hintergrund:=Schwarz;
- A:=2;
- TreiberTyp:=CGAScr;
- EXT:='CGA';
- END;
- ELSE { Hoppla! }
- writeln(^G, 'Was haben Sie denn für eine Grafikkarte?');
- writeln(#10#13, 'Sorry - die kenne ich leider nicht!');
- Halt;
- END;
- InitGraph(Treiber, Modus, '');
- IF GraphResult<>0 THEN
- BEGIN { Nicht vergessen! }
- writeln(^G,'Wo haben Sie denn Ihre BGI-Treiber?'#10#13);
- writeln('Bitte schnell in mein Verzeichnis damit!');
- Halt;
- END;
- SetTextJustify(LeftText, TopText);
- CheckBreak:=FALSE;
- TastByteAlt:=TastByte; { NumLock einschalten }
- TastByte:=TastByte OR 32; { LED bleibt evtl. unbeeinflusst! }
- FBreite:=GetMaxX div 20; { Maße der Flächen }
- FHoehe:=GetMaxY div 45;
- FTiefe:=GetMaxY div 20;
- MultX:=FBreite+FTiefe+1; { Multiplikatoren x und y }
- MultY:=FTiefe+FHoehe+1;
- ZZ:=ImageSize(0, 0, MultX-1, MultY-1);
- FOR I:=1 to 8 DO
- FOR J:=1 to 8 DO
- GetMem(FeldHintergrund[I, J], ZZ); { Speicher für den Hintergrund }
- OffsetX:=(GetMaxX-8*MultX) div 2+3*MultX div 2; { Verschiebung der Flächen }
- OffsetY:=(GetMaxY-MultY*8) div 2;
- Create_Sprites;
- BildNr:=1; { Dateinamen der Bildfiles einlesen }
- FindFirst('*.'+Ext, Archive, DirInfo);
- BildZeiger:=1;
- while (DosError=0) AND (BildZeiger<50) DO
- BEGIN
- BildName[BildZeiger]:=DirInfo.Name;
- FindNext(DirInfo);
- Inc(BildZeiger);
- END;
- AnzBilder:=Pred(BildZeiger); { So viele Bilder gibt es }
- BilderVorhanden:=AnzBilder>0;
- END;
-
- PROCEDURE Plattform(Spalte, Zeile: BYTE; Zeichnen: BOOLEAN);{ Fläche zeichnen }
- VAR
- n: BYTE;
- BEGIN
- X:=Spalte*MultX-Zeile*MultY+OffsetX;
- Y:=Zeile*MultY+OffsetY;
- FeldGesetzt[Spalte, Zeile]:=Zeichnen; { Wichtig: Array setzen! }
- IF Zeichnen THEN
- BEGIN
- GetImage(X, Y, X+MultX-1, Y+MultY-1, { Stück Hintergrund sichern }
- FeldHintergrund[Spalte, Zeile]^);
- PutImage(X, Y, Leer^, AndPut); { "Lochmaske" draufkopieren... }
- n:=(Spalte+Zeile) mod 4+1;
- Draw_Flaeche(x, y, FBreite, FTiefe, FHoehe, { ...und erst jetzt die }
- Flaechen[TreiberTyp].Rahmen[n], { Fläche zeichnen! }
- Flaechen[TreiberTyp].Flaeche[n],
- Flaechen[TreiberTyp].FillType[n]);
- END
- ELSE
- BEGIN
- PutImage(X, Y, FeldHintergrund[Spalte, Zeile]^, { Hintergrund }
- NormalPut); { restaurieren }
- END;
- END;
-
- PROCEDURE Ton(F: WORD); { ...damit man auch leise spielen kann! }
- BEGIN
- IF SoundOn THEN
- Sound(F);
- END;
-
- PROCEDURE Piep; { Pieps! }
- VAR
- S: WORD;
- BEGIN
- S:=100;
- WHILE S<2000 DO
- BEGIN
- Ton(S);
- Delay(6);
- INC(S, 100);
- END;
- NoSound;
- END;
-
- PROCEDURE Spielfigur(Spalte, Zeile: BYTE); { Spielfigur auf Fläche zeichnen }
- BEGIN
- X:=Spalte*MultX-Zeile*MultY+OffsetX+OffsetFigurX;
- Y:=Zeile*MultY+OffsetY+OffsetFigurY;
- PutImage(X, Y, Figur^, AndPut);
- IF I=1 THEN { Ton für einen einfachen... }
- BEGIN
- Ton(150);
- Delay(1);
- NoSound;
- Delay(1);
- Ton(100);
- Delay(1);
- NoSound;
- END
- ELSE
- Piep; { ... und für einen doppelten Sprung }
- END;
-
- PROCEDURE DrawSterne; { Sternenhimmel zeichnen }
- BEGIN
- FOR I:=1 TO AnzSterne DO
- BEGIN
- REPEAT
- x:=Random(GetMaxX);
- y:=Random(GetMaxY);
- UNTIL GetPixel(x, y)=Hintergrund;
- Sterne[I].x:=x;
- Sterne[I].y:=y;
- PutPixel(Sterne[I].x, Sterne[I].y,
- Succ(Random(GetMaxColor)));
- END;
- END;
-
- PROCEDURE Sternenflimmern; { Der Romantik wegen: Sterne bunt flimmern lassen }
- VAR
- n: WORD;
- BEGIN
- n:=Succ(Random(AnzSterne));
- PutPixel(Sterne[n].x, Sterne[n].y,
- Random(Succ(GetMaxColor)));
- END;
-
- PROCEDURE GetParameter; { Kommandozeilenparameter auswerten }
- VAR
- Error: INTEGER;
- n: BYTE;
- P: ARRAY [1..2] OF STRING;
- BEGIN
- PCXFrequenz:=2; { Normalerweise: Jede 2. Runde mit PCX-Bild }
- IF ParamCount>0 THEN
- BEGIN
- P[1]:=ParamStr(1);
- IF ParamCount>1 THEN
- P[2]:=ParamStr(2)
- ELSE
- P[2]:='';
- IF P[1][1]='?' THEN
- BEGIN
- writeln(^G, 'Falsche(r) Parameter!');
- writeln;
- writeln('Erlaubte Parameter für WESP +');
- writeln('=============================');
- writeln;
- writeln('Wenn Sie mit einem anderen Datenfile als WESP.LEV spielen möchten,');
- writeln('dann geben sie den Namen dieser HiScoreDatei einfach als Parameter an.');
- writeln('Eine Pfadangabe darf auch enthalten sein!');
- writeln;
- writeln('Beispiel: WESP C:\SPIELE\SCHWER.LEV');
- writeln;
- writeln('Außerdem können Sie selbst bestimmen, in welchen Levels jeweils');
- writeln('ein neues PCX-Bild geladen werden soll. Dazu müssen Sie nur einen');
- writeln('Schrägstrich (/), gefolgt von einer Zahl n zwischen 0 und 10 angeben.');
- writeln('Alle n Runden wird dann ein Hintergrundbild geladen.');
- writeln;
- writeln('Beispiel: WESP /2 (entspricht dem Default-Wert)');
- writeln;
- writeln('Der Parameter "/0" unterbindet das Einladen von PCX-Hintergründen.');
- Halt;
- END;
-
- FOR n:=1 to 2 DO
- IF P[n][1]<>'/' THEN
- BEGIN
- IF P[n]>'' THEN
- LevelFileName:=P[n]; { Level nicht aus "WESP.LEV" laden }
- END
- ELSE
- BEGIN
- P[n][1]:=' ';
- Val(P[n], PCXFrequenz, Error);
- IF Error<>0 THEN
- PCXFrequenz:=2;
- END;
- IF PCXFrequenz>50 THEN
- PCXFrequenz:=50;
- IF PCXFrequenz<0 THEN
- PCXFrequenz:=0;
- END;
- END;
-
- PROCEDURE Load_BackGround; { Organisiert das Laden der PCX-Bilder }
- VAR
- Name: STRING[12];
- BEGIN
- BildGeladen:=FALSE;
- IF not BilderVorhanden OR (PCXFrequenz=0) OR
- (Pred(Ebene) mod PCXFrequenz<>0) THEN
- exit;
- BildZeiger:=((Pred(Ebene) div PCXFrequenz) mod AnzBilder)+1;
- Name:=BildName[BildZeiger];
- SwapVectors;
- Exec('SHOW.EXE', Name+' /S'); { Muß im gleichen Verzeichnis stehen! }
- SwapVectors;
- BildGeladen:=TRUE;
- END;
-
- PROCEDURE Tastaturpuffer_loeschen;
- BEGIN
- Regs.AX:=$0C00;
- MsDos(Regs);
- END;
-
- PROCEDURE LoadRunden; { Daten für alle Level auf einmal laden - }
- CONST { es sind ja nur 1000 Bytes! }
- LevelKennung: STRING[10] = 'WESP plus*';
- BEGIN
- {$I-}
- Assign(BildDatei, LevelFileName);
- Reset(BildDatei);
- {$I+}
- IF IOResult<>0 THEN
- BEGIN
- writeln(^G, 'Die Level-Datei ', LevelFileName, ' kann ich nicht öffnen!');
- writeln(#10#13, 'Programm beendet...');
- Halt;
- END;
- {$I-}
- IF FileSize(BildDatei)=1 THEN
- Read(BildDatei, BildDaten);
- {$I+}
- IF (BildDaten.Kennung<>LevelKennung) OR (IOResult<>0) THEN
- BEGIN
- writeln(^G, 'Die Datei ', LevelFileName, ' ist keine Leveldatei für WESP+');
- writeln(#10#13, 'Programm beendet...');
- Halt;
- END;
- Close(BildDatei);
- END;
-
- PROCEDURE Spielfeld_aufbauen(Feld_Nr: BYTE); { Daten für Level aufbereiten }
- CONST { und Flächen zeichnen lassen }
- Wert: ARRAY[1..8] OF BYTE=(128, 64, 32, 16, 8, 4, 2, 1);
- VAR
- x, y: INTEGER;
- BEGIN
- SetGraphMode(Modus); { ...damit die Standardpalette wieder erscheint }
- ClearDevice; { Statuszeile aufbauen }
- IF Feld_Nr>AnzLevel THEN { Alle Level geschafft }
- Exit;
- Dec(Feld_Nr);
- REPEAT { Checken, ob es noch mehr Levels gibt }
- Inc(Feld_Nr);
- UNTIL (BildDaten.Level[Feld_Nr].x>0) OR (Feld_Nr>=AnzMaxRaeume);
- IF BildDaten.Level[Feld_Nr].x=0 THEN { Es gibt keinen weiteren Level! }
- BEGIN
- OutTextXY(GetMaxX div 2-18*TextWidth('L'), GetMaxY div 2,
- 'Keine weiteren Level mehr vorhanden!');
- Write(^G);
- Delay(1000);
- Anzahl_Felder:=0;
- exit;
- END;
- Load_BackGround;
- SetTextStyle(DefaultFont, HorizDir, 1);
- SetFillStyle(EmptyFill, Hintergrund);
- PutPixel(0, 0, Hintergrund); { Setzt geg. wieder korrekte EGA-Plane }
- Bar(0, 0, GetMaxX, TextHeight('X')*5 div 4);
- SetColor(13);
- OutTextXY(1, 1, 'Punkte');
- OutTextXY(250 DIV A+1, 1, 'Bonus');
- OutTextXY(500 DIV A+1, 1, 'Ebene');
- SetColor(15);
- OutTextXY(0, 0, 'Punkte');
- OutTextXY(250 DIV A, 0, 'Bonus');
- OutTextXY(500 DIV A, 0, 'Ebene');
- FOR I:=-1 to 10 DO { Flächenarray für Spiel löschen }
- FOR J:=-1 to 10 DO
- FeldGesetzt[I, J]:=FALSE;
- Anzahl_Felder:=0;
- FOR I:=1 TO 8 DO
- FOR J:=1 TO 8 DO
- IF ((BildDaten.Level[Feld_Nr].Zeile[I] AND Wert[J]) > 0) THEN
- BEGIN
- INC(Anzahl_Felder); { Schön die Anzahl Flächen mitzählen! }
- Plattform(J, I, TRUE);
- END;
- Figur_Spalte:=BildDaten.Level[Feld_Nr].x; { Startposition }
- Figur_Zeile:=BildDaten.Level[Feld_Nr].y;
- TastaturPuffer_Loeschen;
- IF not BildGeladen THEN { Wenn kein Bild, dann wenigstens Sterne }
- DrawSterne;
- END;
-
- PROCEDURE Zeitroutine; { Bonuszeit anzeigen }
- VAR
- Stunde, Minute, Sekunde, Hunderstel: WORD;
- BEGIN
- GetTime(Stunde, Minute, Sekunde, Hunderstel);
- IF (Sekunde<>Zeitspeicher) AND (Zeit>0) THEN
- BEGIN
- Zeitspeicher:=Sekunde;
- DEC(Zeit);
- Str(Zeit, Zeit_Str);
- Schreibe(380 DIV A, 0, Zeit_Str+#32, 15);
- END;
- END;
-
- PROCEDURE SpielEnde;
- BEGIN
- CloseGraph; { Grafik beenden }
- TastByte:=TastByteAlt; { NumLock-Status wiederherstellen }
- Halt;
- END;
-
- PROCEDURE Tastendruck(Blink: BOOLEAN); { Taste holen }
- BEGIN
- Tastaturpuffer_loeschen;
- REPEAT
- IF Blink THEN { Bei der Gelegenheit eventuell gleich die }
- Sternenflimmern; { Sterne blinken lassen }
- UNTIL KeyPressed;
- END;
-
- FUNCTION Eingabe(Zeile, Spalte: WORD; Max: BYTE;
- Zahlen, Blink: BOOLEAN): Str20; { Alle Eingaben }
- BEGIN
- Hilfe:='';
- SetFillStyle(SolidFill, Hintergrund);
- REPEAT
- Schreibe(Spalte, Zeile, Hilfe+#60#32#32#32, Hell);
- Tastendruck(Blink);
- Taste:=Ord(ReadKey);
- IF Taste=0 THEN
- BEGIN
- Taste:=Ord(ReadKey);
- Taste:=0;
- END;
- IF Taste=8 THEN { Backspace }
- Delete(Hilfe, Length(Hilfe), 1);
- IF Zahlen THEN { Zahleneingabe }
- BEGIN
- IF Taste=27 THEN { ESC -> Ende }
- SpielEnde;
- IF (Taste in [48..57]) AND (Max>Length(Hilfe)) THEN
- Hilfe:=Concat(Hilfe, Chr(Taste));
- END
- ELSE { Texteingabe }
- IF (Taste in [32, 48..57, 65..90, 97..122]) AND
- (Max>Length(Hilfe)) THEN
- Hilfe:=Concat(Hilfe, Chr(Taste));
- UNTIL Taste=13;
- Eingabe:=Hilfe
- END;
-
- PROCEDURE Spiel; { Hauptprozedur Spiel }
- BEGIN
- Ebene:=Start_Ebene-1; { Diverse Variablenwerte zurücksetzen }
- Punkte:=0;
- Str(Punkte, Punkte_Str);
- Ende:=FALSE;
- REPEAT { Äußere Schleife: Je ein Level }
- Tastaturpuffer_loeschen;
- INC(Ebene);
- Str(Ebene, Ebene_Str);
- Spielfeld_aufbauen(Ebene);
- IF Anzahl_Felder=0 THEN
- exit;
- Felder_Vernichtet:=0;
- Zeit:=101;
- Str(Zeit, Zeit_Str);
- Schreibe(140 DIV A, 0, Punkte_Str, 15); { Statuszeile }
- Schreibe(380 DIV A, 0, Zeit_Str, 15);
- Schreibe(600 DIV A, 0, Ebene_Str, 15);
- I:=1;
- Spielfigur(Figur_Spalte, Figur_Zeile);
- REPEAT { Innere Schleife: Je ein Spielzug }
- Zeitroutine;
- IF not BildGeladen THEN
- Sternenflimmern;
- IF KeyPressed THEN
- BEGIN { Taste gedrückt }
- I:=1;
- Taste:=Ord(ReadKey);
- CASE Taste OF
- 0: Taste:=Ord(ReadKey);
- 27: BEGIN { ESC }
- Punkte:=0;
- Exit;
- END;
- 83, 115: SoundOn:=Not SoundOn; { <S> zum Umschalten des Sounds }
- END;
- IF Taste In [72, 80, 77, 75, 56, 50, 54, 52] THEN
- BEGIN { Spielzug durchführen }
- Plattform(Figur_Spalte, Figur_Zeile, FALSE); { Fläche löschen }
- INC(Felder_Vernichtet);
- INC(Punkte, 10);
- Str(Punkte, Punkte_Str);
- Schreibe(140 DIV A, 0, Punkte_Str, 15);
- I:=1;
- IF Taste in [72, 80, 77, 75] THEN { Sprungweite }
- I:=2;
- CASE Taste OF
- 83,115: SoundOn:=Not SoundOn;
- 72, 56: DEC(Figur_Zeile, I); { Cursor hoch }
- 80, 50: INC(Figur_Zeile, I); { Cursor runter }
- 77, 54: INC(Figur_Spalte, I); { Cursor rechts }
- 75, 52: DEC(Figur_Spalte, I); { Cursor links }
- END;
- IF not FeldGesetzt[Figur_Spalte, Figur_Zeile]
- AND (Felder_Vernichtet<Anzahl_Felder) THEN
- Ende:=TRUE; { Daneben gehüpft! }
- END;
- IF (Felder_Vernichtet<Anzahl_Felder) AND (Not(Ende))
- THEN
- Spielfigur(Figur_Spalte, Figur_Zeile); { Zug OK }
- END;
- UNTIL Ende OR (Felder_Vernichtet=Anzahl_Felder) OR
- (Ebene>AnzLevel); { Rundenende }
- IF Felder_Vernichtet=Anzahl_Felder THEN
- BEGIN { Runde geschafft }
- INC(Punkte, Zeit);
- Zeit:=0;
- Str(Zeit, Zeit_Str);
- Str(Punkte, Punkte_Str);
- FOR I:=1 TO 3 DO
- BEGIN
- Piep;
- Delay(100);
- END;
- Schreibe(140 DIV A, 0, Punkte_Str, 15);
- Schreibe(380 DIV A, 0, Zeit_Str+#32, 15);
- SetTextStyle(TriplexFont, Horizdir, GetMaxX div 319*2);
- Schreibe(GetMaxX DIV 2-TextWidth('XXXXXXXX'), GetMaxY DIV 2,
- ' RUNDE GESCHAFFT! ', 15);
- Tastendruck(not BildGeladen);
- END;
- UNTIL Ende;
- I:=1000; { Spiel verloren }
- WHILE I>100 DO
- BEGIN
- Ton(Random(I)+100); { C R A S H ! }
- Delay(1);
- DEC(I);
- END;
- NoSound;
-
- FOR J:=1 to 8 DO { Ein letzter Gruß: 8 Flächen mit Game Over anzeigen }
- FOR I:=1 to 8 DO
- IF (I in [3..6]) AND (J in [4, 5]) THEN
- BEGIN
- IF not FeldGesetzt[I, J] THEN
- Plattform(I, J, TRUE);
- END
- ELSE
- IF (FeldGesetzt[I, J]) THEN
- Plattform(I, J, FALSE);
-
- SetTextStyle(DefaultFont, HorizDir, 1);
- SetTextJustify(LeftText, BottomText);
- IF Treiber=CGA THEN
- SetUserCharSize(1, 1, 3, 5);
- SetColor(Hintergrund);
- FOR I:=1 to 2 DO
- FOR J:=1 to 4 DO
- OutTextXY((J+2)*MultX-(I+3)*MultY+OffsetX+2*FBreite div 3,
- (I+3)*MultY+OffsetY+FTiefe+FHoehe-FHoehe-1,
- GameOver[Pred(I)*4+J]);
- TastenDruck(not BildGeladen);
- END;
-
- PROCEDURE Hauptmenue; { Titelbild }
- VAR
- ch: CHAR;
- BEGIN
- SetGraphMode(Modus);
- ClearDevice;
- CASE Treiber OF
- EGA: MakeAstronaut(GetMaxX-100, 3*GetMaxY div 16, 3, 2,
- White, LightBlue, LightRed);
- CGA: MakeAstronaut(GetMaxX-50, 3*GetMaxY div 16, 2, 1,
- 3, 1, 2);
- HercMono: MakeAstronaut(GetMaxX-100, 3*GetMaxY div 16, 4, 2,
- 1, 0, 0);
- END;
- SetColor(Hell);
- Rectangle(0, 0, GetMaxX, GetMaxY);
- SetTextStyle(GothicFont, HorizDir, 1);
- SetTextJustify(LeftText, TopText);
- IF Treiber=CGA THEN { Größe der Überschrift anpassen }
- SetUserCharSize(4, 3, 6, 7)
- ELSE
- SetUserCharSize(5, 2, 5, 3);
- SetColor(Header);
- OutTextXY(GetMaxX DIV 20, 0, 'WESP+');
- SetColor(Schrift);
- OutTextXY(Succ(GetMaxX DIV 20), 1, 'WESP+');
-
- I:=0; { Neuer Hi-Score ? }
- Ende:=FALSE;
- REPEAT
- INC(I);
- IF Punkte>HiScoreListe[I].Punkte THEN
- BEGIN
- IF I<10 THEN
- FOR J:=10 DownTo I DO
- HiScoreListe[J]:=HiScoreListe[J-1];
- HiScoreListe[I].Name:='';
- HiScoreListe[I].Punkte:=Punkte;
- Ende:=TRUE;
- END;
- UNTIL (Ende) OR (I=12);
- CASE Treiber OF { Schrift je nach Auflösung setzen }
- HercMono,
- EGA: BEGIN
- SetTextStyle(TriplexFont, HorizDir, 1);
- SetUserCharSize(3, 4, 2, 3);
- END;
- CGA: BEGIN
- SetTextStyle(DefaultFont, HorizDir, 1);
- SetUserCharSize(1, 3, 1, 3);
- END;
- END;
- OutTextXY(5*GetMaxX DIV 10, GetMaxY DIV 30,
- '(c) ''90 Th. Perner');
- OutTextXY(5*GetMaxX DIV 10, 3*GetMaxY DIV 30,
- ' & t o o l b o x');
- FOR J:=1 TO 10 DO { Hi-Score-Liste anzeigen }
- BEGIN
- y:=GetMaxY DIV 16*(J+2);
- IF J=I THEN
- SetColor(Hell)
- ELSE
- IF Treiber=EGA THEN
- SetColor(11-j)
- ELSE
- SetColor(Schrift);
- Str(J:2, Dummy);
- OutTextXY(GetMaxX DIV 20, y, Dummy);
- OutTextXY(GetMaxX DIV 7, y, HiScoreListe[J].Name);
- Str(HiScoreListe[J].Punkte:5, Dummy);
- OutTextXY(5*GetMaxX DIV 7, y, Dummy);
- END;
-
- IF Ende AND (I<11) THEN
- BEGIN
- SetColor(Hell);
- y:=GetMaxY DIV 16*(I+2);
- HiScoreListe[I].Name:=Eingabe(y, GetMaxX DIV 7, 20, FALSE, FALSE);
- Assign(HiScoreDatei, 'WESP.DAT');
- Rewrite(HiScoreDatei); { Neue Hi-Score-Liste abspeichern }
- FOR J:=1 TO 10 DO
- Write(HiScoreDatei, HiScoreListe[J]);
- Close(HiScoreDatei);
- END;
-
- Schreibe(GetMaxX DIV 20, GetMaxY DIV 16*14,
- 'Gib die Startebene ein: ', Schrift);
- Schreibe(GetMaxX DIV 20, GetMaxY DIV 16*15, '0 -> Programmende', Schrift);
- DrawSterne;
- WHILE KeyPressed DO { Tastaturpuffer löschen }
- ch:=ReadKey;
- REPEAT { Eingabe Levelnummer }
- Dummy:=Eingabe(GetMaxY DIV 16*14, 5*GetMaxX DIV 6, 2, TRUE, TRUE);
- Val(Dummy, Start_Ebene, X);
- UNTIL (Start_Ebene>=0) AND (Start_Ebene<100);
- IF Start_Ebene=0 THEN
- SpielEnde; { 0 -> Programm beenden }
- END;
-
- BEGIN { HAUPTPROGRAMM }
- GetParameter;
- LoadRunden;
- Vorbereitungen;
- SoundOn:=TRUE;
- REPEAT
- Hauptmenue;
- Spiel;
- UNTIL FALSE;
- END.
- (* ========================================================================= *)
-
-
-
-
-
-
-
-
-
-