home *** CD-ROM | disk | FTP | other *** search
File List | 1991-04-03 | 14.4 KB | 589 lines |
- ' ========================================================================
- ' = MIRROR-PC für GFA-Basic 4.32 =
- ' = Nach einem Vorbild von Wolfgang Hübner (GFA-ST 2.0), =
- ' = ATARImagazin 4'89 =
- ' = (c) 1991 Gerald Arend & TOOLBOX =
- ' ========================================================================
- '
- DIM Shield$(3),Swupp$(20,8),X%(11,8),Y%(11,8),Sco%(2),Dead%(2),Shoot!(2,6)
- DIM Stone%(6,6),Gx%(2),Gy%(2)
- DIM SchussX%(72), SchussY%(72)
-
- MakeShapes
- DEFMOUSE 3
- DO
- StartGame
- Main
- LOOP
-
- PROCEDURE DrawSegment(x%, n%)
- IF n% AND 1 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%+1, Zy1%, x%+Zx%-1, Zy1%
- IF n% AND 2 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%, Zy1%+1, x%, Zy1%+Zy%-1
- IF n% AND 4 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%+Zx%, Zy1%+1, x%+Zx%, Zy1%+Zy%-1
- IF n% AND 8 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%+1, Zy1%+Zy%, x%+Zx%-1, Zy1%+Zy%
- IF n% AND 16 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%, Zy1%+Zy%+1, x%, Zy1%+2*Zy%-1
- IF n% AND 32 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%+Zx%, Zy1%+Zy%+1, x%+Zx%, Zy1%+2*Zy%-1
- IF n% AND 64 THEN
- COLOR on%
- ELSE
- COLOR off%
- ENDIF
- LINE x%+1, Zy1%+2*Zy%, x%+Zx%-1, Zy1%+2*Zy%
- RETURN
-
- PROCEDURE DrawZiffer(x%, n%)
- on% = 12 ' Farbe Segment an
- off% = 8 ' Farbe Segment aus
- Zx% = 10 ' Breite
- Zy% = 10 ' Höhe der Segmente
- Zy1% = 15 ' Y-Startposition der Ziffern
- SELECT n%
- CASE 0
- DrawSegment(x%, 119)
- CASE 1
- DrawSegment(x%, 36)
- CASE 2
- DrawSegment(x%, 93)
- CASE 3
- DrawSegment(x%, 109)
- CASE 4
- DrawSegment(x%, 46)
- CASE 5
- DrawSegment(x%, 107)
- CASE 6
- DrawSegment(x%, 123)
- CASE 7
- DrawSegment(x%, 37)
- CASE 8
- DrawSegment(x%, 127)
- CASE 9
- DrawSegment(x%, 111)
- ENDSELECT
- RETURN
-
- PROCEDURE MakeShapes ' Shapes zeichnen
- Col1% = 15
- SCREEN 17 ' VGA, 640 x 480, 16 Farben
- FOR i%=0 TO 3
- DEFFILL 8
- IF i%<2
- COLOR 12
- ELSE
- COLOR 10
- ENDIF
- PCIRCLE 25, 25, 15
- IF i%<2
- COLOR 4
- ELSE
- COLOR 2
- ENDIF
- DEFLINE 1,1
- CIRCLE 25,25,15
- COLOR 15
- DEFLINE 1,3
- IF i%=0
- LINE 10,10,40,40
- ENDIF
- SELECT i%
- CASE 1,3
- LINE 10,40,40,10
- CASE 0,2
- LINE 10,10,40,40
- ENDSELECT
- GET 2,2,48,48,Shield$(i%)
- CLS
- NEXT i%
- DIM Score$(8)
- DEFLINE 1,1
- COLOR 15
- DEFFILL 0
- GRAPHMODE 1
- FOR J%=0 TO 8
- DrawZiffer(13+J%*50, J%+1)
- DrawZiffer(13+J%*50+Zx%+4, 0)
- GET 8+J%*50,0,45+J%*50,50,Score$(J%)
- NEXT J%
- COLOR 13
- FOR i%=0 TO 20
- FOR J%=0 TO 8
- BOX 5+i%+J%*50,5+i%,45-i%+J%*50,45-i%
- GET 5+i%+J%*50,5+i%,45-i%+J%*50,45-i%,Swupp$(i%,J%)
- NEXT J%
- NEXT i%
- ERASE Score$()
- CLS
- GET 2,2,48,48,Leer$
- COLOR 7
- DEFFILL 14
- PBOX 0, 0, 639, 479
- DEFFILL 0
- PBOX 412,12,628,388
- PBOX 10, 409, 629, 453
- COLOR 6
- BOX 415,15,625,385
- BOX 416,16,624,384
- COLOR 14
- PRINT AT(54,3);"▓▓▓▓▓ ▓"
- PRINT AT(54,4);"▓ ▓ ▓"
- PRINT AT(54,5);"▓ ▓ ▓ ▓ ▓▓▓ ▓▓▓ ▓▓▓▓ ▓▓▓"
- PRINT AT(54,6);"▓ ▓ ▓ ▓ ▓ ▓ ▓ ▓"
- PRINT AT(54,7);"▓ ▓ ▓ ▓ ▓ ▓▓▓▓ ▓"
- COLOR 12
- BOX 12, 412, 627, 451
- PRINT AT(3,27);" Maustasten: <links> Spiegel drehen/schießen <rechts> Spiegel verschieben "
- PRINT AT(3,28);" Spiegel zuerst verschieben, dann drehen! <Q> Spiel beenden oder neu "
- COLOR 2
- PRINT AT(54,24);" (c) 1991 toolbox"
- RETURN ' MakeShapes
-
- PROCEDURE DrawMirror(x%, y%, Nr%) ' einen Spiegelstein zeichnen
- PUT x%*50+2,y%*50+2,Shield$(Nr%)
- RETURN
-
- PROCEDURE StartGame ' Neuanfang
- ALERT 2, "Schwierigkeit", 1, "1|2", Bad%
- DEC Bad%
- ALERT 2, "Soundeffekte", 1, "An|Aus", Sound%
- SoundOn! = (Sound%=1)
- t% = POPUP("Anzahl Spiegel|16 Spiegel|20 Spiegel|24 Spiegel|28 Spiegel|32 Spiegel|36 Spiegel", 320, 250, 1)
- Anzahl% = 12+t%*4
- Again!=FALSE
- GRAPHMODE 1
- COLOR 7, 0
- DEFFILL 14
- PBOX 0,0,400,398
- CLR E%, Anz%
- Tell%=((Tell%-1) XOR 1)+1
- ARRAYFILL Sco%(),0
- ARRAYFILL X%(),0
- ARRAYFILL Y%(),0
- ARRAYFILL Shoot!(),0
- ARRAYFILL Dead%(),0
- GRAPHMODE 1
- COLOR 14,1
- DEFFILL 0
- FOR H%=0 TO 1
- FOR n%=0 TO 5
- E1%=RANDOM(9)
- X%(E%,E1%)=25+H%*350
- Y%(E%,E1%)=75+n%*50
- PUT X%(E%,E1%)-20,Y%(E%,E1%)-20,Swupp$(0,E1%)
- PBOX 55+n%*50,5+H%*350,95+n%*50,45+H%*350
- BOX 55+n%*50,5+H%*350,95+n%*50,45+H%*350
- TEXT 71+n%*50,33+H%*350,2-H%
- INC E%
- NEXT n%
- NEXT H%
- ' Spiegelfeld zeichnen
- COLOR 15,0
- DEFFILL 0
- PBOX 49,49,351,351
- DEFLINE 1
- FOR x%=0 TO 6
- LINE 50+x%*50,50,50+x%*50,350
- LINE 50,x%*50+50,350,x%*50+50
- NEXT x%
- ' Spiegel setzen
- Anz%=Anzahl%
- ARRAYFILL Stone%(),-1
- WHILE Anz%>0 ' Spiegelsteine setzen
- Stx%=RANDOM(6)+1
- Sty%=RANDOM(6)+1
- IF Stone%(Stx%, Sty%)=-1 THEN
- Nr%=RANDOM(2+Bad%*2)
- DrawMirror(Stx%, Sty%, Nr%)
- Stone%(Stx%, Sty%)=Nr%
- DEC Anz%
- ENDIF
- WEND
- COLOR 15
- DEFFILL 8
- GRAPHMODE 3
- PBOX 55,5,95,45
- PBOX 55,355,95,395
- GRAPHMODE 1
- Gx%(1)=1
- Gy%(1)=7
- Gx%(2)=1
- Gy%(2)=0
- COLOR Col1%
- DEFFILL 2
- Tell%=2
- RETURN ' StartGame
-
- PROCEDURE TurnMirror(x%, y%)
- IF NOT Turned! THEN
- SELECT Stone%(x%, y%)
- CASE 0
- Stone%(x%, y%) = 1
- CASE 1
- Stone%(x%, y%) = 0
- CASE 2
- Stone%(x%, y%) = 3
- CASE 3
- Stone%(x%, y%) = 2
- ENDSELECT
- DrawMirror(x%, y%, Stone%(x%, y%))
- Turned!=TRUE
- ENDIF
- RETURN ' TurnMirror
- '
- PROCEDURE MoveMirror(x%, y%)
- IF (NOT Moved!) AND (NOT Turned!) THEN
- SUB Sco%(Tell%),50 ' Punkte abziehen
- Tell ' Info
- NrAlt% = Stone%(Stx%, Sty%)
- Stone%(Stx%,Sty%) = -1
- PUT Xx%+1,Yy%+1,Leer$ ' Altes Feld löschen
- GRAPHMODE 3
- Ok!=FALSE
- REPEAT
- MOUSE Xx%,Yy%,K%
- Xx%=INT(Xx%/50)*50
- Yy%=INT(Yy%/50)*50
- Stx%=Xx%/50
- Sty%=Yy%/50
- IF Xx%=>50 AND Xx%<=300 AND Yy%>=50 AND Yy%<=300
- IF Stone%(Stx%,Sty%)=-1
- DrawMirror(Stx%, Sty%, NrAlt%)
- Ok!=TRUE
- ELSE
- Ok!=FALSE
- ENDIF
- ELSE
- Ok!=FALSE
- ENDIF
- IF Ok!=TRUE THEN
- PUT Stx%*50+2,Sty%*50+2,Leer$
- ENDIF
- UNTIL K%=0 AND Ok!=TRUE
- DrawMirror(Stx%, Sty%, NrAlt%)
- Stone%(Xx%/50,Yy%/50)=NrAlt% ' Wert zurückschreiben
- Moved!=TRUE ' Zug beendet
- ENDIF
- RETURN ' MoveMirror
-
- PROCEDURE Main ' Haupt-Spielroutine
- DO
- Tell%=((Tell%-1) XOR 1)+1 ' Nr des Spielers
- Tell ' Info anzeigen
- IF Again! THEN
- GOTO raus
- ENDIF
- CLR R%,Merki%,Merkh%,Key%,Moved!,Turned!,Mex% ' Variablen löschen
- GRAPHMODE 3
- WHILE MOUSEK
- WEND
- REPEAT
- MOUSE Xx%,Yy%,K%
- Xx%=INT(Xx%/50)*50
- Yy%=INT(Yy%/50)*50
- Key$=UPPER$(INKEY$)
- WHILE INKEY$<>""
- WEND
- IF Key$="Q" ' Spiel abbrechen
- ALERT 1,"Wollen Sie das|Spiel beenden?",1,"Weiter|Neu|Quit",a
- SELECT a
- CASE 2
- GOTO raus
- CASE 3
- SCREEN 2 ' Ende im Gelände
- END
- ENDSELECT
- ENDIF
- ' Spiegel drehen oder verschieben
- IF Xx%=>50 AND Xx%<=300 AND Yy%>=50 AND Yy%<=300 THEN ' AND Out!=FALSE
- Stx%=Xx%/50 ' Screen- in Feldkoordinaten umrechnen
- Sty%=Yy%/50
- Xx%=INT(Xx%/50)*50 ' Feldkoordinaten runden
- Yy%=INT(Yy%/50)*50
- IF K% AND Stone%(Stx%,Sty%) > -1 THEN
- SELECT K%
- CASE 1
- TurnMirror(Stx%,Sty%) ' Spiegel drehen -> Taste 1
- CASE 2
- IF Sco%(Tell%)=>50 ' verschieben -> Taste 2
- MoveMirror(Stx%,Sty%) ' min. 50 Punkte nötig!
- ENDIF
- ENDSELECT
- ENDIF
- ENDIF
- ' Schwarzes Feld bewegt sich
- IF Xx%/50<>Mex% AND Xx%=>50 AND Xx%<=300
- Mex%=Xx%/50
- COLOR 15,0
- DEFFILL 8
- PBOX Gx%(Tell%)*50+5,Gy%(Tell%)*50+5,Gx%(Tell%)*50+45,Gy%(Tell%)*50+45
- Gx%(Tell%)=Xx%/50
- Gy%(Tell%)=((Tell%-1) XOR 1)*7
- PBOX Gx%(Tell%)*50+5,Gy%(Tell%)*50+5,Gx%(Tell%)*50+45,Gy%(Tell%)*50+45
- COLOR 15
- DEFFILL 2
- ENDIF
- '
- UNTIL K% AND ((Xx%=>50 AND Xx%<=300 AND Yy%=350 AND Tell%=1) OR (Xx%=>50 AND Xx%<=300 AND Yy%=0 AND Tell%=2))
- ' SCHUSS!
- IF Gy%(Tell%)=0 THEN ' Startkoordinaten für Strahl ermitteln
- Wx%=0
- Wy%=1
- x%=Gx%(Tell%)*50+25
- y%=25
- ENDIF
- IF Gy%(Tell%)=7 THEN
- Wx%=0
- Wy%=-1
- x%=Gx%(Tell%)*50+25
- y%=375
- ENDIF
- ' Screen-sichern nach der im Artikel beschriebenen Methode wurde
- ' ausdokumentiert. Grund: Speicherplatzprobleme.
- ' FOR n%=0 TO 360 STEP 40
- ' GET 0, n%, 399, n%+39, Monitor$(n% DIV 40 + 1)
- ' NEXT n%
- GRAPHMODE 3 ' andere Methode: Linien mit XOR-Modus zeichnen
- COLOR 14
- Step%=1
- SchussX1% = x%
- SchussY1% = y%
- REPEAT
- FOR t%=1 TO 50 ' Linie von einem Feld zum nächsten ziehen
- IF t% MOD 20 = 0 THEN
- PAUSE 1
- ENDIF
- ADD x%,Wx%
- ADD y%,Wy%
- PLOT x%,y% ' einzelne Punkte!
- NEXT t%
- xf%=(x%-25) DIV 50 ' Feldkoordinate x
- yf%=(y%-25) DIV 50 ' Feldkoordinate y
- SchussX%(Step%) = Wx% ' Richtungen sichern
- SchussY%(Step%) = Wy%
- INC Step%
- IF xf%>0 AND xf%<7 AND yf%>0 AND yf%<7 THEN
- SELECT Stone%(xf%, yf%) ' Spiegeltyp checken
- CASE -1
- Reflektion% = 0
- CASE 1, 2
- Reflektion% = 1
- IF SoundOn! THEN
- SOUND 800, 0 ' ist in der neusten GFA-Version jetzt implementiert!
- SOUND 400, 0
- ENDIF
- CASE 0, 3
- Reflektion% = 2
- IF SoundOn!
- SOUND 800, 0
- SOUND 400, 0
- ENDIF
- ENDSELECT
- SELECT Reflektion%
- CASE 2
- IF Wx%<>0 THEN
- Wy%=Wx%
- Wx%=0
- ELSE
- Wx%=Wy%
- Wy%=0
- ENDIF
- CASE 1
- IF Wx%<>0 THEN
- Wy%=-Wx%
- Wx%=0
- ELSE
- Wx%=-Wy%
- Wy%=0
- ENDIF
- ENDSELECT
- ENDIF
- UNTIL x%=25 OR x%=375 OR y%=25 OR y%=375
- ' Screen-restaurieren nach der im Artikel beschriebenen Methode wurde
- ' ausdokumentiert. Grund: Speicherplatzprobleme.
- ' FOR n%=0 TO 360 STEP 40 ' Screen restaurieren
- ' PUT 0, n%, Monitor$(n% DIV 40 + 1)
- ' NEXT n%
- ' PLOT SchussX1%, SchussX2%
- FOR Step%=1 TO Step%-1
- FOR t%=1 TO 50 ' Linie von einem Feld zum nächsten ziehen
- ADD SchussX1%, SchussX%(Step%)
- ADD SchussY1%, SchussY%(Step%)
- PLOT SchussX1%,SchussY1%
- NEXT t%
- NEXT Step%
-
- IF y%=25 OR y%=375 ' Grundstein getroffen
- Shoot
- ELSE ' Scorefeld getroffen
- CLR U%
- FOR H%=0 TO 8
- FOR i%=0 TO 11
- IF x%=X%(i%,H%) AND y%=Y%(i%,H%)
- U%=H%
- Merki%=i%
- Merkh%=H%
- ADD Sco%(Tell%),(H%+1)*10
- ENDIF
- NEXT i%
- NEXT H%
- Uu%=RANDOM(9)
- X%(Merki%,Merkh%)=0
- Y%(Merki%,Merkh%)=0
- X%(Merki%,Uu%)=x%
- Y%(Merki%,Uu%)=y%
- FOR i%=0 TO 40 ' Scorestein animieren
- IF i%<20
- PUT x%-20+R%,y%-20+R%,Swupp$(R%,U%)
- IF (i% MOD 3 = 0) AND SoundOn! THEN
- SOUND 400+i%*10, 0
- ENDIF
- ELSE
- PUT x%-20+R%,y%-20+R%,Swupp$(R%,Uu%)
- IF (i% MOD 3 = 0) AND SoundOn! THEN
- SOUND 800-i%*10, 0
- ENDIF
- ENDIF
- IF i%<20
- INC R%
- ELSE
- DEC R%
- ENDIF
- FOR H%=1 TO 50
- NEXT H%
- NEXT i%
- ENDIF
- LOOP
- raus:
- RETURN ' Main
-
- PROCEDURE Tell ' Infobox aktualisieren
- GRAPHMODE 1
- COLOR 15, 0
- PRINT AT(59,10);" Spieler ";Tell%;": "
- COLOR 12
- PRINT AT(57,12);"Drehe die Spiegel!"
- IF Sco%(Tell%)=>50
- PRINT AT(57,13);"Bewege die Spiegel!"
- ELSE
- PRINT AT(57,13);" "
- ENDIF
- IF Sco%(Tell%)=>200
- PRINT AT(55,14);"Schieß auf den Gegner!"
- ELSE
- PRINT AT(55,14);" "
- ENDIF
- COLOR 15
- PRINT AT(55,16);"Punkte Spieler 1: ";USING "-####",Sco%(1)
- PRINT AT(55,17);"Punkte Spieler 2: ";USING "-####",Sco%(2)
- IF Sco%(((Tell%-1) XOR 1)+1) < 0
- Dead(((Tell%-1) XOR 1)+1)
- ENDIF
- IF Sco%(Tell%)<0
- Dead(Tell%)
- ENDIF
- RETURN
-
- PROCEDURE Shoot ' Zahlenfeld getroffen
- GRAPHMODE 1
- COLOR 14, 1
- SUB Sco%(Tell%),200
- IF y%=25
- G%=2
- ENDIF
- IF y%=375
- G%=1
- ENDIF
- IF (y%=25 AND Tell%=1) OR (y%=375 AND Tell%=2)
- IF x%<>Gx%(((Tell%-1) XOR 1)+1)*50+25
- IF Shoot!(G%,(x%-25)/50)=FALSE
- IF Sco%(Tell%)=>0
- COLOR 0
- DEFFILL 8
- PBOX x%-20,y%-20,x%+20,y%+20
- COLOR 13
- IF SoundOn! THEN
- FOR t%=1000 TO 100 STEP -100
- SOUND t%, 1
- NEXT t%
- ENDIF
- Shoot!(G%,(x%-25)/50)=TRUE
- SUB Sco%(((Tell%-1) XOR 1)+1),100
- INC Dead%(G%)
- IF Dead%(G%)=5
- Dead(G%)
- ENDIF
- ELSE
- Shit!=TRUE
- PRINT AT(59,20);"Punkte im Soll!"
- ENDIF
- ELSE
- Shit!=TRUE
- PRINT AT(57,20);"Da ist nix mehr!"
- ENDIF
- ELSE
- Shit!=TRUE
- PRINT AT(57,20);"Markierter Stein!"
- ENDIF
- ELSE
- Shit!=TRUE
- PRINT AT(59,21);"Falsche Seite!"
- ENDIF
- IF Shit!=TRUE
- Shit!=FALSE
- ADD Sco%(((Tell%-1) XOR 1)+1),100
- IF SoundOn! THEN
- FOR t%=450 TO 400 STEP -2
- SOUND t%, 0
- SOUND 1000-t%, 0
- NEXT t%
- ELSE
- DELAY 3
- ENDIF
- COLOR 15, 0
- PRINT AT(57,20);" "
- PRINT AT(57,21);" "
- ENDIF
- RETURN
-
- PROCEDURE Dead(Tell%) ' The Winner!
- IF Tell%=1 THEN
- ALERT 1," Spieler 2:|Du hast gewonnen!| Noch einmal?",1,"Jawoll!|Nee...",a
- ELSE
- ALERT 1," Spieler 1:|Du hast gewonnen!| Noch einmal?",1,"Jawoll!|Nee...",a
- ENDIF
- IF a=1
- Again!=TRUE
- ELSE ' Programmende
- SCREEN 2 ' Textmodus
- END ' und tschüß...!
- ENDIF
- RETURN
-