home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* HEXBANGER *)
- (* Warnung: Nichts fuer Ungeduldige! *)
- (* (c) 1989 Gustav Kaiser & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Hex_Banger;
- USES
- Graph,Crt;
-
- TYPE
- FieldType = ARRAY[0..10,0..5] OF BYTE;
- RadType = ARRAY[0..8,0..4] OF RECORD
- LoX : INTEGER;
- LoY : INTEGER;
- FarbX : ARRAY[1..6] OF BYTE;
- FarbY : ARRAY[1..6] OF BYTE;
- END;
-
-
- CoordType = ARRAY[0..10,0..5] OF RECORD
- TriangleX : WORD;
- TriangleY : WORD;
- TriangleTop : BOOLEAN;
- END;
- TriangleType = ARRAY[0..3] OF PointType;
- StoneType = ARRAY[1..6] OF RECORD
- RandF : BYTE;
- FillF : BYTE;
- FillT : BYTE;
- END;
- ScreenType = ARRAY[1..$3fff] OF BYTE;
-
- CONST
- _black = 0;
- _green = 1;
- _red = 2;
- _yellow = 3;
- Left = -1;
- Right = 1;
- Upper=TRUE;
- Lower=FALSE;
- LTLength=38; (* Large Triangle Baselength *)
- STLength=24; (* Short Triangle Baselength *)
- HexX = 20;
- HexY = 1;
- HexCol = _green;
- CurCol = _yellow;
- BackCol = _black;
- Title = 'HEXBANGER';
- HelpLines = 14;
- HLine: ARRAY[1..HelpLines] OF STRING =
- ( ' HEXBANGER (c) G. Kaiser & TOOLBOX',
- ' ',
- ' Ziel des Spiels ist es, den Aus- ',
- ' gangszustand wieder herzustellen.',
- ' ',
- ' Cursorblockbelegung:',
- ' 7 8 9',
- ' 4 6 Cursor steuern',
- ' 1 2 3',
- ' 0 - Hex um ein Segment drehen',
- ' . - Drehrichtung aendern',
- ' F10 - "Sound" Aus/Ein',
- ' ',
- ' **** Bitte Taste ****' );
- OrgField: FieldType =
- ( (0,0,6,5,0,0),
- (0,6,6,5,5,0),
- (6,6,6,5,5,5),
- (1,6,6,5,5,4),
- (1,1,6,5,4,4),
- (1,1,1,4,4,4),
- (1,1,2,3,4,4),
- (1,2,2,3,3,4),
- (2,2,2,3,3,3),
- (0,2,2,3,3,0),
- (0,0,2,3,0,0) );
- RadErl: ARRAY[0..8,0..4] OF BYTE =
- ( (0,0,1,0,0),
- (0,1,0,1,0),
- (1,0,1,0,1),
- (0,1,0,1,0),
- (1,0,1,0,1),
- (0,1,0,1,0),
- (1,0,1,0,1),
- (0,1,0,1,0),
- (0,0,1,0,0) );
- ColCoord: ARRAY[0..227] OF BYTE =
- ( 3,0,4,0,4,1,3,1,2,1,2,0,
- 5,0,6,0,6,1,5,1,4,1,4,0,
- 7,0,8,0,8,1,7,1,6,1,6,0,
- 2,1,3,1,3,2,2,2,1,2,1,1,
- 4,1,5,1,5,2,4,2,3,2,3,1,
- 6,1,7,1,7,2,6,2,5,2,5,1,
- 8,1,9,1,9,2,8,2,7,2,7,1,
- 1,2,2,2,2,3,1,3,0,3,0,2,
- 3,2,4,2,4,3,3,3,2,3,2,2,
- 5,2,6,2,6,3,5,3,4,3,4,2,
- 7,2,8,2,8,3,7,3,6,3,6,2,
- 9,2,10,2,10,3,9,3,8,3,8,2,
- 2,3,3,3,3,4,2,4,1,4,1,3,
- 4,3,5,3,5,4,4,4,3,4,3,3,
- 6,3,7,3,7,4,6,4,5,4,5,3,
- 8,3,9,3,9,4,8,4,7,4,7,3,
- 3,4,4,4,4,5,3,5,2,5,2,4,
- 5,4,6,4,6,5,5,5,4,5,4,4,
- 7,4,8,4,8,5,7,5,6,5,6,4 );
-
-
- VAR
- SoftScreen : ScreenType;
- HardScreen : ScreenType ABSOLUTE $b800:$000;
- DHoehe : BYTE;
- DLHalbe : BYTE;
- PlayField : FieldType;
- DpX,DpY : WORD;
- TriangleCoord : CoordType;
- Wheel : RadType;
- CurX,CurY : WORD;
- CurXp,CurYp : BYTE;
- TurnRight : BOOLEAN;
- ArcCo : ArcCoordsType;
- STriangleTU : TriangleType; (*Short Triangle Top Up *)
- STriangleTD : TriangleType; (*Short Triangle Top Down*)
- LTriangleTU : TriangleType; (*Large Triangle Top Up *)
- LTriangleTD : TriangleType; (*Large Triangle Top Down*)
- Stone : StoneType;
- Level : WORD;
- SoundOn : BOOLEAN;
- StartTime : LONGINT;
- EndTime : LONGINT;
- Time : LONGINT ABSOLUTE $40:$6C;
-
- PROCEDURE GInit;
-
- VAR
- Driver,Mode : INTEGER;
-
- BEGIN
- Driver := CGA;
- Mode := CGAC2;
- InitGraph(Driver,Mode,'');
- DirectVideo := FALSE;
- END;
-
- PROCEDURE IVars;
-
- VAR
- x,y : BYTE;
- TrHei,TrHalf: BYTE;
-
- BEGIN
- FOR x:=0 TO 10 DO FOR y:=0 TO 5 DO BEGIN
- WITH TriangleCoord[x,y] DO BEGIN
- TriangleX := 0;
- TriangleY := 0;
- END;
- END;
- CurXp := 2;
- CurYp := 0;
- DHoehe := Trunc(Sqrt(Sqr(LTLength)-Sqr(LTLength/2)));
- DLHalbe := LTLength DIV 2;
- TrHei := Trunc(Sqrt(Sqr(STLength)-Sqr(STLength/2)));
- TrHalf := STLength DIV 2;
- (* Grund-Coordinaten für die Spielsteine (Top up) *)
- STriangleTU[0].x := TrHalf; STriangleTU[0].y := 0;
- STriangleTU[1].x := 0; STriangleTU[1].y := TrHei;
- STriangleTU[2].x := STLength; STriangleTU[2].y := TrHei;
- STriangleTU[3] := STriangleTU[0];
- (* Grund-Coordinaten für die Spielsteine (Top down) *)
- STriangleTD[0].x := 0; STriangleTD[0].y := 0;
- STriangleTD[1].x := TrHalf; STriangleTD[1].y := TrHei;
- STriangleTD[2].x := STLength; STriangleTD[2].y := 0;
- STriangleTD[3] := STriangleTD[0];
- (* Dreieckeigenschaften festlegen *)
- (* Grund-Coordinaten für die Spielfeld (Top up) *)
- LTriangleTU[0].x := DLHalbe; LTriangleTU[0].y := 0;
- LTriangleTU[1].x := 0; LTriangleTU[1].y := DHoehe;
- LTriangleTU[2].x := LTLength; LTriangleTU[2].y := DHoehe;
- LTriangleTU[3] := LTriangleTU[0];
- (* Grund-Coordinaten für die LpielFeld (Top down) *)
- LTriangleTD[0].x := 0; LTriangleTD[0].y := 0;
- LTriangleTD[1].x := DLHalbe; LTriangleTD[1].y := DHoehe;
- LTriangleTD[2].x := LTLength; LTriangleTD[2].y := 0;
- LTriangleTD[3] := LTriangleTD[0];
- (* Dreieckeigenschaften festlegen *)
- Stone[1].RandF := _red;
- Stone[1].FillF := _red;
- Stone[1].FillT := SolidFill;
- Stone[2].RandF := _green;
- Stone[2].FillF := _green;
- Stone[2].FillT := CloseDotFill;
- Stone[3].RandF := _yellow;
- Stone[3].FillF := _yellow;
- Stone[3].FillT := SolidFill;
- Stone[4].RandF := _red;
- Stone[4].FillF := _red;
- Stone[4].FillT := CloseDotFill;
- Stone[5].RandF := _green;
- Stone[5].FillF := _green;
- Stone[5].FillT := SolidFill;
- Stone[6].RandF := _yellow;
- Stone[6].FillF := _yellow;
- Stone[6].FillT := CloseDotFill;
- PlayField := OrgField;
- DpX := 0;
- DpY := 0;
- TurnRight := TRUE;
- SoundOn := TRUE;
- END;
-
- PROCEDURE DrawOrgHex(x,y: WORD);
-
- BEGIN
- SetColor(_green);
- MoveTo(x,y);
- LineRel(LTLength,0);
- LineRel(DLHalbe,DHoehe);
- LineRel(-DLHalbe,DHoehe);
- LineRel(-LTLength,0);
- LineRel(-DLHalbe,-DHoehe);
- LineRel(DLHalbe,-DHoehe);
- LineRel(LTLength,DHoehe*2);
- MoveRel(-LTLength,0);
- LineRel(LTLength,DHoehe*-2);
- MoveRel(DLHalbe,DHoehe);
- LineRel(LTLength*-2,0);
- SetFillStyle(SolidFill,_red);
- FloodFill(x+2,y+2,_green);
- SetFillStyle(CloseDotFill,_green);
- FloodFill(x+37,y+6,_green);
- SetFillStyle(SolidFill,_yellow);
- FloodFill(x+37,y+36,_green);
- SetFillStyle(CloseDotFill,_red);
- FloodFill(x+22,y+46,_green);
- SetFillStyle(SolidFill,_green);
- FloodFill(x+2,y+36,_green);
- SetFillStyle(CloseDotFill,_yellow);
- FloodFill(x+1,y+4,_green);
- END;
-
- PROCEDURE DrawLogo;
-
- VAR
- i : BYTE;
- Ch : STRING[1];
- x,y : WORD;
-
-
- BEGIN
- SetTextStyle(DefaultFont,HorizDir,2);
- SetTextJustify(LeftText,TopText);
- x := 290; y := 20;
- FOR i := 1 TO Length(Title) DO BEGIN
- Ch := Copy(Title,i,1);
- SetColor(_yellow);
- OutTextXY(x,y,Ch);
- SetColor(_red);
- OutTextXY(x+2,y-2,Ch);
- y := y + TextHeight(Ch)+3;
- END;
- DrawOrgHex(226,124);
- END;
-
- PROCEDURE Print(x,y:WORD; Msg:STRING; Shadow,Col,Size,
- Cent: BYTE);
- BEGIN
- SetTextStyle(DefaultFont,HorizDir,Size);
- SetColor(Shadow);
- IF Cent=1 THEN x:= (319 - TextWidth(Msg)) DIV 2;
- OutTextXY(x-1,y+1,Msg);
- SetColor(Col);
- OutTextXY(x,y,Msg);
- END;
-
- PROCEDURE TitleScreen;
-
- VAR
- s,x : WORD;
- p : POINTER;
- i : BYTE;
-
- BEGIN
- SetTextJustify(LeftText,TopText);
- SetViewPort(0,0,319,199,ClipOff);
- Print(0,8,Title,_yellow,_red,4,CenterText);
- DrawOrgHex(20,40);
- s:=ImageSize(0,0,2*LTLength,2*DHoehe);
- GetMem(p,s);
- GetImage(0,40,2*LTLength,2*DHoehe+40,p^);
- x:=2*LTLength;
- FOR i:=0 TO 4 DO BEGIN
- PutImage(x,40,p^,OrPut);
- x:=x+2*LTLength;
- END;
- Print(0,180,'V1.0 (c) 1989 by Kaiser Gustav',_red,_green,
- 1,CenterText);
- Print(0,110,'F1 - Anleitung',_yellow,_green,2,CenterText);
- Print(0,130,'F2 - Spielen ',_yellow,_green,2,CenterText);
- Print(0,150,'F3 - Ende ',_yellow,_green,2,CenterText);
- FreeMem(p,s);
- END;
-
- PROCEDURE Toggle(VAR BoVar: BOOLEAN);
-
- BEGIN
- IF BoVar THEN BoVar := FALSE ELSE BoVar := TRUE;
- END;
-
- PROCEDURE SoundFine;
-
- VAR
- Frequ : WORD;
-
- BEGIN
- IF SoundOn THEN BEGIN
- Frequ := 220;
- REPEAT
- Sound(Frequ);
- Frequ:=Frequ+1;
- UNTIL Frequ>880;
- NoSound;
- END;
- END;
-
- PROCEDURE SoundBad;
-
- VAR
- Frequ : REAL;
-
- BEGIN
- IF SoundOn THEN BEGIN
- Frequ := 440;
- REPEAT
- Sound(Trunc(Frequ));
- Frequ:=Frequ-0.5;
- UNTIL Frequ<10;
- NoSound;
- END;
- END;
-
- PROCEDURE SoundTurn;
-
- VAR
- Frequ : REAL;
-
- BEGIN
- IF SoundOn THEN BEGIN
- Frequ := 330;
- REPEAT
- Sound(Trunc(Frequ));
- Frequ := Frequ+0.5;
- UNTIL Frequ>550;
- REPEAT
- Frequ := Frequ-1;
- Sound(Trunc(Frequ));
- UNTIL Frequ<330;
- NoSound;
- END;
- END;
-
- PROCEDURE SoundReady;
-
- VAR
- Frequ : REAL;
- i : BYTE;
-
- BEGIN
- FOR i := 0 TO 2 DO BEGIN
- Frequ := 220;
- REPEAT
- Sound(Trunc(Frequ));
- Frequ:=Frequ+0.3;
- UNTIL Frequ>880;
- END;
- NoSound;
- END;
-
- PROCEDURE Help;
-
- VAR
- i : BYTE;
- Ch : CHAR;
- y : WORD;
-
- BEGIN
- SoftScreen := HardScreen;
- SetViewPort(20,20,299,179,ClipOn);
- ClearViewPort;
- y := 2;
- FOR i:=1 TO HelpLines DO BEGIN
- Print(2,y,HLine[i],_yellow,_red,1,LeftText);
- y := y + TextHeight(HLine[i])+2;
- END;
- SetViewPort(0,0,319,199,ClipOff);
- Ch := ReadKey;
- IF Ch=#0 THEN Ch := ReadKey;
- HardScreen := SoftScreen;
- END;
-
- PROCEDURE DrawOneStone(xT,yT:WORD; Number: BYTE;
- TriTop:BOOLEAN);
-
- VAR
- TempTria : TriangleType;
- i : BYTE;
-
- BEGIN
- WITH Stone[Number] DO BEGIN
- IF TriTop THEN TempTria := STriangleTU
- ELSE TempTria:= STriangleTD;
- FOR i := 0 TO 3 DO BEGIN
- WITH TempTria[i] DO BEGIN
- x := x + xT;
- y := y + yT;
- END;
- END;
- SetColor(RandF);
- SetFillStyle(FillT,FillF);
- FillPoly(4,TempTria);
- END;
- END;
-
- PROCEDURE DrawOneField(xT,yT:WORD; ActTop:BOOLEAN);
-
- VAR
- TempTria : TriangleType;
- i : BYTE;
-
- BEGIN
- IF ActTop THEN TempTria := LTriangleTU
- ELSE TempTria:= LTriangleTD;
- FOR i := 0 TO 3 DO BEGIN
- WITH TempTria[i] DO BEGIN
- x := x + xT;
- y := y + yT - 32;
- END;
- END;
- SetFillStyle(EmptyFill,BackCol);
- FillPoly(4,TempTria);
- END;
-
- PROCEDURE DrawOneRow(x1,y1:WORD; Anz,Sb:BYTE;
- ActTop:BOOLEAN);
-
- VAR
- i : BYTE;
-
- BEGIN
- DpX := Sb;
- IF (Sb AND $fe) = 1 THEN Toggle(ActTop);
- FOR i := 1 TO Anz DO BEGIN
- WITH TriangleCoord[DpX,DpY] DO BEGIN
- TriangleX := x1+7;
- TriangleY := y1-26;
- TriangleTop := ActTop;
- END;
- DrawOneField(x1,y1,ActTop);
- Toggle(ActTop);
- x1:=x1+DLHalbe;
- Inc(DpX);
- END;
- Inc(DpY);
- DpX := 0;
- END;
-
- PROCEDURE SetTurnDir;
-
- VAR
- Col1,Col2 : BYTE;
-
- BEGIN
- SetLineStyle(SolidLn,0,ThickWidth);
- Col1:=0; Col2:=0;
- IF TurnRight THEN Col1 := HexCol ELSE Col2:= HexCol;
- SetColor(Col1);
- MoveTo(ArcCo.XStart+5,ArcCo.Ystart-1);
- LineRel(-4,3);
- LineRel(-3,-4);
- SetColor(Col2);
- MoveTo(ArcCo.Xend+4,ArcCo.Yend-3);
- LineRel(-2,5);
- LineRel(-6,-3);
- SetLineStyle(SolidLn,0,NormWidth);
- END;
-
- PROCEDURE SetCursor(xp,yp,Farbe: BYTE);
-
- VAR
- x,y : INTEGER;
-
- BEGIN
- x := Wheel[xp,yp].LoX;
- y := Wheel[xp,yp].LoY;
- SetColor(Farbe);
- MoveTo(x,y);
- LineRel(LTLength,0);
- LineRel(DLHalbe,DHoehe);
- LineRel(-DLHalbe,DHoehe);
- LineRel(-LTLength,0);
- LineRel(-DLHalbe,-DHoehe);
- LineRel(DLHalbe,-DHoehe);
- LineRel(LTLength,DHoehe*2);
- MoveRel(-LTLength,0);
- LineRel(LTLength,DHoehe*-2);
- MoveRel(DLHalbe,DHoehe);
- LineRel(LTLength*-2,0);
- END;
-
- PROCEDURE DrawHexagon(Sx,Sy:WORD; f: BYTE);
-
- VAR
- x1,y1 : WORD;
- SichtBar : BYTE;
- Anzahl : BYTE;
- i : INTEGER;
- ActTop : BOOLEAN;
-
- BEGIN
- DrawLogo;
- Print(208,16,'Zug: 0',_green,_red,1,LeftText);
- SetColor(f);
- x1:=Sx+DLHalbe;
- y1:=Sy+DHoehe;
- SichtBar:= 2;
- Anzahl := 7;
- FOR i:= 1 TO 3 DO BEGIN
- DrawOneRow(x1,y1,Anzahl,SichtBar,Upper);
- y1:=y1+DHoehe;
- x1:=x1-DLHalbe;
- IF SichtBar>0 THEN Dec(SichtBar);
- Anzahl:=Anzahl+2;
- END;
- SichtBar := 0;
- FOR i:=1 TO 3 DO BEGIN
- x1:=x1+DLHalbe;
- Anzahl:=Anzahl-2;
- DrawOneRow(x1,y1,Anzahl,SichtBar,Lower);
- Inc(SichtBar);
- y1:=y1+DHoehe;
- END;
- Arc(20,180,320,220,10);
- GetArcCoords(ArcCo);
- SetTurnDir;
- END;
-
- PROCEDURE DrawTriangles;
-
- VAR
- x,y : BYTE;
- x1,y1 : INTEGER;
- a:CHAR;
-
- BEGIN
- SetColor(2);
- FOR y := 0 TO 5 DO BEGIN
- FOR x := 0 TO 10 DO BEGIN
- WITH TriangleCoord[x,y] DO BEGIN
- IF PlayField[x,y] <> 0 THEN BEGIN
- DrawOneStone(TriangleX,TriangleY,PlayField[x,y],
- TriangleTop);
- END;
- END;
- END;
- END;
- END;
-
-
- PROCEDURE InitWheel;
-
- VAR
- RadX,RadY : BYTE;
- DrX,DrY : BYTE;
- x,y : INTEGER;
- CoordP : BYTE;
- i : BYTE;
-
- BEGIN
- x := HexX;
- y := HexY;
- CoordP := 0;
- FOR RadY := 0 TO 4 DO BEGIN
- FOR RadX := 0 TO 8 DO BEGIN
- WITH Wheel[RadX,RadY] DO BEGIN
- IF(RadErl[RadX,RadY] = 1) THEN BEGIN
- LoX := x;
- LoY := y;
- FOR i:=1 TO 6 DO BEGIN
- FarbX[i] := ColCoord[CoordP];
- FarbY[i] := ColCoord[CoordP+1];
- Inc(CoordP,2);
- END;
- END;
- END;
- x := x + DLHalbe;
- END;
- x := HexX;
- y := y + DHoehe;
- END;
- END;
-
- FUNCTION GetCoords: BOOLEAN;
-
- VAR
- Ch : CHAR;
- Ende : BOOLEAN;
- ToggleCounter : REAL;
- BlinkCol : BYTE;
-
- BEGIN
- ToggleCounter := 0;
- BlinkCol := _black;
- Ende := FALSE;
- REPEAT
- REPEAT
- ToggleCounter:=ToggleCounter+0.5;
- IF ToggleCounter>1000 THEN BEGIN
- SetCursor(CurXp,CurYp,BlinkCol);
- IF BlinkCol = CurCol THEN BlinkCol := _black
- ELSE BlinkCol := CurCol;
- ToggleCounter := 0;
- END;
- UNTIL KeyPressed;
- SetCursor(CurXp,CurYp,CurCol);
- Ch := ReadKey;
- IF Ch=#0 THEN Ch:=ReadKey ELSE Ch:=#0;
- CASE Ch OF
- 'P': BEGIN (* Down *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurYp < 4 THEN Inc(CurYp) ELSE CurYp:=0;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'H': BEGIN (* Up *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurYp>0 THEN Dec(CurYp) ELSE CurYp:=4;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'M': BEGIN (* Right *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp<8 THEN Inc(CurXp) ELSE CurXp:=0;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'K': BEGIN (* Left *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp>0 THEN Dec(CurXp) ELSE CurXp:=8;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'Q': BEGIN (* Right and Down *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp<8 THEN Inc(CurXp) ELSE CurXp:=0;
- IF CurYp<4 THEN Inc(CurYp) ELSE CurYp:=0;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'G': BEGIN (* Left and Up *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp>0 THEN Dec(CurXp) ELSE CurXp:=8;
- IF CurYp>0 THEN Dec(CurYp) ELSE CurYp:=4;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'I': BEGIN (* Right and Up *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp<8 THEN Inc(CurXp) ELSE CurXp:=0;
- IF CurYp>0 THEN Dec(CurYp) ELSE CurYp:=4;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'O': BEGIN (* Down & Left *)
- SetCursor(CurXp,CurYp,HexCol);
- REPEAT
- IF CurXp>0 THEN Dec(CurXp) ELSE CurXp:=8;
- IF CurYp<4 THEN Inc(CurYp) ELSE CurYp:=0;
- UNTIL RadErl[CurXp,CurYp]=1;
- SetCursor(CurXp,CurYp,CurCol);
- END;
- 'S': BEGIN (* Change Turndir *)
- Toggle(TurnRight);
- SetTurnDir;
- SoundFine;
- END;
- 'R': BEGIN
- Ende := TRUE;
- GetCoords := TRUE;
- END;
- '=': BEGIN
- Ende := TRUE;
- GetCoords := FALSE;
- END;
- 'D': Toggle(SoundOn);
- ';': Help;
- ELSE SoundBad;
- END;
- UNTIL Ende;
- END;
-
- PROCEDURE TurnWheel;
-
- VAR
- Cols : ARRAY[1..6] OF BYTE;
- i,Hlp : BYTE;
-
- BEGIN
- WITH Wheel[CurXp,CurYp] DO BEGIN
- FOR i := 1 TO 6 DO
- Cols[i]:=PlayField[FarbX[i],FarbY[i]];
- IF TurnRight THEN BEGIN
- Hlp := Cols[6];
- FOR i := 6 DOWNTO 2 DO Cols[i] := Cols[i-1];
- Cols[1] := Hlp;
- END
- ELSE BEGIN
- Hlp := Cols[1];
- FOR i := 1 TO 5 DO Cols[i] := Cols[i+1];
- Cols[6] := Hlp;
- END;
- FOR i := 1 TO 6 DO
- PlayField[FarbX[i],FarbY[i]] := Cols[i];
- END;
- END;
-
- PROCEDURE DrawWheel;
-
- VAR
- i : BYTE;
-
- BEGIN
- WITH Wheel[CurXp,CurYp] DO BEGIN
- FOR i:=1 TO 6 DO BEGIN
- WITH TriangleCoord[FarbX[i],FarbY[i]] DO BEGIN
- DrawOneStone(TriangleX,TriangleY,
- PlayField[FarbX[i],FarbY[i]],TriangleTop);
- END;
- END;
- END;
- END;
-
- FUNCTION TestIfComplete: BOOLEAN;
-
- VAR
- x,y : BYTE;
-
- BEGIN
- FOR x:=0 TO 10 DO BEGIN
- FOR y:=0 TO 5 DO BEGIN
- IF PlayField[x,y]<>OrgField[x,y] THEN BEGIN
- TestIfComplete:=FALSE;
- Exit;
- END;
- END;
- END;
- TestIfComplete:=TRUE
- END;
-
- FUNCTION GetKey: CHAR;
-
- VAR
- Ch : CHAR;
-
- BEGIN
- REPEAT
- Ch := ReadKey;
- IF Ch<>#0 THEN BEGIN
- SoundBad;
- Ch:=#0;
- END
- ELSE Ch := ReadKey;
- UNTIL Ch<>#0;
- GetKey := Ch;
- END;
-
- PROCEDURE GetNumber;
-
- VAR
- x,y : WORD;
- Nbr : BYTE;
- Temp : STRING;
- Ende : BOOLEAN;
- Ch : CHAR;
- Err : INTEGER;
-
- BEGIN
- SetTextStyle(SmallFont,HorizDir,4);
- SetColor(_red);
- OutTextXY(4,4,'Level:');
- Temp:='_'; x := 40; y := 4; Ende := FALSE; Nbr := 0;
- OutTextXY(x,y,Temp);
- REPEAT
- Ch := ReadKey;
- CASE Ch OF
- '0'..'9': BEGIN
- IF Nbr<4 THEN BEGIN
- SetColor(_black);
- OutTextXY(x,y,Temp);
- Delete(Temp,Length(Temp),1);
- Temp:=Temp+Ch+'_';
- SetColor(_red);
- OutTextXY(x,y,Temp);
- Inc(Nbr);
- END
- ELSE SoundBad;
- END;
- #8: BEGIN
- IF Nbr>0 THEN BEGIN
- SetColor(_black);
- OutTextXY(x,y,Temp);
- Delete(Temp,Length(Temp)-1,2);
- Temp:=Temp+'_';
- SetColor(_red);
- OutTextXY(x,y,Temp);
- Dec(Nbr);
- END
- ELSE SoundBad;
- END;
- #13: BEGIN
- IF Nbr>0 THEN BEGIN
- Delete(Temp,Length(Temp),1);
- Val(Temp,Level,Err);
- IF Level > 3 THEN Ende:= TRUE
- ELSE BEGIN
- Temp:=Temp+'_';
- SoundBad;
- END;
- END
- ELSE SoundBad;
- END;
- ELSE SoundBad;
- END;
- UNTIL Ende;
- END;
-
- PROCEDURE ShuffleWheel;
-
- VAR
- i : WORD;
- j,h : BYTE;
-
- BEGIN
- Randomize;
- FOR i := 1 TO Level DO BEGIN
- REPEAT
- CurXp := Random(9);
- CurYp := Random(5);
- UNTIL RadErl[CurXp,CurYp]<>0;
- IF Random(1) = 0 THEN TurnRight:=TRUE
- ELSE TurnRight:=FALSE;
- h := Random(3)+1;
- FOR j:=1 TO h DO TurnWheel;
- END;
- END;
-
- PROCEDURE GetLevel;
-
- BEGIN
- SoftScreen := HardScreen;
- SetViewPort(40,120,120,140,ClipOn);
- ClearViewPort;
- GetNumber;
- ClearViewPort;
- OutTextXY(8,4,'Bitte warten');
- SetViewPort(0,0,319,199,ClipOff);
- ShuffleWheel;
- HardScreen := SoftScreen;
- DrawTriangles;
- END;
-
- PROCEDURE ShowMoves(Mov: WORD);
-
- VAR
- Temp : STRING;
-
- BEGIN
- Dec(Mov);
- Str(Mov:4,Temp);
- Print(240,16,Temp,_black,_black,1,LeftText);
- Inc(Mov);
- Str(Mov:4,Temp);
- Print(240,16,Temp,_green,_red,1,LeftText);
- END;
-
- PROCEDURE ShowTime;
-
- VAR
- Hou,Min,Sec : BYTE;
- s1,s2,s3 : STRING;
- Ch : CHAR;
-
- BEGIN
- SetViewPort(8,80,311,98,ClipOn);
- ClearViewPort;
- SetColor(_yellow);
- Rectangle(0,0,311-8,98-80);
- Min := EndTime DIV 60;
- Sec := EndTime-Min*60;
- Hou := Min DIV 60;
- Min := Min-Hou*60;
- Str(Hou:2,s1);
- Str(Min:2,s2);
- Str(Sec:2,s3);
- s1:=s1+':'+s2+':'+s3;
- Print(2,6,'Geschafft !!! Zeit: '+s1,_green,_red,1,
- CenterText);
- Ch := ReadKey;
- IF Ch = #0 THEN Ch := ReadKey;
- SetViewPort(0,0,319,199,ClipOff);
- END;
-
- PROCEDURE MainPlay;
-
- VAR
- Ready,
- Ende : BOOLEAN;
- Fkey : CHAR;
- Moves : WORD;
-
- BEGIN
- Ende := FALSE;
- TitleScreen;
- REPEAT
- Fkey := GetKey;
- CASE Fkey OF
- '<': BEGIN
- Moves:=0;
- PlayField:=OrgField;
- ClearViewPort;
- CurXp := 2; CurYp := 0;
- DpX := 0; DpY := 0;
- TurnRight := TRUE;
- DrawHexagon(HexX,HexY,HexCol);
- DrawTriangles;
- InitWheel;
- GetLevel;
- SetCursor(CurXp,CurYp,CurCol);
- SetTurnDir;
- StartTime := Time;
- REPEAT
- IF NOT GetCoords THEN Exit;
- TurnWheel;
- DrawWheel;
- Inc(Moves);
- ShowMoves(Moves);
- SoundTurn;
- Ready:=TestIfComplete;
- UNTIL Ready;
- EndTime := (Time-StartTime) DIV 18;
- SoundReady;
- ShowTime;
- ClearViewPort;
- TitleScreen;
- END;
- '=': Ende:=TRUE;
- ';': Help;
- ELSE SoundBad;
- END;
- UNTIL Ende;
- END;
-
- BEGIN
- GInit;
- IVars;
- MainPlay;
- CloseGraph;
- END.
-