mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-28 07:37:47 +00:00
610 lines
14 KiB
QBasic
610 lines
14 KiB
QBasic
|
CHDIR ".\programs\samples\pete\rectong"
|
||
|
|
||
|
DECLARE SUB AdvanceRound ()
|
||
|
DECLARE SUB SelectRounds ()
|
||
|
DECLARE SUB ShowControls ()
|
||
|
DECLARE SUB SelectDifficulty ()
|
||
|
DECLARE SUB DoAI ()
|
||
|
DECLARE SUB Player1Miss ()
|
||
|
DECLARE SUB Player2Miss ()
|
||
|
DECLARE SUB MoveBall ()
|
||
|
DECLARE SUB LaunchBall ()
|
||
|
DECLARE SUB DispStats ()
|
||
|
DECLARE SUB DrawBall ()
|
||
|
DECLARE SUB StartGame ()
|
||
|
DECLARE SUB InitCoord ()
|
||
|
DECLARE SUB DrawP2 ()
|
||
|
DECLARE SUB DrawP1 ()
|
||
|
DECLARE SUB LoadGFX ()
|
||
|
DECLARE SUB WipeEffect ()
|
||
|
DECLARE SUB Start2P ()
|
||
|
DECLARE SUB Start1P ()
|
||
|
DECLARE SUB ExitGame ()
|
||
|
DECLARE SUB MeltDown ()
|
||
|
DECLARE SUB FadePAL255 (fadetype!)
|
||
|
DECLARE SUB CenterText (sline!, Text AS STRING)
|
||
|
DECLARE SUB LoadPAL (filename AS STRING)
|
||
|
DECLARE SUB LoadFullBMP (filename AS STRING)
|
||
|
|
||
|
DIM SHARED AIserve
|
||
|
DIM SHARED butt(4, 32, 48)
|
||
|
DIM SHARED ball(12, 12)
|
||
|
DIM SHARED buttdir(1)
|
||
|
DIM SHARED balldir(1)
|
||
|
DIM SHARED rounds, cround
|
||
|
DIM SHARED p1score, p2score
|
||
|
DIM SHARED p1(1)
|
||
|
DIM SHARED p2(1)
|
||
|
DIM SHARED ballcor(1)
|
||
|
DIM SHARED players
|
||
|
DIM SHARED hasball
|
||
|
DIM SHARED difflevel
|
||
|
|
||
|
CLS : SCREEN 13: PALETTE: PALETTE 255, 63 + 256 * 63 + 65536 * 63: COLOR 255
|
||
|
|
||
|
LoadGFX
|
||
|
|
||
|
DO
|
||
|
InitCoord
|
||
|
LoadPAL "gfx\title01.pal"
|
||
|
LoadFullBMP "gfx\title01.rec"
|
||
|
DO: LOOP UNTIL INKEY$ = ""
|
||
|
menusel = 1
|
||
|
DO
|
||
|
cround = 1
|
||
|
SELECT CASE menusel
|
||
|
CASE 1
|
||
|
CenterText 2, CHR$(16) + " 1 Player "
|
||
|
CenterText 4, " 2 Player "
|
||
|
CenterText 6, " Controls "
|
||
|
CenterText 8, " Exit Rectong"
|
||
|
CASE 2
|
||
|
CenterText 2, " 1 Player "
|
||
|
CenterText 4, CHR$(16) + " 2 Player "
|
||
|
CenterText 6, " Controls "
|
||
|
CenterText 8, " Exit Rectong"
|
||
|
CASE 3
|
||
|
CenterText 2, " 1 Player "
|
||
|
CenterText 4, " 2 Player "
|
||
|
CenterText 6, CHR$(16) + " Controls "
|
||
|
CenterText 8, " Exit Rectong"
|
||
|
CASE 4
|
||
|
CenterText 2, " 1 Player "
|
||
|
CenterText 4, " 2 Player "
|
||
|
CenterText 6, " Controls "
|
||
|
CenterText 8, CHR$(16) + " Exit Rectong"
|
||
|
END SELECT
|
||
|
|
||
|
key$ = INKEY$
|
||
|
SELECT CASE key$
|
||
|
CASE CHR$(0) + CHR$(72) 'Up
|
||
|
IF menusel > 1 THEN menusel = menusel - 1
|
||
|
CASE CHR$(0) + CHR$(80) 'Down
|
||
|
IF menusel < 4 THEN menusel = menusel + 1
|
||
|
CASE CHR$(13) 'Enter
|
||
|
SELECT CASE menusel
|
||
|
CASE 1
|
||
|
players = 1: difflevel = 0: SelectDifficulty: IF difflevel = 0 THEN EXIT DO
|
||
|
StartGame
|
||
|
EXIT DO
|
||
|
CASE 2
|
||
|
players = 2: StartGame: EXIT DO
|
||
|
CASE 3: ShowControls: EXIT DO
|
||
|
CASE 4
|
||
|
ExitGame
|
||
|
END SELECT
|
||
|
END SELECT
|
||
|
LOOP
|
||
|
LOOP
|
||
|
|
||
|
SUB AdvanceRound
|
||
|
cround = cround + 1
|
||
|
IF cround > rounds THEN
|
||
|
CLS
|
||
|
IF p1score > p2score THEN winner = 1 ELSE winner = 2
|
||
|
IF p1score = p2score THEN winner = -1
|
||
|
IF winner <> -1 THEN
|
||
|
CenterText 11, "GAME OVER! Player" + STR$(winner) + " is the winner!"
|
||
|
ELSE
|
||
|
CenterText 11, "GAME OVER! Both players tied!"
|
||
|
END IF
|
||
|
CenterText 13, "Press Enter to continue..."
|
||
|
DO: LOOP UNTIL INKEY$ = CHR$(13)
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB CenterText (sline, Text AS STRING)
|
||
|
LOCATE sline, 20 - (LEN(Text) / 2)
|
||
|
PRINT Text;
|
||
|
END SUB
|
||
|
|
||
|
SUB DispStats
|
||
|
LOCATE 25, 1: COLOR 255
|
||
|
PRINT " 1P:" + LEFT$(STR$(p1score) + " goals ", 8) + SPACE$(4) + "Round:" + STR$(cround) + SPACE$(3) + " 2P:" + LEFT$(STR$(p2score) + " Goals ", 8);
|
||
|
LINE (0, 190)-(320, 190), 255
|
||
|
END SUB
|
||
|
|
||
|
SUB DoAI
|
||
|
SELECT CASE hasball
|
||
|
CASE 2
|
||
|
IF p2(1) < AIserve THEN buttdir(1) = 2
|
||
|
IF p2(1) > AIserve THEN buttdir(1) = 1
|
||
|
IF FIX(p2(1)) = FIX(AIserve) THEN buttdir(1) = 0
|
||
|
ballcor(1) = p2(1) + 24
|
||
|
ballcor(0) = 280
|
||
|
EXIT SUB
|
||
|
CASE 1
|
||
|
EXIT SUB
|
||
|
END SELECT
|
||
|
|
||
|
'THIS LINE DOES PERFECT AI, JUST FOR DEBUGGING:
|
||
|
'p2(1) = ballcor(1) - 6
|
||
|
|
||
|
factor = ABS(ballcor(1) - (p2(1) - 24))
|
||
|
difficulty = FIX(difflevel - (factor / 50))
|
||
|
IF difficulty < 0 THEN difficulty = 0
|
||
|
|
||
|
IF INT(RND * difficulty) = 0 THEN
|
||
|
IF FIX(p2(1)) + 24 > ballcor(1) THEN buttdir(1) = 1
|
||
|
IF FIX(p2(1)) + 24 < ballcor(1) THEN buttdir(1) = 2
|
||
|
IF FIX(p2(1)) + 24 = ballcor(1) THEN buttdir(1) = 0
|
||
|
ELSE
|
||
|
buttdir(1) = 0
|
||
|
END IF
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawBall
|
||
|
FOR y = 1 TO 12
|
||
|
FOR x = 1 TO 12
|
||
|
colr = ball(x, y)
|
||
|
'IF colr <> 4 THEN
|
||
|
PSET (ballcor(0) + x - 6, ballcor(1) + y - 6), colr
|
||
|
NEXT x
|
||
|
NEXT y
|
||
|
LINE (ballcor(0) - 10, ballcor(1) - 13)-(ballcor(0) - 7, ballcor(1) + 15), 0, BF
|
||
|
LINE (ballcor(0) + 7, ballcor(1) - 7)-(ballcor(0) + 10, ballcor(1) + 7), 0, BF
|
||
|
'LINE (ballcor(0) - 7, ballcor(1) - 15)-(ballcor(0) + 7, ballcor(1) - 13), 0, BF
|
||
|
'LINE (ballcor(0) - 7, ballcor(1) + 13)-(ballcor(0) + 7, ballcor(1) + 15), 0, BF
|
||
|
LINE (ballcor(0) - 10, 0)-(ballcor(0) + 10, ballcor(1) - 7), 0, BF
|
||
|
LINE (ballcor(0) - 10, ballcor(1) + 7)-(ballcor(0) + 10, 189), 0, BF
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawP1
|
||
|
LINE (0, 0)-(32, p1(1)), 0, BF
|
||
|
LINE (0, p1(1) + 49)-(32, 189), 0, BF
|
||
|
FOR y = 1 TO 48
|
||
|
FOR x = 1 TO 32
|
||
|
colr = butt(p1(0), x, y)
|
||
|
'IF colr <> 4 THEN
|
||
|
PSET (x, y + p1(1)), colr
|
||
|
NEXT x
|
||
|
NEXT y
|
||
|
END SUB
|
||
|
|
||
|
SUB DrawP2
|
||
|
LINE (288, 0)-(320, p2(1)), 0, BF
|
||
|
LINE (288, p2(1) + 49)-(320, 189), 0, BF
|
||
|
FOR y = 1 TO 48
|
||
|
FOR x = 1 TO 32
|
||
|
PSET (320 - x, y + p2(1)), butt(p2(0), x, y)
|
||
|
NEXT x
|
||
|
NEXT y
|
||
|
END SUB
|
||
|
|
||
|
SUB ExitGame
|
||
|
SCREEN 0: WIDTH 80: COLOR 7, 0: CLS
|
||
|
PRINT "Rectong v1.0 (c)2005 Mike Chambers"
|
||
|
PRINT "E-mail: half-eaten@yahoo.com"
|
||
|
PRINT
|
||
|
PRINT "Thanks for playing!"
|
||
|
END
|
||
|
END SUB
|
||
|
|
||
|
SUB FadePAL255 (fadetype)
|
||
|
SELECT CASE fadetype
|
||
|
CASE 1
|
||
|
FOR fader1 = 0 TO 63
|
||
|
PALETTE 255, fader1 + 256 * fader1 + 65536 * fader1
|
||
|
t! = TIMER: DO: LOOP UNTIL TIMER - t! > 0
|
||
|
NEXT fader1
|
||
|
CASE 0
|
||
|
FOR fader1 = 63 TO 0 STEP -1
|
||
|
PALETTE 255, fader1 + 256 * fader1 + 65536 * fader1
|
||
|
t! = TIMER: DO: LOOP UNTIL TIMER - t! > 0
|
||
|
NEXT fader1
|
||
|
END SELECT
|
||
|
END SUB
|
||
|
|
||
|
SUB InitCoord
|
||
|
p1(0) = 1: p2(0) = 1
|
||
|
p1(1) = 68: p2(1) = 68
|
||
|
ballcor(0) = 160: ballcor(1) = 92
|
||
|
buttdir(0) = 0: buttdir(1) = 0
|
||
|
END SUB
|
||
|
|
||
|
SUB LaunchBall
|
||
|
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadFullBMP (filename AS STRING)
|
||
|
DEF SEG = &HB800
|
||
|
ff = FREEFILE
|
||
|
OPEN filename FOR BINARY AS #ff
|
||
|
FOR sposy = 1 TO 200
|
||
|
aget$ = SPACE$(320): GET #ff, , aget$
|
||
|
FOR sposx = 1 TO 320
|
||
|
PSET (sposx, sposy), ASC(MID$(aget$, sposx, 1))
|
||
|
NEXT sposx
|
||
|
NEXT sposy
|
||
|
CLOSE #ff
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadGFX
|
||
|
FOR loader = 1 TO 4
|
||
|
ff = FREEFILE
|
||
|
nm$ = RIGHT$("0" + MID$(STR$(loader), 2), 2)
|
||
|
OPEN "gfx\butt" + nm$ + ".rec" FOR BINARY AS #ff
|
||
|
FOR loady = 1 TO 48
|
||
|
ain$ = SPACE$(32): GET #ff, , ain$
|
||
|
FOR loadx = 1 TO 32
|
||
|
butt(loader, loadx, loady) = ASC(MID$(ain$, loadx, 1))
|
||
|
NEXT loadx
|
||
|
NEXT loady
|
||
|
CLOSE #ff
|
||
|
NEXT loader
|
||
|
|
||
|
OPEN "gfx\ball00.rec" FOR BINARY AS #ff
|
||
|
FOR loady = 1 TO 12
|
||
|
ain$ = SPACE$(12): GET #ff, , ain$
|
||
|
FOR loadx = 1 TO 12
|
||
|
ball(loadx, loady) = ASC(MID$(ain$, loadx, 1))
|
||
|
NEXT loadx
|
||
|
NEXT loady
|
||
|
CLOSE #ff
|
||
|
|
||
|
END SUB
|
||
|
|
||
|
SUB LoadPAL (filename AS STRING)
|
||
|
ff = FREEFILE
|
||
|
PALETTE 255, 63 + 256 * 63 + 65536 * 63
|
||
|
OPEN filename FOR BINARY AS #ff
|
||
|
S$ = SPACE$(28): GET #ff, , S$
|
||
|
FOR n = 1 TO 255
|
||
|
inpt$ = SPACE$(4)
|
||
|
a$ = SPACE$(1)
|
||
|
B$ = SPACE$(1)
|
||
|
c$ = SPACE$(1)
|
||
|
d$ = SPACE$(1)
|
||
|
GET #ff, , inpt$
|
||
|
a$ = LEFT$(inpt$, 1)
|
||
|
B$ = MID$(inpt$, 2, 1)
|
||
|
c$ = MID$(inpt$, 3, 1)
|
||
|
|
||
|
rat = (255 / 63)
|
||
|
r& = ASC(a$) / rat
|
||
|
g& = ASC(B$) / rat
|
||
|
B& = ASC(c$) / rat
|
||
|
PALETTE n, r& + 256 * g& + 65536 * B&
|
||
|
NEXT n
|
||
|
CLOSE #ff
|
||
|
END SUB
|
||
|
|
||
|
SUB MeltDown
|
||
|
DO
|
||
|
FOR psy = 1 TO 200
|
||
|
FOR psx = 1 TO 320
|
||
|
colr = POINT(psx, psy)
|
||
|
LINE (psx, psy + INT(RND * 3))-(psx, psy + INT(RND * 30) + 8), colr
|
||
|
NEXT psx
|
||
|
LINE (1, psy)-(320, psy), 0
|
||
|
t! = TIMER: DO: LOOP UNTIL TIMER - t! > 0
|
||
|
NEXT psy
|
||
|
LOOP UNTIL INKEY$ <> "" OR which = 4
|
||
|
END SUB
|
||
|
|
||
|
SUB MoveBall
|
||
|
IF hasball <> 0 THEN EXIT SUB
|
||
|
|
||
|
ballcor(0) = ballcor(0) + balldir(0)
|
||
|
ballcor(1) = ballcor(1) + balldir(1)
|
||
|
|
||
|
'Check ball hitting stuff
|
||
|
p1top = p1(1)
|
||
|
p1bot = p1(1) + 48
|
||
|
p2top = p2(1)
|
||
|
p2bot = p2(1) + 48
|
||
|
|
||
|
IF balldir(1) = 0 THEN fact = 1
|
||
|
|
||
|
IF ballcor(0) <= 32 THEN 'if within X range of player 1 butt
|
||
|
IF ballcor(1) >= p1top AND ballcor(1) <= p1bot THEN
|
||
|
yfactor = ((ballcor(1) - p1top) - 24)
|
||
|
IF yfactor <> 0 THEN yfactor = yfactor / 25 ELSE yfactor = 0
|
||
|
IF balldir(1) = 0 THEN fact = 1
|
||
|
|
||
|
balldir(0) = -balldir(0)
|
||
|
balldir(1) = yfactor '* fact
|
||
|
END IF
|
||
|
END IF
|
||
|
|
||
|
IF ballcor(0) >= 288 THEN 'if within X range of player 1 butt
|
||
|
IF ballcor(1) >= p2top AND ballcor(1) <= p2bot THEN
|
||
|
yfactor = ((ballcor(1) - p2top) - 24)
|
||
|
IF yfactor <> 0 THEN yfactor = yfactor / 25 ELSE yfactor = 0
|
||
|
|
||
|
balldir(0) = -balldir(0)
|
||
|
balldir(1) = yfactor '* balldir(1)
|
||
|
END IF
|
||
|
END IF
|
||
|
'End ball checking
|
||
|
|
||
|
IF ballcor(1) <= 7 THEN ballcor(1) = 7: balldir(1) = -balldir(1)
|
||
|
IF ballcor(1) >= 183 THEN ballcor(1) = 183: balldir(1) = -balldir(1)
|
||
|
|
||
|
'Check for player missing ball
|
||
|
IF ballcor(0) < 25 THEN Player1Miss 'If player 1 misses the ball
|
||
|
IF ballcor(0) > 295 THEN Player2Miss 'If player 2 misses the ball
|
||
|
'End check
|
||
|
END SUB
|
||
|
|
||
|
SUB Player1Miss
|
||
|
AdvanceRound
|
||
|
IF cround > rounds THEN CLS : EXIT SUB
|
||
|
p2score = p2score + 1
|
||
|
hasball = 2: CLS
|
||
|
CenterText 11, "PLAYER 1 MISSED THE BALL!"
|
||
|
CenterText 13, "Next round: Player 2 starts."
|
||
|
CenterText 14, "Press ENTER when ready."
|
||
|
DO: LOOP UNTIL INKEY$ = CHR$(13)
|
||
|
InitCoord
|
||
|
RANDOMIZE TIMER
|
||
|
AIserve = INT(RND * 130) + 5
|
||
|
CLS
|
||
|
END SUB
|
||
|
|
||
|
SUB Player2Miss
|
||
|
AdvanceRound
|
||
|
IF cround > rounds THEN CLS : EXIT SUB
|
||
|
p1score = p1score + 1
|
||
|
hasball = 1: CLS
|
||
|
CenterText 11, "PLAYER 2 MISSED THE BALL!"
|
||
|
CenterText 13, "Next round: Player 1 starts."
|
||
|
CenterText 14, "Press ENTER when ready."
|
||
|
DO: LOOP UNTIL INKEY$ = CHR$(13)
|
||
|
InitCoord
|
||
|
CLS
|
||
|
END SUB
|
||
|
|
||
|
SUB SelectDifficulty
|
||
|
CLS
|
||
|
menusel = 4
|
||
|
CenterText 6, "Select difficulty"
|
||
|
CenterText 8, " Too simple!"
|
||
|
CenterText 9, " Easy "
|
||
|
CenterText 10, " Pretty easy"
|
||
|
CenterText 11, " Average "
|
||
|
CenterText 12, " Hard "
|
||
|
CenterText 13, " Harder "
|
||
|
CenterText 14, " Good luck!!"
|
||
|
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
update = 0
|
||
|
SELECT CASE key$
|
||
|
CASE CHR$(0) + CHR$(72) 'Up
|
||
|
IF menusel > 1 THEN menusel = menusel - 1: update = 1
|
||
|
CASE CHR$(0) + CHR$(80) 'Down
|
||
|
IF menusel < 7 THEN menusel = menusel + 1: update = 1
|
||
|
CASE CHR$(13) 'Enter
|
||
|
SELECT CASE menusel
|
||
|
CASE 1: difflevel = 12
|
||
|
CASE 2: difflevel = 11
|
||
|
CASE 3: difflevel = 6
|
||
|
CASE 4: difflevel = 4
|
||
|
CASE 5: difflevel = 3
|
||
|
CASE 6: difflevel = 2
|
||
|
CASE 7: difflevel = 1
|
||
|
END SELECT
|
||
|
EXIT SUB
|
||
|
CASE CHR$(27) 'Return to main menu
|
||
|
EXIT SUB
|
||
|
END SELECT
|
||
|
|
||
|
LOCATE 6 + menusel, 13: PRINT " ";
|
||
|
LOCATE 7 + menusel, 13: PRINT CHR$(16);
|
||
|
LOCATE 8 + menusel, 13: PRINT " ";
|
||
|
LOOP
|
||
|
END SUB
|
||
|
|
||
|
SUB SelectRounds
|
||
|
CLS
|
||
|
menusel = 1
|
||
|
rounds = 3
|
||
|
CenterText 11, " Rounds: 3"
|
||
|
CenterText 13, " Let's go!"
|
||
|
DO
|
||
|
key$ = INKEY$
|
||
|
update = 0
|
||
|
SELECT CASE key$
|
||
|
CASE CHR$(0) + CHR$(72) 'Up
|
||
|
IF menusel > 1 THEN menusel = menusel - 1: update = 1
|
||
|
CASE CHR$(0) + CHR$(80) 'Down
|
||
|
IF menusel < 2 THEN menusel = menusel + 1: update = 1
|
||
|
CASE CHR$(13) 'Enter
|
||
|
SELECT CASE menusel
|
||
|
CASE 1
|
||
|
rounds = rounds + 1
|
||
|
IF rounds = 10 THEN rounds = 1
|
||
|
CenterText 11, " Rounds:" + STR$(rounds)
|
||
|
CASE 2
|
||
|
EXIT SUB
|
||
|
END SELECT
|
||
|
|
||
|
CASE CHR$(27) 'Return to main menu
|
||
|
EXIT SUB
|
||
|
END SELECT
|
||
|
|
||
|
SELECT CASE menusel
|
||
|
CASE 1: LOCATE 11, 14: PRINT CHR$(16); : LOCATE 13, 14: PRINT " ";
|
||
|
CASE 2: LOCATE 13, 14: PRINT CHR$(16); : LOCATE 11, 14: PRINT " ";
|
||
|
END SELECT
|
||
|
LOOP
|
||
|
END SUB
|
||
|
|
||
|
SUB ShowControls
|
||
|
CLS
|
||
|
CenterText 2, "RECTONG CONTROLS"
|
||
|
CenterText 6, "Player 1 controls:"
|
||
|
CenterText 7, "A - Move up"
|
||
|
CenterText 8, "Z - Move down"
|
||
|
CenterText 9, "X - Stop moving"
|
||
|
CenterText 10, "S - Serve ball"
|
||
|
CenterText 12, "Player 2 controls:"
|
||
|
CenterText 13, "Up arrow - Move up"
|
||
|
CenterText 14, "Down arrow - Move down"
|
||
|
CenterText 15, "End - Stop moving"
|
||
|
CenterText 16, "\ - Serve ball"
|
||
|
CenterText 20, "Escape exits an active game."
|
||
|
CenterText 24, "Press ENTER to continue..."
|
||
|
DO: LOOP UNTIL INKEY$ = CHR$(13)
|
||
|
CLS
|
||
|
END SUB
|
||
|
|
||
|
SUB StartGame
|
||
|
SelectRounds
|
||
|
p1score = 0
|
||
|
p2score = 0
|
||
|
cround = 0
|
||
|
|
||
|
quitgame = 0
|
||
|
hasball = 1 'who starts with the ball
|
||
|
|
||
|
WipeEffect
|
||
|
LoadPAL "gfx\palette.pal": PALETTE 4, 0: PALETTE 255, 63 + 256 * 63 + 65536 * 63
|
||
|
LaunchBall
|
||
|
DO UNTIL quitgame = 1 OR cround > rounds
|
||
|
SELECT CASE hasball
|
||
|
CASE 1
|
||
|
ballcor(0) = 40
|
||
|
ballcor(1) = p1(1) + 24
|
||
|
CASE 2
|
||
|
ballcor(0) = 280
|
||
|
ballcor(1) = p2(1) + 24
|
||
|
END SELECT
|
||
|
|
||
|
SELECT CASE hasball
|
||
|
CASE 1
|
||
|
CenterText 2, "Player 1 has the ball!"
|
||
|
CenterText 3, "Press S to serve."
|
||
|
p1(0) = 4
|
||
|
p2(0) = 1
|
||
|
CASE 2
|
||
|
CenterText 2, "Player 2 has the ball!"
|
||
|
IF players = 2 THEN
|
||
|
CenterText 3, "Press \ to throw."
|
||
|
ELSE
|
||
|
CenterText 3, "Get ready, player 1!"
|
||
|
END IF
|
||
|
p2(0) = 4
|
||
|
p1(0) = 1
|
||
|
CASE ELSE
|
||
|
p1(0) = 1
|
||
|
p2(0) = 1
|
||
|
END SELECT
|
||
|
|
||
|
DrawP1
|
||
|
DrawP2
|
||
|
IF hasball = 0 THEN DrawBall
|
||
|
|
||
|
DispStats
|
||
|
|
||
|
skip = skip + 1
|
||
|
IF skip AND 1 THEN WAIT &H3DA, 8: WAIT &H3DA, 8, 8
|
||
|
|
||
|
key$ = INKEY$
|
||
|
SELECT CASE key$
|
||
|
CASE CHR$(27) 'Escape key
|
||
|
CenterText 12, "Exit to main menu? (Y/N)"
|
||
|
DO
|
||
|
SELECT CASE LCASE$(INKEY$)
|
||
|
CASE "y"
|
||
|
quitgame = 1: EXIT DO
|
||
|
CASE "n"
|
||
|
EXIT DO
|
||
|
END SELECT
|
||
|
LOOP
|
||
|
CenterText 12, " "
|
||
|
|
||
|
CASE "a", "A" 'Up P1
|
||
|
IF buttdir(0) = 0 OR buttdir(0) = 2 THEN buttdir(0) = 1 ELSE buttdir(0) = 0
|
||
|
|
||
|
CASE "z", "Z" 'Down P1
|
||
|
IF buttdir(0) = 0 OR buttdir(0) = 1 THEN buttdir(0) = 2 ELSE buttdir(0) = 0
|
||
|
|
||
|
CASE "x", "X" 'Stops P1 movement
|
||
|
buttdir(0) = 0
|
||
|
|
||
|
CASE "s", "S" 'Shoot ball P1
|
||
|
IF hasball = 1 THEN
|
||
|
CenterText 2, SPACE$(24): CenterText 3, SPACE$(24)
|
||
|
hasball = 0
|
||
|
balldir(0) = 1
|
||
|
balldir(1) = 0
|
||
|
END IF
|
||
|
|
||
|
CASE CHR$(0) + CHR$(79) 'Stops P2 movement
|
||
|
buttdir(1) = 0
|
||
|
|
||
|
CASE "\" 'Shoot ball P2
|
||
|
IF hasball = 2 AND players = 2 THEN
|
||
|
CenterText 2, SPACE$(24): CenterText 3, SPACE$(24)
|
||
|
hasball = 0
|
||
|
balldir(0) = -1
|
||
|
balldir(1) = 0
|
||
|
END IF
|
||
|
|
||
|
CASE CHR$(0) + CHR$(72) 'Up P2
|
||
|
IF players = 2 THEN IF buttdir(1) = 0 OR buttdir(1) = 2 THEN buttdir(1) = 1 ELSE buttdir(1) = 0
|
||
|
|
||
|
CASE CHR$(0) + CHR$(80) 'Down P2
|
||
|
IF players = 2 THEN IF buttdir(1) = 0 OR buttdir(1) = 1 THEN buttdir(1) = 2 ELSE buttdir(1) = 0
|
||
|
END SELECT
|
||
|
|
||
|
IF players = 1 THEN DoAI
|
||
|
IF hasball = 2 AND players = 1 AND FIX(AIserve) = FIX(p2(1)) THEN
|
||
|
CenterText 2, SPACE$(24): CenterText 3, SPACE$(24)
|
||
|
hasball = 0
|
||
|
balldir(0) = -1
|
||
|
balldir(1) = 0
|
||
|
END IF
|
||
|
|
||
|
SELECT CASE buttdir(0)
|
||
|
CASE 1
|
||
|
IF p1(1) > 1 THEN p1(1) = p1(1) - 1
|
||
|
|
||
|
CASE 2
|
||
|
IF p1(1) < 138 THEN p1(1) = p1(1) + 1
|
||
|
END SELECT
|
||
|
|
||
|
SELECT CASE buttdir(1)
|
||
|
CASE 1
|
||
|
IF p2(1) > 1 THEN p2(1) = p2(1) - 1
|
||
|
|
||
|
CASE 2
|
||
|
IF p2(1) < 138 THEN p2(1) = p2(1) + 1
|
||
|
END SELECT
|
||
|
|
||
|
MoveBall
|
||
|
LOOP
|
||
|
CLS : EXIT SUB
|
||
|
END SUB
|
||
|
|
||
|
SUB WipeEffect
|
||
|
FOR xeff = 0 TO 160 STEP .01
|
||
|
LINE (160 + xeff, 0)-(160 + xeff, 200), 0
|
||
|
LINE (160 - xeff, 0)-(160 - xeff, 200), 0
|
||
|
't! = TIMER: DO: LOOP UNTIL TIMER - t! > 0
|
||
|
NEXT xeff
|
||
|
END SUB
|
||
|
|