home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* WESP + Leveleditor *)
- (* (C) 1990 Gerald Arend & toolbox *)
- (* Compiler: Turbo Pascal ab 5.0 *)
- (* ====================================================== *)
-
- PROGRAM WespEdit;
- {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
-
- USES Crt, Graph, Masktur4, WespEd, WespEd2;
- { Achtung: Die Screens/Eingabemasken wurden mit dem Programm "MaskEdit Plus"
- vom DMV-Verlag erstellt. Aus lizenzrechtlichen Gründen ist die Weitergabe
- der Unit "Masktur4" daher nur in compilierter Form als "MASKTUR4.TPU"
- gestattet. }
-
- CONST
- AnzMaxRaeume = 99;
- FileName: Str80 = 'WESP.LEV';
-
- TYPE
- DatenRec = RECORD { Daten im Byte-Format }
- Zeile: ARRAY[1..8] OF BYTE;
- x, y : BYTE;
- END;
- DatenArray = RECORD { alle Level im Bit-kodierten Format }
- Kennung: STRING[10];
- Level: ARRAY[1..AnzMaxRaeume] OF DatenRec; { Level im Byte-Format }
- END;
- LevelRec = RECORD { Entschlüsseltes Format }
- Feld: ARRAY[1..8, 1..8] OF BOOLEAN;
- x, y: BYTE;
- END;
-
- VAR
- Datei: FILE OF DatenArray;
- Daten: DatenArray;
- Level: LevelRec;
- Gd, Gm, i: INTEGER;
- Info1, Info2, Info3, Info4,
- NormInfo3, NormInfo4,
- WeiterInfo4, LeerInfo, Zwischenwort: Str80;
- LevelNr1, LevelNr2: BYTE;
- ch: CHAR;
- Fertig, ShowMenuNeu: BOOLEAN;
- Auswahl: BYTE;
- RundenStr: STRING[2];
- IOFehler, OK: BOOLEAN;
-
- CONST
- Leerraum: DatenRec = (Zeile: ($00, $00, $00, $00, $00, $00, $00, $00);
- x: 0; y: 0);
-
- PROCEDURE Pause;
- VAR
- ch: CHAR;
- BEGIN
- ch := ReadKey;
- IF ch=#0 THEN
- ch := ReadKey;
- END;
-
- PROCEDURE IOTest; { Testet nach IO-Fehlern und gibt evtl. Nachricht }
- VAR
- IOCode: INTEGER;
- FehlerStr: STRING[4];
- BEGIN
- IOCode := IOResult;
- IOFehler := (IOCode<>0);
- CASE IOCode OF
- 2: Info3:='Datei nicht gefunden';
- 3: Info3:='Pfad nicht gefunden';
- 5: Info3:='Zugriff verweigert';
- 6: Info3:='Ungültige Kanalnummer';
- 8: Info3:='Nicht genug Speicher';
- 10: Info3:='Ungültiges Environment';
- 11: Info3:='Ungültiges Format';
- 150: Info3:='Diskette ist schreibgeschützt';
- 152: Info4:='Laufwerk nicht bereit';
- ELSE
- Str(IOCode:4, FehlerStr);
- Info3:='Allgemeiner I/O-Fehler Nr. '+FehlerStr;
- END;
- IF IOFehler THEN
- BEGIN
- Write(^G);
- AlleFelderAusgabe;
- Info4 := 'Operation nicht ausgeführt!';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, Info4, FALSE);
- Pause;
- END;
- END;
-
- PROCEDURE LoadRunden; { Alle Level auf einmal laden }
- BEGIN
- {$I-}
- Assign(Datei, FileName);
- IOTest;
- IF IOFehler THEN
- Exit;
- Reset(Datei);
- IOTest;
- IF IOFehler THEN
- Exit;
- Read(Datei, Daten);
- IOTest;
- IF IOFehler THEN
- Exit;
- Close(Datei);
- {$I+}
- END;
-
- PROCEDURE SaveRunden; { alle Level auf einmal abspeichern }
- CONST { - es sind ja nur 1000 Bytes! }
- LevelKennung: STRING[10] = 'WESP plus*';
- BEGIN
- {$I-}
- AlleFelderAusgabe;
- Info1 := 'RUNDEN SPEICHERN';
- Info2 := 'Nach ' + FileName;
- Info3 := '';
- Info4 := 'Bitte etwas Geduld...';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, Info4, FALSE);
- Daten.Kennung:=LevelKennung;
- Assign(Datei, FileName);
- IOTest;
- IF IOFehler THEN
- Exit;
- Rewrite(Datei);
- IOTest;
- IF IOFehler THEN
- Exit;
- Write(Datei, Daten);
- IOTest;
- IF IOFehler THEN
- Exit;
- Close(Datei);
- {$I+}
- END;
-
- PROCEDURE FILE2Level(Raum: BYTE); { Level entschlüsseln }
- CONST
- Wert: ARRAY[1..8] OF BYTE=(128, 64, 32, 16, 8, 4, 2, 1);
- VAR
- x, y: INTEGER;
- BEGIN
- Level.x := Daten.Level[Raum].x; { Startposition }
- Level.y := Daten.Level[Raum].y;
- FOR x := 1 TO 8 DO
- FOR y := 1 TO 8 DO
- Level.Feld[y, x] := ((Daten.Level[Raum].Zeile[x] AND Wert[y]) > 0);
- END;
-
- PROCEDURE Level2FILE(Raum: BYTE); { Level verschlüsseln }
- CONST
- Wert: ARRAY[1..8] OF BYTE=(128, 64, 32, 16, 8, 4, 2, 1);
- VAR
- x, y: INTEGER;
- BEGIN
- FOR x := 1 TO 8 DO
- BEGIN
- Daten.Level[Raum].Zeile[x] := 0;
- FOR y := 1 TO 8 DO
- IF Level.Feld[y, x] THEN
- Daten.Level[Raum].Zeile[x] := Daten.Level[Raum].Zeile[x] OR Wert[y];
- END;
- Daten.Level[Raum].x := Level.x; { Startposition }
- Daten.Level[Raum].y := Level.y;
- END;
-
- PROCEDURE ShowFlaeche(x, y: BYTE; CursorSetzen: BOOLEAN);{ Eine Fläche zeigen }
- CONST
- Links = 13;
- Oben = 13;
- BEGIN
- GotoXY(Links + Pred(x) * 3, Oben + Pred(y));
- IF Level.Feld[x, y] THEN
- BEGIN
- IF (Level.x=x) AND (Level.y=y) THEN
- Write('**')
- ELSE
- Write('■■')
- END
- ELSE
- Write('∙∙');
- IF CursorSetzen THEN { Cursor evtl. auf Feld setzen }
- GotoXY(Links + Pred(x) * 3, Oben + Pred(y));
- END;
-
- PROCEDURE ShowRaum; { Alle Flächen eines Levels zeigen }
- VAR
- x, y: BYTE;
- BEGIN
- EditorScreen(FileName, LevelNr1, TRUE);
- FOR x := 1 TO 8 DO
- FOR y := 1 TO 8 DO
- ShowFlaeche(x, y, FALSE);
- END;
-
- PROCEDURE EditRaum(MitEingabe: BOOLEAN); { Level Editieren }
- PROCEDURE Editieren; { Editierroutine }
- PROCEDURE ClearFeld; { Alle Flächen löschen }
- VAR
- x, y: BYTE;
- BEGIN
- Level.x := 1;
- Level.y := 1;
- FOR x := 1 TO 8 DO
- FOR y := 1 TO 8 DO
- BEGIN
- Level.Feld[x, y] := FALSE;
- ShowFlaeche(x, y, FALSE);
- END;
- END;
-
- PROCEDURE Zufall; { Zufallslevel erstellen }
- TYPE
- MoeglichRec= RECORD
- x, y: ShortInt;
- END;
- VAR
- Fertig: BOOLEAN;
- Moeglich: ARRAY[1..8] OF MoeglichRec;
- Moeglichx, Moeglichy: ShortInt;
- n, AnzMoeglich, AnzFlaechen: BYTE;
- SprungX, SprungY,
- FeldX, FeldY, ZufallsZahl: BYTE;
- BEGIN
- ClearFeld;
- Zufallszahl := Random(45) + 20;
- FeldX := Random(8) + 1; { Startfeld setzen }
- FeldY := Random(8) + 1;
- Level.x := FeldX;
- Level.y := FeldY;
- Level.Feld[FeldX, FeldY] := TRUE;
- ShowFlaeche(FeldX, FeldY, FALSE);
- AnzFlaechen := 0;
- REPEAT
- Inc(AnzFlaechen);
- AnzMoeglich := 0;
- FOR n := 1 TO 8 DO
- BEGIN
- CASE n OF
- 1: BEGIN
- Moeglichx := FeldX + 1; { Alle Sprungmöglichkeiten }
- Moeglichy := FeldY;
- END;
- 2: BEGIN
- Moeglichx := FeldX;
- Moeglichy := FeldY - 1;
- END;
- 3: BEGIN
- Moeglichx := FeldX - 1;
- Moeglichy := FeldY;
- END;
- 4: BEGIN
- Moeglichx := FeldX;
- Moeglichy := FeldY + 1;
- END;
- 5: BEGIN
- Moeglichx := FeldX + 2;
- Moeglichy := FeldY;
- END;
- 6: BEGIN
- Moeglichx := FeldX;
- Moeglichy := FeldY - 2;
- END;
- 7: BEGIN
- Moeglichx := FeldX - 2;
- Moeglichy := FeldY;
- END;
- 8: BEGIN
- Moeglichx := FeldX;
- Moeglichy := FeldY + 2;
- END;
- END; { Case }
- IF (Moeglichx>0) AND (Moeglichx<9) AND { Prüfen: Welche Sprünge }
- (Moeglichy>0) AND (Moeglichy<9) THEN { sind wirklich möglich? }
- IF NOT Level.Feld[Moeglichx, Moeglichy] THEN
- BEGIN
- Inc(AnzMoeglich);
- Moeglich[AnzMoeglich].x := Moeglichx;
- Moeglich[AnzMoeglich].y := Moeglichy;
- END;
- END;
- IF (AnzMoeglich=0) OR { Kein Zug mehr möglich }
- (AnzFlaechen>ZufallsZahl) THEN { Zufalls-Abbruch }
- Exit;
- n := Random(AnzMoeglich) + 1; { Möglichen Zug zufällig auswählen }
- FeldX := Moeglich[n].x;
- FeldY := Moeglich[n].y;
- Level.Feld[FeldX, FeldY] := TRUE;
- ShowFlaeche(FeldX, FeldY, FALSE);
- UNTIL FALSE;
- END;
-
- VAR
- ch: CHAR;
- xpos, ypos, xalt, yalt: BYTE;
- BEGIN
- REPEAT
- FILE2Level(LevelNr1);
- ShowRaum;
- IF (Level.x>0) AND (Level.y>0) THEN
- BEGIN
- xpos := Level.x;
- ypos := Level.y;
- END
- ELSE
- BEGIN
- xpos:=1;
- ypos:=1;
- END;
- REPEAT
- ShowFlaeche(xpos, ypos, TRUE);
- ch := ReadKey;
- CASE ch OF
- #00: CASE ReadKey OF
- #72: IF ypos>1 THEN { Cursor hoch }
- Dec(ypos)
- ELSE
- ypos := 8;
- #80: IF ypos<8 THEN { Cursor runter }
- Inc(ypos)
- ELSE
- ypos := 1;
- #75: IF xpos>1 THEN { Cursor links }
- Dec(xpos)
- ELSE
- xpos := 8;
- #77: IF xpos<8 THEN { Cursor rechts }
- Inc(xpos)
- ELSE
- xpos := 1;
- #82: BEGIN
- Level.Feld[xpos, ypos] := TRUE; { Einfg }
- IF NOT Level.Feld[Level.x, Level.y] THEN
- BEGIN
- Level.x := xpos;
- Level.y := ypos;
- END;
- END;
- #83: IF (xpos<>Level.x) OR (ypos<>Level.y) THEN
- Level.Feld[xpos, ypos] := FALSE; { Entf }
- END;
- 'z',
- 'Z': Zufall; { Z }
- 'l',
- 'L': ClearFeld;
- 's',
- 'S': IF Level.Feld[xpos, ypos] THEN { S }
- BEGIN
- xalt := Level.x;
- yalt := Level.y;
- Level.x := xpos;
- Level.y := ypos;
- ShowFlaeche(xalt, yalt, FALSE);
- END;
- END;
- UNTIL ch IN [#13, #27, '+', '-'];
- CASE ch OF
- #13: Level2FILE(LevelNr1);
- '+': IF LevelNr1<AnzMaxRaeume THEN { + }
- Inc(LevelNr1)
- ELSE
- LevelNr1 := 1;
- '-': IF LevelNr1>1 THEN { - }
- Dec(LevelNr1)
- ELSE
- LevelNr1 := AnzMaxRaeume;
- END;
- UNTIL ch=#27;
- END;
-
- BEGIN
- IF MitEingabe THEN
- BEGIN
- AlleFelderAusgabe;
- EingabeFeld(5);
- FeldLinks(3);
- FeldLinks(4);
- Info1 := 'LEVEL EDITIEREN';
- Info2 := 'Geben Sie die Nummer des Levels ein:';
- ZwischenWort := '';
- LevelNr2 := 0;
- REPEAT
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=27 THEN
- Exit;
- UNTIL LevelNr1>0;
- END;
- Editieren;
- END;
-
- PROCEDURE ChangeRaum; { Zwei Level vertauschen }
- PROCEDURE ChangeRunden(Runde1, Runde2: BYTE);
- VAR
- Zwischen: DatenRec;
- BEGIN
- Zwischen := Daten.Level[Runde1];
- Daten.Level[Runde1] := Daten.Level[Runde2];
- Daten.Level[Runde2] := Zwischen;
- END;
-
- VAR
- Info1, Info2: Str80;
- BEGIN
- LevelNr2 := 0;
- AlleFelderNormal;
- AlleFelderAusgabe;
- FeldLinks(3);
- FeldLinks(4);
- EingabeFeld(5);
- EingabeFeld(7);
- Info1 := 'LEVEL TAUSCHEN';
- Info2 := 'Welche Levels tauschen?';
- ZwischenWort := 'tauschen gegen';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=27 THEN
- Exit;
- IF (LevelNr1=LevelNr2) OR (LevelNr1=0) OR (LevelNr2=0) THEN
- BEGIN
- AlleFelderAusgabe;
- Write(^G);
- Info3 := 'Fehler: Falsche Levelnummern!';
- Info4 := 'Tauschvorgang abgebrochen...';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, Info4, FALSE);
- Pause;
- Exit;
- END;
- ChangeRunden(LevelNr1, LevelNr2);
- AlleFelderAusgabe;
- Info3 := 'Levels erfolgreich getauscht!';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, WeiterInfo4, FALSE);
- Pause;
- END;
-
- PROCEDURE InsertRaum; { Leeren Level einfügen }
- VAR
- a: BYTE;
- BEGIN
- AlleFelderAusgabe;
- EingabeFeld(5);
- Info1 := 'LEVEL EINFÜGEN';
- Info2 := 'Vor welchem Level einfügen:';
-
- REPEAT
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- Zwischenwort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=27 THEN
- Exit;
- UNTIL LevelNr1>0;
-
- FOR a := AnzMaxRaeume - 1 DOWNTO LevelNr1 DO
- Daten.Level[a + 1] := Daten.Level[a];
- Daten.Level[LevelNr1] := LeerRaum;
-
- AlleFelderAusgabe;
- Info3 := 'Leerlevel eingefügt!';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- Zwischenwort, LevelNr2, Info3, WeiterInfo4, FALSE);
- Pause;
- END;
-
- PROCEDURE DeleteRaum; { Level löschen }
- VAR
- a: BYTE;
- BEGIN
- AlleFelderAusgabe;
- EingabeFeld(5);
- Info1 := 'LEVEL LÖSCHEN';
- Info2 := 'Welcher Level soll gelöscht werden:';
- REPEAT
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- Zwischenwort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=27 THEN
- Exit;
- UNTIL LevelNr1>0;
- FOR a := LevelNr1 TO AnzMaxRaeume - 1 DO
- Daten.Level[a] := Daten.Level[a + 1];
- Daten.Level[AnzMaxRaeume] := LeerRaum;
- AlleFelderAusgabe;
- Info3 := 'Level gelöscht!';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, WeiterInfo4, FALSE);
- Pause;
- END;
-
- PROCEDURE LoadNew; { Neue Level laden }
- VAR
- FileNameAlt: Str80;
- n, a: BYTE;
- NameOK: BOOLEAN;
- BEGIN
- FileNameAlt := FileName;
- AlleFelderAusgabe;
- EingabeFeld(2);
- EingabeFeldGross(2);
- EingabeFeldSet(2, ['A'..'Z', '.']);
- Info1 := 'NEUE LEVEL LADEN';
- Info2 := 'Geben Sie oben den Dateinamen an';
- FileName := '';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- Zwischenwort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=27 THEN
- BEGIN
- FileName := FileNameAlt;
- Exit;
- END;
- a := 0;
- FOR n := 1 TO Length(FileName) DO
- BEGIN
- IF FileName[n]='.' THEN
- Inc(a);
- END;
- IF Pos('.', FileName)=0 THEN
- FileName := FileName + '.LEV';
- n := Pos('.', FileName);
- IF n + 3 < Length(FileName) THEN
- FileName := Copy(FileName, 1, n + 3);
- LoadRunden;
- IF IOFehler THEN
- Exit;
- AlleFelderAusgabe;
- Info3 := 'Datei geladen!';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, WeiterInfo4, FALSE);
- Pause;
- END;
-
- { Hauptprogramm }
- BEGIN
- CheckBreak := FALSE;
- DirectVideo := TRUE;
- Randomize;
- TextMode(CO80);
-
- Auswahl := 0;
- LeerInfo := '';
- NormInfo3 := 'Arbeitsgang bestätigen mit <ENTER>';
- NormInfo4 := 'oder abbrechen mit <ESC>';
- WeiterInfo4 := 'Weiter mit einer Taste...';
- BeiEndeFeldZumNaechstenSpringen := TRUE;
- InitMaske;
- FeldLinks(2);
- FeldLinks(3);
- FeldLinks(5);
- FeldLinks(7);
- FeldLinks(8);
- AlleFelderAusgabe;
- Info1 := 'DATEN EINLESEN';
- Info2 := 'Von ' + Filename;
- Info3 := '';
- Info4 := 'Bitte etwas Geduld...';
- LevelNr1 := 0;
- LevelNr2 := 0;
- Zwischenwort := '';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, Info3, Info4, TRUE);
- LoadRunden;
- IF IOFehler THEN
- FOR LevelNr1 := 1 TO AnzMaxRaeume DO
- Daten.Level[LevelNr1] := LeerRaum;
- FeldVerlassenSet([0, 27]);
- ShowMenuNeu := FALSE;
- REPEAT
- AlleFelderAusgabe;
- EingabeFeld(1);
- EingabeFeldSet(1, ['1'..'7']);
- Auswahl := 0;
- LevelNr1 := 0;
- LevelNr2 := 0;
- ZwischenWort := '';
- MainMenu(Auswahl, FileName, LeerInfo, LeerInfo, LevelNr1,
- ZwischenWort, LevelNr2, LeerInfo, LeerInfo, ShowMenuNeu);
- ShowMenuNeu := FALSE;
- IF FeldVerlassen=27 THEN
- BEGIN
- Info1 := 'PROGRAMM BEENDEN';
- Info2 := 'Wollen Sie wirklich aufhören?';
- MainMenu(Auswahl, FileName, Info1, Info2, LevelNr1,
- ZwischenWort, LevelNr2, NormInfo3, NormInfo4, FALSE);
- IF FeldVerlassen=0 THEN
- BEGIN
- RestoreCrtMode;
- ClrScr;
- Halt;
- END;
- END;
- CASE Auswahl OF
- 1: EditRaum(TRUE);
- 2: ChangeRaum;
- 3: BEGIN
- InsertRaum;
- IF FeldVerlassen<>27 THEN
- EditRaum(False);
- END;
- 4: DeleteRaum;
- 5: LoadNew;
- 6: SaveRunden;
- 7: BEGIN
- SaveRunden;
- IF NOT IOFehler THEN
- BEGIN
- RestoreCrtMode;
- ClrScr;
- Halt;
- END;
- END;
- END;
- IF Auswahl IN [1..3] THEN
- BEGIN
- ShowMenuNeu := TRUE;
- FeldLinks(2);
- FeldLinks(3);
- FeldLinks(5);
- FeldLinks(7);
- FeldLinks(8);
- END;
- UNTIL FALSE;
- END.
-
-
-
-
-
-