home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* WESP - Weltraumspringen *)
- (* (C) 1990 Thomas Perner & toolbox *)
- (* Compiler: Turbo Pascal ab 5.0 *)
- (* ====================================================== *)
-
- PROGRAM Wesp;
- {$I-,R-,V-,S-,D-,L-}
-
- USES
- Crt, Dos, Graph;
-
- TYPE
- Str20 = STRING[20];
- Str80 = STRING[80];
- Datentyp = RECORD
- Name: Str20;
- Punkte: WORD;
- END;
-
- CONST
- Punkte: WORD = 0;
- Start_Ebene: BYTE = 1;
- Zeitspeicher: WORD = 0;
- Schwarz = 0; { Farben für CGA }
- Gruen = 1;
- Rot = 2;
- Gelb = 3;
- AnzSterne = 600;
- AnzLevel = 30;
-
- VAR
- Treiber: INTEGER;
- Figur: POINTER;
- Figur_Spalte, Figur_Zeile: INTEGER;
- Anzahl_Felder, Felder_Vernichtet: BYTE;
- Liste: ARRAY[0..12] OF Datentyp;
- Datei: FILE OF Datentyp;
- Eintrag: Datentyp;
- Punkte_Str: STRING[5];
- Ebene_Str, Zeit_Str: STRING[3];
- Sterne: ARRAY[1..AnzSterne] OF PointType;
- I, J, X, Y, OffsetX: INTEGER;
- Ende: BOOLEAN;
- Dummy: STRING[6];
- Hilfe: STRING[80];
- Schrift, Hell, Hintergrund, Header, Taste, Ebene, Zeit,
- Plattformrand, Plattformflaeche, A, TastByteAlt: BYTE;
- Regs: REGISTERS;
- TastByte: BYTE ABSOLUTE $0040:$0017;
-
- PROCEDURE Figur_speichern; { Figur als "Sprite" speichern }
- VAR
- Z: WORD;
- BEGIN
- ClearDevice;
- SetColor(Schrift);
- SetFillStyle(SolidFill, Hell);
- Bar3D(0, 8 DIV A, 20 DIV A, 12 DIV A, 10 DIV A, TopOn);
- FloodFill(10 DIV A, 4 DIV A, Schrift);
- FloodFill(22 DIV A, 8 DIV A, Schrift);
- FloodFill(26 DIV A, 6 DIV A, Schrift);
- Z:=ImageSize(0, 0, 32 DIV A, 16 DIV A);
- GetMem(Figur, Z);
- GetImage(0, 0, 32 DIV A, 16 DIV A, Figur^);
- END;
-
- PROCEDURE Schreibe(Spalte, Zeile: WORD; { Textausgabe }
- Text: Str80; Farbe: BYTE); { im Grafikmodus }
- BEGIN
- Y:=TextHeight(Text)* 5 DIV 4;
- X:=TextWidth(Text);
- SetFillStyle(SolidFill, Hintergrund); { Hintergrund }
- Bar(Spalte, Zeile, Spalte+X, Zeile+Y); { löschen }
- SetColor(Farbe);
- OutTextXY(Spalte, Zeile, Text);
- END;
-
- PROCEDURE Vorbereitungen; { Grafik und Numlock aktivieren }
- VAR
- Modus: INTEGER;
- BEGIN
- Assign(Datei, 'WESP.DAT'); { Hi-Scores laden... }
- Reset(Datei);
- IF IOResult=0 THEN
- BEGIN
- FOR I:=1 TO 10 DO
- BEGIN
- Read(Datei, Eintrag);
- Liste[I]:=Eintrag;
- END;
- Close(Datei);
- END
- ELSE
- FOR I:=1 TO 10 DO { ...oder neu erstellen }
- BEGIN
- Liste[I].Name:='Nobody';
- Liste[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:=White;
- Hintergrund:=Black;
- Header:=LightRed;
- Plattformrand:=Green;
- Plattformflaeche:=LightGreen;
- A:=1;
- OffsetX:=0;
- END;
- HercMono:
- BEGIN
- Treiber:=HercMono;
- Modus:=HercMonoHi;
- Schrift:=1;
- Hell:=1;
- Header:=1;
- Hintergrund:=Black;
- Plattformrand:=1;
- Plattformflaeche:=1;
- A:=1;
- OffsetX:=50;
- END;
- MCGA,
- CGA: BEGIN
- Treiber:=CGA;
- Modus:=CGAC0;
- Schrift:=Rot;
- Hell:=Gruen;
- Header:=Gelb;
- Hintergrund:=Schwarz;
- Plattformrand:=Rot;
- Plattformflaeche:=Gruen;
- A:=2;
- OffsetX:=8;
- 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); { Sonstiges }
- Figur_speichern;
- CheckBreak:=FALSE;
- TastByteAlt:=TastByte; { NumLock einschalten }
- TastByte:=TastByte OR 32; { LED bleibt unbeeinflusst! }
- END;
-
- PROCEDURE Plattform(Spalte, Zeile: BYTE; Zeichnen: BOOLEAN);
- { Plattform zeichnen oder löschen }
- BEGIN
- X:=Spalte*(50 DIV A)-Zeile*(26 DIV A)+160 DIV A+OffsetX;
- Y:=Zeile*(24 DIV A)+76 DIV A;
- IF Zeichnen THEN
- BEGIN { Zeichnen... }
- SetColor(Plattformrand);
- SetFillStyle(SolidFill, Plattformflaeche);
- Bar3D(X, Y, X+40 DIV A, Y-4 DIV A, 22 DIV A, TopOn);
- FloodFill(X+6 DIV A, Y-6 DIV A, Plattformrand);
- FloodFill(X+46 DIV A, Y-6 DIV A, Plattformrand);
- IF Treiber=HercMono THEN
- BEGIN
- SetColor(Hintergrund);
- Bar3D(X, Y, X+40 DIV A, Y-4 DIV A, 22 DIV A, TopOn);
- END;
- END
- ELSE
- BEGIN { ...und löschen }
- IF Treiber=HercMono THEN
- BEGIN
- SetColor(Hintergrund);
- SetFillStyle(SolidFill, Hintergrund);
- Bar3D(X, Y, X+40 DIV A, Y-4 DIV A, 22 DIV A, TopOn);
- FloodFill(X+6 DIV A, Y-6 DIV A, Hintergrund);
- FloodFill(X+46 DIV A, Y-6 DIV A, Hintergrund);
- END
- ELSE
- BEGIN
- SetColor(Plattformrand);
- SetFillStyle(SolidFill, Hintergrund);
- FloodFill(X+6 DIV A, Y-6 DIV A, Plattformrand);
- FloodFill(X+46 DIV A, Y-6 DIV A, Plattformrand);
- SetColor(Hintergrund);
- Bar3D(X, Y, X+40 DIV A, Y-4 DIV A, 22 DIV A, TopOn);
- END;
- END;
- END;
-
- PROCEDURE Piep; { Pieps! }
- VAR
- S: WORD;
- BEGIN
- S:=100;
- WHILE S<2000 DO
- BEGIN
- Sound(S);
- INC(S);
- END;
- NoSound;
- END;
-
- PROCEDURE Spielfigur(Spalte, Zeile: BYTE);
- { Zeichnet und löscht Spielfigur }
- VAR
- S: WORD;
- BEGIN
- X:=Spalte*(50 DIV A)-Zeile*(26 DIV A)+176 DIV A+OffsetX;
- Y:=Zeile*(24 DIV A)+58 DIV A;
- PutImage(X, Y, Figur^, XORPUT);
- IF I=1 THEN { Sound für einen einfachen... }
- BEGIN
- Sound(150);
- Delay(1);
- NoSound;
- Delay(1);
- Sound(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; { Sterne bunt flimmern lassen }
- VAR
- n: WORD;
- BEGIN
- n:=Succ(Random(AnzSterne));
- PutPixel(Sterne[n].x, Sterne[n].y,
- Random(Succ(GetMaxColor)));
- END;
-
- PROCEDURE Spielfeld_aufbauen(Feld_Nr: BYTE);
- { Daten für Level aufbereiten }
- CONST
- Feld: ARRAY[1..AnzLevel, 1..10] OF BYTE=
- (($08,$7E,$48,$48,$CE,$82,$FE,$00,$07,$02),
- ($40,$78,$47,$40,$5C,$08,$78,$00,$07,$03),
- ($00,$04,$2E,$04,$20,$74,$20,$00,$06,$04),
- ($40,$55,$45,$05,$01,$70,$07,$1F,$02,$03),
- ($20,$20,$70,$28,$4A,$DE,$42,$00,$05,$05),
- ($28,$20,$0C,$78,$04,$A0,$2C,$00,$05,$04),
- ($20,$75,$0B,$09,$3E,$2B,$02,$00,$03,$01),
- ($00,$07,$29,$3C,$01,$1E,$01,$03,$05,$04),
- ($1E,$60,$1C,$AA,$E8,$82,$A0,$AF,$07,$01),
- ($75,$0C,$4B,$25,$EA,$A4,$FA,$14,$07,$03),
- ($02,$42,$4E,$CC,$48,$34,$E0,$A0,$07,$02),
- ($14,$5F,$54,$E5,$4F,$20,$1C,$28,$06,$04),
- ($2D,$25,$3A,$20,$17,$2A,$00,$00,$07,$03),
- ($08,$E9,$3F,$40,$E9,$5B,$08,$6A,$07,$03),
- ($A9,$20,$AB,$76,$02,$98,$CA,$B8,$02,$07),
- ($BE,$A8,$5D,$AA,$49,$BA,$C9,$95,$05,$07),
- ($E8,$1C,$48,$5C,$C8,$48,$40,$00,$05,$03),
- ($FF,$89,$A9,$8F,$81,$A5,$81,$FF,$05,$08),
- ($00,$79,$A1,$C5,$A4,$75,$04,$2E,$04,$06),
- ($28,$26,$08,$F2,$08,$12,$1E,$0A,$05,$05),
- ($07,$16,$F8,$5A,$06,$02,$5E,$E8,$05,$04),
- ($04,$05,$04,$1F,$14,$51,$E8,$4D,$02,$07),
- ($F5,$07,$32,$0E,$D4,$2C,$80,$F8,$01,$08),
- ($00,$55,$BB,$51,$A2,$0A,$7A,$42,$03,$07),
- ($F7,$14,$14,$F7,$81,$81,$F7,$00,$08,$01),
- ($A8,$DD,$09,$1C,$09,$11,$75,$39,$06,$04),
- ($07,$04,$12,$16,$3B,$42,$E3,$78,$05,$08),
- ($AB,$55,$A8,$57,$6A,$F2,$40,$00,$04,$06),
- ($5A,$C0,$B5,$2A,$95,$B7,$94,$2C,$06,$06),
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$08,$01));
- Wert: ARRAY[1..8] OF BYTE=(128, 64, 32, 16, 8, 4, 2, 1);
- VAR
- x, y: INTEGER;
- BEGIN
- ClearDevice; { Statuszeile aufbauen }
- SetColor(Schrift);
- OutTextXY(0, 0, 'Punkte');
- OutTextXY(250 DIV A, 0, 'Bonus');
- OutTextXY(500 DIV A, 0, 'Ebene');
- Figur_Spalte:=Feld[Feld_Nr, 9]; { Startposition }
- Figur_Zeile:=Feld[Feld_Nr, 10];
- IF Feld_Nr>AnzLevel THEN { Alle Level geschafft: }
- Exit; { Spielende }
- Anzahl_Felder:=0; { Plattformen zeichnen }
- FOR I:=1 TO 8 DO
- FOR J:=1 TO 8 DO
- BEGIN
- IF Feld[Feld_Nr, I] AND Wert[J] <> 0 THEN
- BEGIN
- INC(Anzahl_Felder);
- Plattform(J, I, TRUE);
- END;
- END;
- 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, Schrift);
- END;
- END;
-
- PROCEDURE Tastaturpuffer_loeschen;
- BEGIN
- Regs.AX:=$0C00;
- MsDos(Regs);
- END;
-
- PROCEDURE SpielEnde; { Grafik beenden }
- BEGIN
- CloseGraph;
- TastByte:=TastByteAlt; { NumLock-Status wiederherstellen }
- Halt;
- END;
-
- PROCEDURE Tastendruck(Blink: BOOLEAN); { Taste holen }
- BEGIN
- Tastaturpuffer_loeschen;
- REPEAT
- IF Blink THEN { evtl. Sterne blinken lassen }
- Sternenflimmern;
- 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; { Punkte etc. zurücksetzen }
- Punkte:=0;
- Str(Punkte, Punkte_Str);
- Ende:=FALSE;
- REPEAT
- Tastaturpuffer_loeschen; { Variablen initialisieren }
- INC(Ebene);
- Str(Ebene, Ebene_Str);
- Spielfeld_aufbauen(Ebene);
- Felder_Vernichtet:=0;
- Zeit:=101;
- Str(Zeit, Zeit_Str);
- Schreibe(140 DIV A, 0, Punkte_Str, Schrift); { Status- }
- Schreibe(380 DIV A, 0, Zeit_Str, Schrift); { zeile }
- Schreibe(600 DIV A, 0, Ebene_Str, Schrift);
- I:=1;
- Spielfigur(Figur_Spalte, Figur_Zeile);
- REPEAT { Schleifenanfang }
- Zeitroutine;
- Sternenflimmern;
- IF KeyPressed THEN
- BEGIN { Taste gedrückt }
- I:=1;
- Spielfigur(Figur_Spalte, Figur_Zeile);
- Taste:=Ord(ReadKey);
- IF Taste=27 THEN { ESC -> zurück zum Hauptmenü }
- BEGIN
- Punkte:=0;
- Exit;
- END;
- IF Taste=0 THEN
- Taste:=Ord(ReadKey);
- IF Taste In [72, 80, 77, 75, 56, 50, 54, 52] THEN
- BEGIN { Spielzug durchführen }
- Plattform(Figur_Spalte, Figur_Zeile, FALSE);
- INC(Felder_Vernichtet);
- INC(Punkte, 10);
- Str(Punkte, Punkte_Str);
- Schreibe(140 DIV A, 0, Punkte_Str, Schrift);
- I:=1;
- IF Taste in [72, 80, 77, 75] then
- I:=2;
- CASE Taste OF
- 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;
- X:=Figur_Spalte*(50 DIV A)-
- Figur_Zeile*(26 DIV A)
- +170 DIV A+OffsetX;
- Y:=Figur_Zeile*(24 DIV A)+66 DIV A;
- IF (GetPixel(X, Y)=Hintergrund) AND
- (Felder_Vernichtet<Anzahl_Felder) THEN
- Ende:=TRUE { Pech gehabt: Sprung ins Leere }
- 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 (Ebene>AnzLevel) THEN { Alle Runden geschafft }
- Exit;
- 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, Schrift);
- Schreibe(380 DIV A, 0, Zeit_Str+#32, Schrift);
- Tastendruck(TRUE);
- END;
- UNTIL Ende;
- I:=1000; { Spiel verloren }
- WHILE I>100 DO
- BEGIN
- Sound(Random(I)+100);
- Delay(1);
- DEC(I);
- END;
- NoSound;
- Schreibe(GetMaxX DIV 2-TextWidth('XXXX'), GetMaxY DIV 2,
- 'GAME OVER', Hell);
- Tastendruck(TRUE);
- END;
-
- PROCEDURE Hauptmenue; { Titelbild }
- BEGIN
- ClearDevice;
- SetColor(Hell);
- Rectangle(0, 0, GetMaxX, GetMaxY);
- SetTextStyle(GothicFont, HorizDir, 1);
- SetTextJustify(LeftText, TopText);
- IF Treiber=CGA THEN { Größe Überschrift anpassen }
- SetUserCharSize(4, 3, 6, 7)
- ELSE
- SetUserCharSize(5, 2, 5, 3);
- SetColor(Header);
- OutTextXY(GetMaxX DIV 20, 0, 'WESP');
-
- I:=0; { Neuer Hi-Score ? }
- Ende:=FALSE;
- REPEAT
- INC(I);
- IF Punkte>Liste[I].Punkte THEN
- BEGIN
- IF I<10 THEN
- FOR J:=10 DownTo I DO
- Liste[J]:=Liste[J-1];
- Liste[I].Name:='';
- Liste[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(4*GetMaxX DIV 9, GetMaxY DIV 30,
- '(c) ''90 Th. Perner');
- OutTextXY(4*GetMaxX DIV 9, 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
- SetColor(Schrift);
- Str(J:2,Dummy);
- OutTextXY(GetMaxX DIV 20, y, Dummy);
- OutTextXY(GetMaxX DIV 7, y, Liste[J].Name);
- Str(Liste[J].Punkte:5, Dummy);
- OutTextXY(5*GetMaxX DIV 6, y, Dummy);
- END;
-
- IF Ende AND (I<11) THEN
- BEGIN
- SetColor(Hell);
- y:=GetMaxY DIV 16*(I+2);
- Liste[I].Name:=Eingabe(y, GetMaxX DIV 7, 20, FALSE,
- FALSE);
- Assign(Datei, 'WESP.DAT');
- ReWrite(Datei); { Neue Liste abspeichern }
- FOR J:=1 TO 10 DO
- Write(Datei, Liste[J]);
- Close(Datei);
- END;
-
- Schreibe(GetMaxX DIV 20, GetMaxY DIV 16*14,
- 'Gib die Startebene ein: '+
- +'(1-16)', Schrift);
- Schreibe(GetMaxX DIV 20, GetMaxY DIV 16*15,
- '0 -> Programmende', Schrift);
- DrawSterne;
- 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<17);
- IF Start_Ebene=0 THEN
- SpielEnde; { 0 -> Programm beenden }
- END;
-
- BEGIN { HAUPTPROGRAMM }
- Vorbereitungen;
- REPEAT
- Hauptmenue;
- Spiel;
- UNTIL FALSE;
- END.
- (* ====================================================== *)