mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-01 21:00:16 +00:00
1561 lines
32 KiB
QBasic
1561 lines
32 KiB
QBasic
CHDIR ".\programs\samples\thebob\sol"
|
|
|
|
'****************************************************************************'
|
|
'-------------------------- S O L I T A I R E - 3 ---------------------------'
|
|
'------------- Copyright (C) 2000-2007 by Bob Seguin (Freeware) -------------'
|
|
'****************************************************************************'
|
|
|
|
DEFINT A-Z
|
|
|
|
DECLARE FUNCTION InitMOUSE ()
|
|
|
|
DECLARE SUB MouseDRIVER (LB, RB, mX, mY)
|
|
DECLARE SUB MouseSTATUS (LB, RB, MouseX, MouseY)
|
|
DECLARE SUB ShowMOUSE ()
|
|
DECLARE SUB HideMOUSE ()
|
|
DECLARE SUB PauseMOUSE (LB, RB, MouseX, MouseY)
|
|
DECLARE SUB ClearMOUSE ()
|
|
|
|
DECLARE SUB DrawSCREEN (Mode)
|
|
DECLARE SUB Interval (Length!)
|
|
DECLARE SUB CheckOUT ()
|
|
DECLARE SUB InitVALS ()
|
|
|
|
DECLARE SUB PlayGAME ()
|
|
|
|
DECLARE SUB Sol3MENU (Item)
|
|
DECLARE SUB Sol3DEAL ()
|
|
DECLARE SUB Sol3UNDO ()
|
|
DECLARE SUB Sol3HELP (Item)
|
|
DECLARE SUB BigBOX (InOUT)
|
|
|
|
DECLARE SUB SetSCORE ()
|
|
DECLARE SUB PutCARD (x, y, CardNUM)
|
|
DECLARE SUB CheckTOTAL ()
|
|
DECLARE SUB Finito ()
|
|
|
|
TYPE PlayTYPE
|
|
Suit AS INTEGER
|
|
Value AS INTEGER
|
|
x AS INTEGER
|
|
y AS INTEGER
|
|
UpDOWN AS INTEGER
|
|
END TYPE
|
|
DIM SHARED MainPLAY(1 TO 7, 0 TO 18) AS PlayTYPE
|
|
|
|
TYPE DeckTYPE
|
|
Suit AS INTEGER
|
|
Value AS INTEGER
|
|
END TYPE
|
|
DIM SHARED Decks(1 TO 3, 1 TO 8) AS DeckTYPE
|
|
DIM SHARED TurnUPs(0 TO 24) AS DeckTYPE
|
|
DIM SHARED Stacks(1 TO 4) AS DeckTYPE
|
|
DIM SHARED Trick(1 TO 18) AS DeckTYPE
|
|
|
|
DIM SHARED LettFileName$
|
|
|
|
REDIM SHARED Buttons(600)
|
|
REDIM SHARED Title(1 TO 250)
|
|
REDIM SHARED Card(1 TO 2400)
|
|
REDIM SHARED CardBACK(1 TO 2400)
|
|
REDIM SHARED BackERASE(1 TO 2600)
|
|
REDIM SHARED Selected(1 TO 2400)
|
|
REDIM SHARED Suits(1 TO 800)
|
|
REDIM SHARED MenuBOX(220)
|
|
REDIM SHARED ItemBOX(500)
|
|
REDIM SHARED MenuGFX(500)
|
|
REDIM SHARED Deck(1 TO 52)
|
|
REDIM SHARED TopOFF(1 TO 44)
|
|
REDIM SHARED Chek(50)
|
|
REDIM SHARED GetBOX(8000)
|
|
REDIM SHARED OtherBOX(8000)
|
|
REDIM SHARED Numbers(1100)
|
|
|
|
DIM SHARED Score AS LONG
|
|
DIM SHARED MoneyCARD
|
|
DIM SHARED Tally
|
|
DIM SHARED StackIT
|
|
DIM SHARED Completed
|
|
DIM SHARED MouseDATA$
|
|
|
|
DIM SHARED Vegas
|
|
DIM SHARED Money
|
|
OPEN "sol3opts.dat" FOR INPUT AS #1
|
|
INPUT #1, Vegas, Money
|
|
CLOSE #1
|
|
|
|
DEF SEG = VARSEG(Suits(1))
|
|
BLOAD "sol3suit.bsv", VARPTR(Suits(1))
|
|
DEF SEG = VARSEG(Buttons(0))
|
|
BLOAD "sol3btns.bsv", VARPTR(Buttons(0))
|
|
DEF SEG = VARSEG(Title(1))
|
|
BLOAD "sol3titl.bsv", VARPTR(Title(1))
|
|
DEF SEG = VARSEG(CardBACK(1))
|
|
BLOAD "sol3cd53.bsv", VARPTR(CardBACK(1))
|
|
DEF SEG = VARSEG(BackERASE(1))
|
|
BLOAD "sol3cd54.bsv", VARPTR(BackERASE(1))
|
|
DEF SEG = VARSEG(Selected(1))
|
|
BLOAD "sol3sele.bsv", VARPTR(Selected(1))
|
|
DEF SEG = VARSEG(TopOFF(1))
|
|
BLOAD "sol3topp.bsv", VARPTR(TopOFF(1))
|
|
DEF SEG = VARSEG(Chek(0))
|
|
BLOAD "sol3chek.bsv", VARPTR(Chek(0))
|
|
DEF SEG = VARSEG(Numbers(0))
|
|
BLOAD "sol3nums.bsv", VARPTR(Numbers(0))
|
|
DEF SEG = VARSEG(MenuGFX(0))
|
|
BLOAD "sol3men1.bsv", VARPTR(MenuGFX(0))
|
|
DEF SEG
|
|
|
|
'Create and load MouseDATA$ for CALL ABSOLUTE routines
|
|
DATA 55,89,E5,8B,5E,0C,8B,07,50,8B,5E,0A,8B,07,50,8B,5E,08,8B
|
|
DATA 0F,8B,5E,06,8B,17,5B,58,1E,07,CD,33,53,8B,5E,0C,89,07,58
|
|
DATA 8B,5E,0A,89,07,8B,5E,08,89,0F,8B,5E,06,89,17,5D,CA,08,00
|
|
MouseDATA$ = SPACE$(57)
|
|
FOR i = 1 TO 57
|
|
READ h$
|
|
Hexxer$ = CHR$(VAL("&H" + h$))
|
|
MID$(MouseDATA$, i, 1) = Hexxer$
|
|
NEXT i
|
|
Moused = InitMOUSE
|
|
IF NOT Moused THEN
|
|
PRINT "Sorry, cat must have got the mouse."
|
|
SLEEP 2
|
|
SYSTEM
|
|
END IF
|
|
|
|
SCREEN 12
|
|
|
|
GOSUB SetPALETTE
|
|
DrawSCREEN 1
|
|
InitVALS
|
|
RANDOMIZE TIMER
|
|
Sol3DEAL
|
|
ShowMOUSE
|
|
|
|
DO
|
|
Beginning:
|
|
MouseSTATUS LB, RB, MouseX, MouseY
|
|
IF Menu > 2 THEN Sol3MENU 1: GOTO Beginning
|
|
SELECT CASE MouseY
|
|
CASE IS < 18
|
|
IF MouseX > 621 AND LB THEN CheckOUT
|
|
IF Menu THEN Sol3MENU 0
|
|
CASE 20 TO 35
|
|
SELECT CASE MouseX
|
|
CASE IS < 103
|
|
Sol3MENU 1
|
|
CASE ELSE
|
|
IF Menu THEN Sol3MENU 0
|
|
END SELECT
|
|
CASE IS > 38
|
|
IF Menu THEN Sol3MENU 0
|
|
PlayGAME
|
|
Finito
|
|
END SELECT
|
|
PauseMOUSE LB, RB, MouseX, MouseY
|
|
LOOP
|
|
|
|
SYSTEM
|
|
|
|
SetPALETTE:
|
|
DATA 0, 0, 0, 16, 16, 32, 21, 63, 21, 63, 63, 0
|
|
DATA 63, 0, 0, 28, 28, 28, 0, 34, 0, 63, 50, 10
|
|
DATA 0, 30, 55, 45, 50, 63, 0, 63, 63, 0, 42, 0
|
|
DATA 63, 45, 55, 63, 30, 40, 48, 48, 48, 63, 63, 63
|
|
RESTORE SetPALETTE
|
|
OUT &H3C8, 0
|
|
FOR n = 1 TO 48
|
|
READ Intensity
|
|
OUT &H3C9, Intensity
|
|
NEXT n
|
|
RETURN
|
|
|
|
SUB CheckOUT
|
|
|
|
HideMOUSE
|
|
PUT (622, 2), Buttons(400), PSET
|
|
ShowMOUSE
|
|
|
|
Interval .1
|
|
|
|
HideMOUSE
|
|
PUT (588, 2), Buttons, PSET
|
|
ShowMOUSE
|
|
|
|
Interval .1
|
|
|
|
SYSTEM
|
|
|
|
END SUB
|
|
|
|
SUB CheckTOTAL
|
|
SHARED Deck1, Deck2, Deck3, Deck4
|
|
|
|
IF Vegas = 0 THEN
|
|
IF Deck1 = 0 THEN
|
|
IF Deck2 = 0 THEN
|
|
IF Deck3 = 0 THEN
|
|
HideMOUSE
|
|
IF Deck4 > 0 THEN
|
|
Deck1 = Deck4
|
|
PUT (5, 43), CardBACK, PSET
|
|
END IF
|
|
IF Deck4 > 8 THEN
|
|
Deck1 = 8
|
|
Deck2 = Deck4 - 8
|
|
PUT (83, 43), CardBACK, PSET
|
|
END IF
|
|
IF Deck4 > 16 THEN
|
|
Deck1 = 8
|
|
Deck2 = 8
|
|
Deck3 = Deck4 - 16
|
|
PUT (161, 43), CardBACK, PSET
|
|
END IF
|
|
LINE (239, 43)-(313, 152), 11, BF
|
|
ShowMOUSE
|
|
FOR n = 1 TO Deck3
|
|
Decks(3, n).Value = TurnUPs(Deck4).Value
|
|
Decks(3, n).Suit = TurnUPs(Deck4).Suit
|
|
Deck4 = Deck4 - 1
|
|
NEXT n
|
|
FOR n = 1 TO Deck2
|
|
Decks(2, n).Value = TurnUPs(Deck4).Value
|
|
Decks(2, n).Suit = TurnUPs(Deck4).Suit
|
|
Deck4 = Deck4 - 1
|
|
NEXT n
|
|
FOR n = 1 TO Deck1
|
|
Decks(1, n).Value = TurnUPs(Deck4).Value
|
|
Decks(1, n).Suit = TurnUPs(Deck4).Suit
|
|
Deck4 = Deck4 - 1
|
|
NEXT n
|
|
Deck4 = 0
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB ClearMOUSE
|
|
SHARED LB
|
|
|
|
WHILE LB
|
|
MouseSTATUS LB, RB, MouseX, MouseY
|
|
WEND
|
|
|
|
END SUB
|
|
|
|
SUB DrawSCREEN (Mode)
|
|
|
|
HideMOUSE
|
|
IF Mode = 1 THEN
|
|
LINE (0, 0)-(639, 17), 1, BF
|
|
LINE (0, 18)-(639, 37), 14, BF
|
|
LINE (0, 38)-(639, 38), 0
|
|
PUT (588, 2), Buttons, PSET
|
|
PUT (20, 0), Title, PSET
|
|
PUT (20, 24), MenuGFX, PSET
|
|
PUT (73, 24), MenuGFX(100), PSET
|
|
PUT (532, 24), MenuGFX(400), PSET
|
|
END IF
|
|
|
|
LINE (0, 39)-(639, 479), 11, BF
|
|
LINE (0, 155)-(639, 155), 2
|
|
LINE (318, 39)-(318, 155), 2
|
|
LINE (321, 39)-(321, 154), 6
|
|
LINE (319, 155)-(320, 155), 11
|
|
PSET (321, 155), 8
|
|
|
|
Index = 1
|
|
FOR x = 326 TO 568 STEP 78
|
|
LINE (x, 43)-(x + 74, 151), 2, B
|
|
LINE (x, 43)-(x + 74, 43), 6
|
|
LINE (x, 43)-(x, 151), 6
|
|
LINE (x + 18, 73)-(x + 56, 121), 2, B
|
|
LINE (x + 18, 73)-(x + 56, 73), 6
|
|
LINE (x + 18, 73)-(x + 18, 121), 6
|
|
PUT (x + 25, 85), Suits(Index), PSET
|
|
Index = Index + 200
|
|
NEXT x
|
|
|
|
IF Vegas THEN SetSCORE
|
|
ShowMOUSE
|
|
|
|
END SUB
|
|
|
|
SUB Finito
|
|
IF Completed THEN EXIT SUB
|
|
IF Stacks(1).Value = 13 THEN
|
|
IF Stacks(2).Value = 13 THEN
|
|
IF Stacks(3).Value = 13 THEN
|
|
IF Stacks(4).Value = 13 THEN
|
|
HideMOUSE
|
|
PLAY "MBMST120O1L16ceg>ceg>ceg>L32cg"
|
|
PLAY "MBMST120O4L32cgcgcgcg"
|
|
FOR Reps = 1 TO 400
|
|
x = FIX(RND * 560)
|
|
y = FIX(RND * 370)
|
|
CardNUM = FIX(RND * 52) + 1
|
|
PutCARD x, y, CardNUM
|
|
NEXT Reps
|
|
ShowMOUSE
|
|
DrawSCREEN 1
|
|
PLAY "MBO1L16CEGC"
|
|
x = 30
|
|
FOR CardNUM = 1 TO 52
|
|
PutCARD x, 185, CardNUM
|
|
x = x + 10
|
|
NEXT CardNUM
|
|
COLOR 3
|
|
LINE (180, 230)-(470, 265), 0, BF
|
|
LINE (185, 235)-(465, 260), 4, B
|
|
LOCATE 16, 27: PRINT "C O N G R A T U L A T I O N S !"
|
|
Interval 2
|
|
DrawSCREEN 1
|
|
Completed = 1
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
SUB HideMOUSE
|
|
|
|
LB = 2
|
|
MouseDRIVER LB, 0, 0, 0
|
|
|
|
END SUB
|
|
|
|
FUNCTION InitMOUSE
|
|
|
|
LB = 0
|
|
MouseDRIVER LB, 0, 0, 0
|
|
InitMOUSE = LB
|
|
|
|
END FUNCTION
|
|
|
|
SUB InitVALS
|
|
SHARED Menu
|
|
|
|
FOR n = 1 TO 52
|
|
Deck(n) = n
|
|
NEXT n
|
|
|
|
FOR Col = 1 TO 7
|
|
FOR Row = 1 TO 18
|
|
MainPLAY(Col, Row).x = (Col - 1) * 88 + 18
|
|
MainPLAY(Col, Row).y = (Row - 1) * 18 + 158
|
|
NEXT Row
|
|
NEXT Col
|
|
|
|
FOR Col = 1 TO 7
|
|
MainPLAY(Col, 0).x = (Col - 1) * 88 + 18
|
|
MainPLAY(Col, 0).y = 140
|
|
NEXT Col
|
|
|
|
END SUB
|
|
|
|
DEFSNG A-Z
|
|
SUB Interval (Length!)
|
|
|
|
OldTimer# = TIMER
|
|
DO: LOOP UNTIL TIMER > OldTimer# + Length!
|
|
|
|
END SUB
|
|
|
|
DEFINT A-Z
|
|
SUB MouseDRIVER (LB, RB, mX, mY)
|
|
|
|
DEF SEG = VARSEG(MouseDATA$)
|
|
Mouse = SADD(MouseDATA$)
|
|
CALL ABSOLUTE(LB, RB, mX, mY, Mouse)
|
|
|
|
END SUB
|
|
|
|
SUB MouseSTATUS (LB, RB, MouseX, MouseY)
|
|
|
|
LB = 3
|
|
MouseDRIVER LB, RB, mX, mY
|
|
LB = ((RB AND 1) <> 0)
|
|
RB = ((RB AND 2) <> 0)
|
|
MouseX = mX
|
|
MouseY = mY
|
|
|
|
END SUB
|
|
|
|
SUB Navigate
|
|
END SUB
|
|
|
|
SUB PauseMOUSE (OldLB, OldRB, OldMX, OldMY)
|
|
SHARED Key$
|
|
|
|
DO
|
|
Key$ = UCASE$(INKEY$)
|
|
MouseSTATUS LB, RB, MouseX, MouseY
|
|
LOOP UNTIL LB <> OldLB OR RB <> OldRB OR MouseX <> OldMX OR MouseY <> OldMY OR Key$ <> ""
|
|
|
|
END SUB
|
|
|
|
SUB PlayGAME
|
|
SHARED LB, RB, MouseX, MouseY
|
|
SHARED Deck1, Deck2, Deck3, Deck4, CardSELECT
|
|
SHARED FCcol, FCrow, FCx, FCy, FCsuit, FCvalue, LastDECK
|
|
|
|
BackERASE(2) = 127: CardBACK(2) = 109: Selected(2) = 109
|
|
|
|
SELECT CASE MouseY
|
|
CASE 43 TO 151
|
|
SELECT CASE MouseX
|
|
CASE 7 TO 81 'first deck
|
|
IF LB THEN
|
|
IF CardSELECT THEN GOSUB ZeroTURNUPS
|
|
IF Deck1 > 0 THEN
|
|
CardNUM = (Decks(1, Deck1).Suit - 1) * 13 + Decks(1, Deck1).Value
|
|
HideMOUSE
|
|
PutCARD 239, 43, CardNUM
|
|
ShowMOUSE
|
|
Deck4 = Deck4 + 1
|
|
TurnUPs(Deck4).Suit = Decks(1, Deck1).Suit
|
|
TurnUPs(Deck4).Value = Decks(1, Deck1).Value
|
|
Decks(1, Deck1).Suit = 0
|
|
Decks(1, Deck1).Value = 0
|
|
Deck1 = Deck1 - 1
|
|
LastDECK = 1
|
|
IF Deck1 = 0 THEN
|
|
HideMOUSE
|
|
LINE (5, 43)-(79, 152), 11, BF
|
|
IF Vegas = 0 THEN
|
|
LINE (24, 73)-(62, 121), 2, B
|
|
LINE (26, 75)-(60, 119), 2, BF
|
|
END IF
|
|
ShowMOUSE
|
|
END IF
|
|
ELSE
|
|
CheckTOTAL
|
|
END IF
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 85 TO 159 'second deck
|
|
IF LB THEN
|
|
IF CardSELECT THEN GOSUB ZeroTURNUPS
|
|
IF Deck2 > 0 THEN
|
|
CardNUM = (Decks(2, Deck2).Suit - 1) * 13 + Decks(2, Deck2).Value
|
|
HideMOUSE
|
|
PutCARD 239, 43, CardNUM
|
|
ShowMOUSE
|
|
Deck4 = Deck4 + 1
|
|
TurnUPs(Deck4).Suit = Decks(2, Deck2).Suit
|
|
TurnUPs(Deck4).Value = Decks(2, Deck2).Value
|
|
Decks(2, Deck2).Suit = 0
|
|
Decks(2, Deck2).Value = 0
|
|
Deck2 = Deck2 - 1
|
|
LastDECK = 2
|
|
IF Deck2 = 0 THEN
|
|
HideMOUSE
|
|
LINE (83, 43)-(157, 152), 11, BF
|
|
IF Vegas = 0 THEN
|
|
LINE (102, 73)-(140, 121), 2, B
|
|
LINE (104, 75)-(138, 119), 2, BF
|
|
END IF
|
|
ShowMOUSE
|
|
END IF
|
|
ELSE
|
|
CheckTOTAL
|
|
END IF
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 163 TO 237 'third deck
|
|
IF LB THEN
|
|
IF CardSELECT THEN GOSUB ZeroTURNUPS
|
|
IF Deck3 > 0 THEN
|
|
CardNUM = (Decks(3, Deck3).Suit - 1) * 13 + Decks(3, Deck3).Value
|
|
HideMOUSE
|
|
PutCARD 239, 43, CardNUM
|
|
ShowMOUSE
|
|
Deck4 = Deck4 + 1
|
|
TurnUPs(Deck4).Suit = Decks(3, Deck3).Suit
|
|
TurnUPs(Deck4).Value = Decks(3, Deck3).Value
|
|
Decks(3, Deck3).Suit = 0
|
|
Decks(3, Deck3).Value = 0
|
|
Deck3 = Deck3 - 1
|
|
LastDECK = 3
|
|
IF Deck3 = 0 THEN
|
|
HideMOUSE
|
|
LINE (161, 43)-(235, 152), 11, BF
|
|
IF Vegas = 0 THEN
|
|
LINE (180, 73)-(218, 121), 2, B
|
|
LINE (182, 75)-(216, 119), 2, BF
|
|
END IF
|
|
ShowMOUSE
|
|
END IF
|
|
ELSE
|
|
CheckTOTAL
|
|
END IF
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 241 TO 319 'turn-up deck
|
|
IF Deck4 > 0 THEN
|
|
IF LB THEN
|
|
IF CardSELECT = 0 THEN
|
|
TSuit = TurnUPs(Deck4).Suit
|
|
TValue = TurnUPs(Deck4).Value
|
|
CardNUM = (TSuit - 1) * 13 + TValue
|
|
IF (CardNUM = MoneyCARD) AND Money THEN
|
|
HideMOUSE
|
|
PutCARD 239, 43, CardNUM
|
|
PLAY "MBT140O6L64GP32GP32GP32GP32GP32GP32GP32G"
|
|
Score = Score + 52 + Tally: SetSCORE
|
|
Tally = Tally + 5
|
|
MoneyCARD = 0
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
EXIT SUB
|
|
END IF
|
|
HideMOUSE
|
|
PUT (239, 43), Selected
|
|
ShowMOUSE
|
|
CardSELECT = 2
|
|
ELSE
|
|
HideMOUSE
|
|
IF CardSELECT = 2 THEN
|
|
TSuit = TurnUPs(Deck4).Suit
|
|
TValue = TurnUPs(Deck4).Value
|
|
CardNUM = (TSuit - 1) * 13 + TValue
|
|
IF (CardNUM = MoneyCARD) AND Money THEN
|
|
PutCARD 239, 43, CardNUM
|
|
PLAY "MBT140O6L64GP32GP32GP32GP32GP32GP32GP32G"
|
|
MoneyCARD = 0
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
EXIT SUB
|
|
END IF
|
|
IF Stacks(TSuit).Value = TValue - 1 THEN
|
|
IF TurnUPs(Deck4 - 1).Value <> 0 THEN
|
|
CardNUM = (TurnUPs(Deck4 - 1).Suit - 1) * 13 + TurnUPs(Deck4 - 1).Value
|
|
PutCARD 239, 43, CardNUM
|
|
ELSE
|
|
LINE (239, 43)-(313, 152), 11, BF
|
|
END IF
|
|
CardNUM = (TSuit - 1) * 13 + TValue
|
|
PutCARD ((TSuit - 1) * 78 + 325), 43, CardNUM
|
|
Score = Score + 5: Tally = Tally + 5
|
|
IF Vegas THEN SetSCORE
|
|
ShowMOUSE
|
|
Stacks(TSuit).Value = Stacks(TSuit).Value + 1
|
|
TurnUPs(Deck4).Suit = 0
|
|
TurnUPs(Deck4).Value = 0
|
|
Deck4 = Deck4 - 1
|
|
GOSUB ZeroVALS
|
|
ELSE
|
|
PUT (239, 43), Selected
|
|
GOSUB ZeroVALS
|
|
END IF
|
|
ELSE
|
|
PUT (FCx, FCy), Selected
|
|
GOSUB ZeroVALS
|
|
END IF
|
|
ShowMOUSE
|
|
END IF
|
|
ClearMOUSE
|
|
END IF
|
|
END IF
|
|
END SELECT
|
|
CASE IS > 159 'columns y
|
|
SELECT CASE MouseX
|
|
CASE 18 TO 92 'column 1
|
|
IF LB THEN
|
|
Column = 1
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 106 TO 180 'column 2
|
|
IF LB THEN
|
|
Column = 2
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 194 TO 268 'column 3
|
|
IF LB THEN
|
|
Column = 3
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 282 TO 356 'column 4
|
|
IF LB THEN
|
|
Column = 4
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 370 TO 444 'column 5
|
|
IF LB THEN
|
|
Column = 5
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 458 TO 532 'column 6
|
|
IF LB THEN
|
|
Column = 6
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
CASE 546 TO 620 'column 7
|
|
IF LB THEN
|
|
Column = 7
|
|
IF CardSELECT = 0 THEN
|
|
GOSUB SELECT1
|
|
ELSE
|
|
GOSUB SELECT2
|
|
END IF
|
|
END IF
|
|
END SELECT
|
|
END SELECT
|
|
ClearMOUSE
|
|
EXIT SUB
|
|
|
|
'*************************** FIRST SELECTION SUBROUTINE **********************
|
|
SELECT1:
|
|
LastDECK = 0
|
|
FCcol = Column
|
|
FOR FCrow = 18 TO 1 STEP -1
|
|
IF MainPLAY(FCcol, FCrow).Value <> 0 THEN
|
|
IF MainPLAY(FCcol, FCrow).UpDOWN = 0 THEN
|
|
cn = (MainPLAY(FCcol, FCrow).Suit - 1) * 13 + MainPLAY(FCcol, FCrow).Value
|
|
CardNUM = cn
|
|
FCx = MainPLAY(FCcol, FCrow).x
|
|
FCy = MainPLAY(FCcol, FCrow).y
|
|
HideMOUSE
|
|
PutCARD FCx, FCy, CardNUM
|
|
ShowMOUSE
|
|
MainPLAY(FCcol, FCrow).UpDOWN = 1
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
ELSE
|
|
FCsuit = MainPLAY(FCcol, FCrow).Suit
|
|
FCvalue = MainPLAY(FCcol, FCrow).Value
|
|
FCx = MainPLAY(FCcol, FCrow).x
|
|
FCy = MainPLAY(FCcol, FCrow).y
|
|
IF FCy + 108 < 479 THEN Selected(2) = 109 ELSE Selected(2) = 480 - FCy
|
|
HideMOUSE
|
|
PUT (FCx, FCy), Selected
|
|
ShowMOUSE
|
|
CardSELECT = 1
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
NEXT FCrow
|
|
RETURN
|
|
|
|
'************************* SECOND SELECTION SUBROUTINE ***********************
|
|
|
|
SELECT2:
|
|
LastDECK = 0
|
|
SCcol = Column
|
|
IF CardSELECT = 1 THEN
|
|
HideMOUSE
|
|
IF FCcol = SCcol OR FCvalue = 1 THEN
|
|
IF Stacks(FCsuit).Value = FCvalue - 1 THEN
|
|
GOSUB LiftCARD
|
|
CardNUM = (FCsuit - 1) * 13 + FCvalue
|
|
PutCARD ((FCsuit - 1) * 78 + 325), 43, CardNUM
|
|
Stacks(FCsuit).Value = Stacks(FCsuit).Value + 1
|
|
MainPLAY(FCcol, FCrow).Value = 0
|
|
MainPLAY(FCcol, FCrow).Suit = 0
|
|
GOSUB ZeroVALS
|
|
Score = Score + 5: Tally = Tally + 5
|
|
IF Vegas THEN SetSCORE
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
ELSE
|
|
IF FCy + 108 < 479 THEN Selected(2) = 109 ELSE Selected(2) = 480 - FCy
|
|
PUT (FCx, FCy), Selected
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
ELSE
|
|
FOR SCrow = 18 TO 1 STEP -1
|
|
IF MainPLAY(SCcol, SCrow).Value <> 0 THEN EXIT FOR
|
|
NEXT SCrow
|
|
|
|
IF SCrow = 0 THEN
|
|
IF FCvalue = 13 THEN
|
|
GOSUB LiftCARD
|
|
CardNUM = (MainPLAY(FCcol, FCrow).Suit - 1) * 13 + 13
|
|
PutCARD MainPLAY(SCcol, 1).x, MainPLAY(SCcol, 1).y, CardNUM
|
|
ShowMOUSE
|
|
MainPLAY(SCcol, 1).Suit = FCsuit
|
|
MainPLAY(SCcol, 1).Value = 13
|
|
MainPLAY(FCcol, FCrow).Suit = 0
|
|
MainPLAY(FCcol, FCrow).Value = 0
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
ELSE
|
|
FOR Reduce = FCrow TO 0 STEP -1
|
|
IF MainPLAY(FCcol, Reduce).UpDOWN = 1 THEN
|
|
IF MainPLAY(FCcol, Reduce).Value = 13 THEN
|
|
SCrow = 0
|
|
MatchCARD = Reduce
|
|
GOTO TrickHANDLER
|
|
END IF
|
|
END IF
|
|
NEXT Reduce
|
|
|
|
IF FCy + 108 > 479 THEN Selected(2) = 480 - FCx ELSE Selected(2) = 109
|
|
PUT (FCx, FCy), Selected
|
|
ShowMOUSE
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
|
|
|
|
FOR MatchCARD = FCrow TO 0 STEP -1
|
|
IF MainPLAY(FCcol, MatchCARD).UpDOWN = 1 THEN
|
|
FCsuit = MainPLAY(FCcol, MatchCARD).Suit
|
|
FCvalue = MainPLAY(FCcol, MatchCARD).Value
|
|
|
|
IF FCvalue + 1 = MainPLAY(SCcol, SCrow).Value OR FCrow = 0 THEN
|
|
IF MainPLAY(SCcol, SCrow).Suit MOD 2 <> FCsuit MOD 2 THEN
|
|
IF MatchCARD < FCrow THEN
|
|
ERASE Trick
|
|
TrickHANDLER:
|
|
FOR Row = FCrow - 1 TO MatchCARD - 1 STEP -1
|
|
Ex = MainPLAY(FCcol, Row).x
|
|
Ey = MainPLAY(FCcol, Row).y
|
|
IF MainPLAY(FCcol, Row).UpDOWN = 1 THEN
|
|
EraseNUM = (MainPLAY(FCcol, Row).Suit - 1) * 13 + MainPLAY(FCcol, Row).Value
|
|
PutCARD Ex, Ey, EraseNUM
|
|
LINE (Ex, Ey + 109)-(Ex + 74, Ey + 127), 11, BF
|
|
ELSE
|
|
IF MainPLAY(FCcol, Row).Value = 0 THEN
|
|
LINE ((FCcol - 1) * 88 + 18, 158)-((FCcol - 1) * 88 + 92, 284), 11, BF
|
|
ELSE
|
|
IF Ey + 109 > 479 THEN
|
|
BackERASE(2) = 480 - Ey
|
|
ELSE
|
|
BackERASE(2) = 127
|
|
END IF
|
|
IF POINT(Ex + 1, Ey - 1) = 15 THEN OnTOP = 1
|
|
PUT (Ex, Ey), BackERASE, PSET
|
|
IF OnTOP THEN PUT (Ex, Ey), TopOFF, PSET
|
|
END IF
|
|
END IF
|
|
Count = Count + 1
|
|
Trick(Count).Suit = MainPLAY(FCcol, Row + 1).Suit
|
|
Trick(Count).Value = MainPLAY(FCcol, Row + 1).Value
|
|
MainPLAY(FCcol, Row + 1).Suit = 0
|
|
MainPLAY(FCcol, Row + 1).Value = 0
|
|
NEXT Row
|
|
x = MainPLAY(SCcol, SCrow).x
|
|
y = MainPLAY(SCcol, SCrow).y
|
|
FOR Cards = FCrow - MatchCARD + 1 TO 1 STEP -1
|
|
CardNUM = (Trick(Cards).Suit - 1) * 13 + Trick(Cards).Value
|
|
Slot = Slot + 1
|
|
MainPLAY(SCcol, SCrow + Slot).Suit = Trick(Cards).Suit
|
|
MainPLAY(SCcol, SCrow + Slot).Value = Trick(Cards).Value
|
|
MainPLAY(SCcol, SCrow + Slot).UpDOWN = 1
|
|
y = y + 18
|
|
PutCARD x, y, CardNUM
|
|
NEXT Cards
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
GOSUB ZeroVALS
|
|
RETURN
|
|
ELSE
|
|
GOSUB LiftCARD
|
|
CardNUM = (FCsuit - 1) * 13 + FCvalue
|
|
|
|
NCx = MainPLAY(SCcol, SCrow).x
|
|
NCy = MainPLAY(SCcol, SCrow + 1).y
|
|
|
|
PutCARD NCx, NCy, CardNUM
|
|
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
|
|
MainPLAY(SCcol, SCrow + 1).Suit = FCsuit
|
|
MainPLAY(SCcol, SCrow + 1).Value = FCvalue
|
|
MainPLAY(SCcol, SCrow + 1).UpDOWN = 1
|
|
|
|
MainPLAY(FCcol, FCrow).Suit = 0
|
|
MainPLAY(FCcol, FCrow).Value = 0
|
|
GOSUB ZeroVALS
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
NEXT MatchCARD
|
|
IF FCy + 108 > 479 THEN Selected(2) = 480 - FCx ELSE Selected(2) = 109
|
|
PUT (FCx, FCy), Selected
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
|
|
ELSE 'CardSELECT = 2
|
|
|
|
FOR SCrow = 18 TO 1 STEP -1
|
|
IF MainPLAY(SCcol, SCrow).Value <> 0 THEN EXIT FOR
|
|
NEXT SCrow
|
|
|
|
IF SCrow = 0 THEN
|
|
HideMOUSE
|
|
IF TurnUPs(Deck4).Value = 13 THEN
|
|
IF Deck4 > 1 THEN
|
|
CardNUM = (TurnUPs(Deck4 - 1).Suit - 1) * 13 + TurnUPs(Deck4 - 1).Value
|
|
PutCARD 239, 43, CardNUM
|
|
ELSE
|
|
LINE (239, 43)-(313, 153), 11, BF
|
|
END IF
|
|
CardNUM = (TurnUPs(Deck4).Suit - 1) * 13 + 13
|
|
PutCARD MainPLAY(SCcol, 1).x, 158, CardNUM
|
|
ShowMOUSE
|
|
MainPLAY(SCcol, 1).Suit = TurnUPs(Deck4).Suit
|
|
MainPLAY(SCcol, 1).Value = TurnUPs(Deck4).Value
|
|
TurnUPs(Deck4).Suit = 0
|
|
TurnUPs(Deck4).Value = 0
|
|
Deck4 = Deck4 - 1
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
ShowMOUSE
|
|
END IF
|
|
|
|
HideMOUSE
|
|
IF TurnUPs(Deck4).Suit MOD 2 <> MainPLAY(SCcol, SCrow).Suit MOD 2 THEN
|
|
IF TurnUPs(Deck4).Value + 1 = MainPLAY(SCcol, SCrow).Value THEN
|
|
PUT (239, 43), Selected
|
|
TopcardNUM = (TurnUPs(Deck4).Suit - 1) * 13 + TurnUPs(Deck4).Value
|
|
SCsuit = TurnUPs(Deck4).Suit
|
|
SCvalue = TurnUPs(Deck4).Value
|
|
TurnUPs(Deck4).Suit = 0
|
|
TurnUPs(Deck4).Value = 0
|
|
IF Deck4 > 0 THEN
|
|
Deck4 = Deck4 - 1
|
|
IF Deck4 = 0 THEN
|
|
LINE (239, 43)-(313, 152), 11, BF
|
|
ELSE
|
|
CardNUM = (TurnUPs(Deck4).Suit - 1) * 13 + TurnUPs(Deck4).Value
|
|
PutCARD 239, 43, CardNUM
|
|
END IF
|
|
PutCARD MainPLAY(SCcol, SCrow).x, MainPLAY(SCcol, SCrow + 1).y, TopcardNUM
|
|
ShowMOUSE
|
|
MainPLAY(SCcol, SCrow + 1).Suit = SCsuit
|
|
MainPLAY(SCcol, SCrow + 1).Value = SCvalue
|
|
MainPLAY(SCcol, SCrow + 1).UpDOWN = 1
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
ELSE
|
|
LINE (239, 43)-(315, 152), 11, BF
|
|
ShowMOUSE
|
|
GOSUB ZeroVALS
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
ELSE
|
|
PUT (239, 43), Selected
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
ELSE
|
|
PUT (239, 43), Selected
|
|
GOSUB ZeroVALS
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
|
|
RETURN
|
|
|
|
ZeroVALS:
|
|
FCcol = 0: FCrow = 0: FCx = 0: FCy = 0: FCsuit = 0: FCvalue = 0: Column = 0: CardSELECT = 0
|
|
RETURN
|
|
|
|
LiftCARD:
|
|
IF FCrow = 1 THEN
|
|
LINE ((FCcol - 1) * 88 + 18, 158)-((FCcol - 1) * 88 + 92, 266), 11, BF
|
|
ELSE
|
|
IF MainPLAY(FCcol, FCrow - 1).UpDOWN = 1 THEN
|
|
CardNUM = (MainPLAY(FCcol, FCrow - 1).Suit - 1) * 13 + MainPLAY(FCcol, FCrow - 1).Value
|
|
PutCARD FCx, FCy - 18, CardNUM
|
|
LINE (FCx, FCy + 91)-(FCx + 74, FCy + 109), 11, BF
|
|
ELSE
|
|
IF FCy + 109 < 479 THEN BackERASE(2) = 127 ELSE BackERASE(2) = 479 - FCy
|
|
IF POINT(FCx + 1, FCy - 19) = 15 THEN OnTOP = 1
|
|
PUT (FCx, FCy - 18), BackERASE, PSET
|
|
IF OnTOP THEN PUT (FCx, FCy - 18), TopOFF, PSET
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
|
|
ZeroTURNUPS:
|
|
HideMOUSE
|
|
IF FCy + 108 > 479 THEN Selected(2) = 480 - FCx ELSE Selected(2) = 109
|
|
IF CardSELECT = 1 THEN PUT (FCx, FCy), Selected
|
|
ShowMOUSE
|
|
GOSUB ZeroVALS
|
|
RETURN
|
|
|
|
END SUB
|
|
|
|
SUB PutCARD (x, y, CardNUM)
|
|
SHARED HoldNUM, Dealt
|
|
|
|
IF Money THEN
|
|
IF HoldNUM = CardNUM THEN Dealt = 1
|
|
IF CardNUM = MoneyCARD AND Dealt = 0 THEN
|
|
HoldNUM = CardNUM
|
|
CardNUM = 55
|
|
END IF
|
|
END IF
|
|
|
|
FileNAME$ = "Sol3CD" + LTRIM$(RTRIM$(STR$(CardNUM))) + ".BSV"
|
|
DEF SEG = VARSEG(Card(1))
|
|
BLOAD FileNAME$, VARPTR(Card(1))
|
|
DEF SEG
|
|
IF POINT(x + 1, y - 1) = 15 THEN OnTOP = 1 'Check for underlying card...
|
|
IF y + 108 > 479 THEN Card(2) = 480 - y ELSE Card(2) = 109
|
|
PUT (x, y), Card, PSET
|
|
IF OnTOP THEN PUT (x, y), TopOFF, PSET 'Place B/W card top if required
|
|
|
|
END SUB
|
|
|
|
SUB SetSCORE
|
|
|
|
IF Score < 0 THEN
|
|
PrintSCORE& = Score - Score * 2
|
|
Minus = 1
|
|
ELSE
|
|
PrintSCORE& = Score
|
|
END IF
|
|
Scor$ = "$" + LTRIM$(RTRIM$(STR$(PrintSCORE&)))
|
|
LINE (564, 23)-(631, 34), 14, BF
|
|
x = 572
|
|
IF Minus THEN LINE (566, 29)-(571, 29), 4
|
|
FOR n = 1 TO LEN(Scor$)
|
|
Char$ = MID$(Scor$, n, 1)
|
|
IF Char$ = "$" THEN
|
|
Index = 500
|
|
ELSE
|
|
Index = VAL(Char$) * 50
|
|
END IF
|
|
IF Minus THEN Index = Index + 550
|
|
PUT (x, 23), Numbers(Index), PSET
|
|
x = x + 7
|
|
NEXT n
|
|
IF Minus THEN Index = 550: Colr = 4 ELSE Index = 0: Colr = 2
|
|
LINE (x + 1, 31)-(x + 2, 32), Colr, B
|
|
PUT (x + 5, 23), Numbers(Index), PSET
|
|
PUT (x + 12, 23), Numbers(Index), PSET
|
|
END SUB
|
|
|
|
SUB ShowMOUSE
|
|
LB = 1
|
|
MouseDRIVER LB, 0, 0, 0
|
|
END SUB
|
|
|
|
SUB Sol3DEAL
|
|
SHARED Deck1, Deck2, Deck3, Deck4
|
|
SHARED FCcol, FCrow, FCx, FCy, FCsuit, FCvalue, CardSELECT
|
|
SHARED HoldNUM, Dealt
|
|
|
|
DrawSCREEN 2
|
|
ERASE Stacks: Completed = 0
|
|
HoldNUM = 0: Dealt = 0
|
|
|
|
HideMOUSE
|
|
FOR x = 5 TO 161 STEP 78
|
|
PUT (x, 43), CardBACK, PSET
|
|
NEXT x
|
|
ShowMOUSE
|
|
|
|
FOR Col = 1 TO 7
|
|
FOR Row = 1 TO 18
|
|
MainPLAY(Col, Row).Suit = 0
|
|
MainPLAY(Col, Row).Value = 0
|
|
MainPLAY(Col, Row).UpDOWN = 0
|
|
NEXT Row
|
|
NEXT Col
|
|
|
|
'Shuffle cards
|
|
FOR n = 52 TO 2 STEP -1
|
|
Card = INT(RND * n) + 1
|
|
SWAP Deck(n), Deck(Card)
|
|
NEXT n
|
|
|
|
MoneyNUM = FIX(RND * 24) + 29
|
|
MoneyCARD = Deck(MoneyNUM)
|
|
|
|
FOR Row = 1 TO 7
|
|
FOR Col = Row TO 7
|
|
PasteBOARD = PasteBOARD + 1
|
|
DeckVALUE = Deck(PasteBOARD)
|
|
SELECT CASE DeckVALUE
|
|
CASE 1 TO 13
|
|
MainPLAY(Col, Row).Suit = 1
|
|
MainPLAY(Col, Row).Value = DeckVALUE
|
|
CASE 14 TO 26
|
|
MainPLAY(Col, Row).Suit = 2
|
|
MainPLAY(Col, Row).Value = DeckVALUE - 13
|
|
CASE 27 TO 39
|
|
MainPLAY(Col, Row).Suit = 3
|
|
MainPLAY(Col, Row).Value = DeckVALUE - 26
|
|
CASE 40 TO 52
|
|
MainPLAY(Col, Row).Suit = 4
|
|
MainPLAY(Col, Row).Value = DeckVALUE - 39
|
|
END SELECT
|
|
Value = Deck(PasteBOARD) MOD 13
|
|
IF Value = 0 THEN Value = 13
|
|
MainPLAY(Col, Row).Value = Value
|
|
x = MainPLAY(Col, Row).x
|
|
y = MainPLAY(Col, Row).y
|
|
HideMOUSE
|
|
IF Row = Col THEN
|
|
MainPLAY(Col, Row).UpDOWN = 1
|
|
PutCARD x, y, DeckVALUE
|
|
ELSE
|
|
MainPLAY(Row, Col).UpDOWN = 0
|
|
IF POINT(x + 1, y - 1) = 15 THEN OnTOP = 1 ELSE OnTOP = 0
|
|
PUT (x, y), CardBACK, PSET
|
|
IF OnTOP THEN PUT (x, y), TopOFF, PSET
|
|
END IF
|
|
ShowMOUSE
|
|
NEXT Col
|
|
NEXT Row
|
|
|
|
FOR Col = 1 TO 3
|
|
FOR Num = 1 TO 8
|
|
PasteBOARD = PasteBOARD + 1
|
|
DeckVALUE = Deck(PasteBOARD)
|
|
SELECT CASE DeckVALUE
|
|
CASE 1 TO 13
|
|
Decks(Col, Num).Suit = 1
|
|
Decks(Col, Num).Value = DeckVALUE
|
|
CASE 14 TO 26
|
|
Decks(Col, Num).Suit = 2
|
|
Decks(Col, Num).Value = DeckVALUE - 13
|
|
CASE 27 TO 39
|
|
Decks(Col, Num).Suit = 3
|
|
Decks(Col, Num).Value = DeckVALUE - 26
|
|
CASE 40 TO 52
|
|
Decks(Col, Num).Suit = 4
|
|
Decks(Col, Num).Value = DeckVALUE - 39
|
|
END SELECT
|
|
NEXT Num
|
|
NEXT Col
|
|
|
|
Deck1 = 8: Deck2 = 8: Deck3 = 8: Deck4 = 0: CardSELECT = 0
|
|
FCcol = 0: FCrow = 0: FCx = 0: FCy = 0: FCsuit = 0: FCvalue = 0
|
|
|
|
Score = Score - 52: Tally = -52
|
|
IF Vegas THEN SetSCORE ELSE Score = 0
|
|
|
|
END SUB
|
|
|
|
SUB Sol3HELP (Item)
|
|
SHARED LB
|
|
|
|
GET (194, 80)-(446, 203), GetBOX
|
|
SELECT CASE Item
|
|
CASE 1 'Introduction
|
|
FirstPAGE = 1: LastPAGE = 5
|
|
CASE 2 'Basic Solitaire
|
|
FirstPAGE = 6: LastPAGE = 11
|
|
CASE 3 'Game Options
|
|
FirstPAGE = 12: LastPAGE = 15
|
|
CASE 4 'About Solitaire 3
|
|
HideMOUSE
|
|
DEF SEG = VARSEG(OtherBOX(0))
|
|
BLOAD "sol3hp16.bsv", VARPTR(OtherBOX(0))
|
|
DEF SEG
|
|
PUT (194, 80), OtherBOX, PSET
|
|
ShowMOUSE
|
|
END SELECT
|
|
IF Item <> 4 THEN CurrentPAGE = FirstPAGE: GOSUB PutHELP
|
|
|
|
DO
|
|
MouseSTATUS LB, RB, MouseX, MouseY
|
|
IF MouseY > 85 AND MouseY < 100 THEN
|
|
SELECT CASE MouseX
|
|
CASE 389 TO 403 'Left arrow button
|
|
IF LB = -1 THEN
|
|
IF CurrentPAGE > FirstPAGE THEN
|
|
CurrentPAGE = CurrentPAGE - 1
|
|
GOSUB PutHELP
|
|
END IF
|
|
END IF
|
|
CASE 405 TO 419 'Right arrow button
|
|
IF LB = -1 THEN
|
|
IF CurrentPAGE < LastPAGE THEN
|
|
CurrentPAGE = CurrentPAGE + 1
|
|
GOSUB PutHELP
|
|
END IF
|
|
END IF
|
|
CASE 423 TO 437 'Close button
|
|
IF LB = -1 THEN
|
|
GOSUB CloseHELP
|
|
EXIT DO
|
|
END IF
|
|
END SELECT
|
|
END IF
|
|
ClearMOUSE
|
|
PauseMOUSE LB, RB, MouseX, MouseY
|
|
LOOP
|
|
|
|
EXIT SUB
|
|
|
|
CloseHELP:
|
|
HideMOUSE
|
|
GET (423, 86)-(437, 99), Buttons(500)
|
|
PUT (423, 86), Buttons(400), PSET
|
|
ShowMOUSE
|
|
Interval .1
|
|
HideMOUSE
|
|
PUT (423, 86), Buttons(500), PSET
|
|
PUT (194, 80), GetBOX, PSET
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
RETURN
|
|
|
|
DoARROWS:
|
|
HideMOUSE
|
|
IF CurrentPAGE > FirstPAGE THEN
|
|
PAINT (396, 92), 15, 14
|
|
ELSE
|
|
PAINT (396, 92), 1, 14
|
|
END IF
|
|
IF CurrentPAGE < LastPAGE THEN
|
|
PAINT (411, 92), 15, 14
|
|
ELSE
|
|
PAINT (411, 92), 1, 14
|
|
END IF
|
|
ShowMOUSE
|
|
RETURN
|
|
|
|
PutHELP:
|
|
DEF SEG = VARSEG(OtherBOX(0))
|
|
FileNAME$ = "Sol3HP" + LTRIM$(RTRIM$(STR$(CurrentPAGE))) + ".BSV"
|
|
BLOAD FileNAME$, VARPTR(OtherBOX(0))
|
|
DEF SEG
|
|
HideMOUSE
|
|
PUT (194, 80), OtherBOX, PSET
|
|
ShowMOUSE
|
|
GOSUB DoARROWS
|
|
RETURN
|
|
|
|
END SUB
|
|
|
|
SUB Sol3MENU (InOUT)
|
|
SHARED LB, RB, MouseX, MouseY, Menu, Deck1, Deck2, Deck3
|
|
STATIC MenuX, MenuXX, Ix, Iy, Item, Count
|
|
|
|
IF InOUT = 0 THEN GOSUB PutMENU: EXIT SUB
|
|
|
|
'**************************** MENU OPEN SECTION ****************************
|
|
|
|
SELECT CASE Menu
|
|
CASE 3 'Game menu open
|
|
IF MouseX < 10 OR MouseX > 110 THEN GOSUB CloseMENU: EXIT SUB
|
|
SELECT CASE MouseY
|
|
CASE IS < 20
|
|
GOSUB CloseMENU
|
|
CASE 20 TO 37
|
|
IF MouseX < 12 OR MouseX > 52 THEN GOSUB CloseMENU
|
|
CASE 42 TO 56
|
|
IF Item <> 1 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 16: Iy = 42
|
|
GOSUB GetITEM
|
|
Item = 1
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3DEAL
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 57 TO 71
|
|
IF Item <> 2 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 16: Iy = 57
|
|
GOSUB GetITEM
|
|
Item = 2
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3UNDO
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 72 TO 86
|
|
IF Item <> 3 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 16: Iy = 72
|
|
GOSUB GetITEM
|
|
Item = 3
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
DEF SEG = VARSEG(OtherBOX(0))
|
|
BLOAD "sol3hp17.bsv", VARPTR(OtherBOX(0))
|
|
DEF SEG
|
|
GET (194, 80)-(446, 203), GetBOX
|
|
PUT (194, 80), OtherBOX, PSET
|
|
IF Vegas = 1 THEN PUT (246, 137), Chek, PSET
|
|
IF Vegas = 0 THEN PUT (246, 155), Chek, PSET
|
|
IF Money = 1 THEN PUT (246, 173), Chek, PSET
|
|
|
|
DO
|
|
MouseSTATUS LB, RB, MouseX, MouseY
|
|
SELECT CASE MouseY
|
|
CASE 86 TO 99 'close options menu
|
|
IF (MouseX > 422 AND MouseX < 438) AND LB THEN
|
|
HideMOUSE
|
|
GET (423, 86)-(437, 99), Buttons(500)
|
|
PUT (423, 86), Buttons(400), PSET
|
|
ShowMOUSE
|
|
Interval .1
|
|
HideMOUSE
|
|
PUT (423, 86), Buttons(500), PSET
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
EXIT DO
|
|
END IF
|
|
CASE 136 TO 145 'select Vegas type scoring
|
|
IF (MouseX > 243 AND MouseX < 260) AND LB THEN
|
|
HideMOUSE
|
|
IF Vegas = 1 THEN
|
|
Vegas = 0: Score = 0
|
|
PUT (246, 155), Chek, PSET
|
|
LINE (245, 137)-(258, 144), 15, BF
|
|
LINE (563, 18)-(639, 37), 14, BF
|
|
IF Money THEN
|
|
LINE (245, 173)-(258, 180), 15, BF
|
|
Money = 0
|
|
END IF
|
|
ELSE
|
|
PUT (246, 137), Chek, PSET
|
|
LINE (245, 155)-(258, 162), 15, BF
|
|
Vegas = 1: Score = Tally
|
|
END IF
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
NewDEAL = 1
|
|
END IF
|
|
CASE 154 TO 163 'select no scoring (continuous play)
|
|
IF (MouseX > 243 AND MouseX < 260) AND LB THEN
|
|
HideMOUSE
|
|
IF Vegas = 1 THEN
|
|
LINE (563, 18)-(639, 37), 14, BF
|
|
LINE (246, 137)-(258, 144), 15, BF
|
|
Vegas = 0: Score = 0
|
|
PUT (246, 155), Chek, PSET
|
|
IF Money = 1 THEN
|
|
LINE (246, 173)-(258, 180), 15, BF
|
|
Money = 0
|
|
END IF
|
|
ELSE
|
|
PUT (246, 137), Chek, PSET
|
|
LINE (245, 155)-(258, 162), 15, BF
|
|
Vegas = 1: Score = Tally
|
|
END IF
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
NewDEAL = 1
|
|
END IF
|
|
CASE 172 TO 181 'money card
|
|
IF (MouseX > 243 AND MouseX < 260) AND LB THEN
|
|
HideMOUSE
|
|
IF Money = 1 THEN
|
|
LINE (245, 173)-(258, 180), 15, BF
|
|
Money = 0
|
|
ELSE
|
|
PUT (246, 173), Chek, PSET
|
|
Money = 1
|
|
IF Vegas = 0 THEN
|
|
PUT (246, 137), Chek, PSET
|
|
LINE (245, 155)-(258, 162), 15, BF
|
|
Vegas = 1: Score = Tally
|
|
END IF
|
|
END IF
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
NewDEAL = 1
|
|
END IF
|
|
END SELECT
|
|
PauseMOUSE LB, RB, MouseX, MouseY
|
|
LOOP
|
|
OPEN "sol3opts.dat" FOR OUTPUT AS #1
|
|
WRITE #1, Vegas, Money
|
|
CLOSE #1
|
|
HideMOUSE
|
|
PUT (194, 80), GetBOX, PSET
|
|
ShowMOUSE
|
|
IF NewDEAL THEN
|
|
Score = 0
|
|
HideMOUSE
|
|
Sol3DEAL
|
|
IF Vegas THEN SetSCORE
|
|
ShowMOUSE
|
|
ClearMOUSE
|
|
EXIT SUB
|
|
END IF
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 92 TO 106
|
|
IF Item <> 4 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 16: Iy = 92
|
|
GOSUB GetITEM
|
|
Item = 4
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
SYSTEM
|
|
END IF
|
|
CASE IS > 106
|
|
GOSUB CloseMENU
|
|
CASE ELSE
|
|
END SELECT
|
|
EXIT SUB
|
|
CASE 4 'Help menu open
|
|
IF MouseX < 63 OR MouseX > 163 THEN GOSUB CloseMENU: EXIT SUB
|
|
SELECT CASE MouseY
|
|
CASE IS < 20
|
|
GOSUB CloseMENU
|
|
CASE 20 TO 37
|
|
IF MouseX < 63 OR MouseX > 103 THEN GOSUB CloseMENU
|
|
CASE 42 TO 56
|
|
IF Item <> 1 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 66: Iy = 42
|
|
GOSUB GetITEM
|
|
Item = 1
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3HELP 1
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 57 TO 71
|
|
IF Item <> 2 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 66: Iy = 57
|
|
GOSUB GetITEM
|
|
Item = 2
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3HELP 2
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 72 TO 86
|
|
IF Item <> 3 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 66: Iy = 72
|
|
GOSUB GetITEM
|
|
Item = 3
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3HELP 3
|
|
ClearMOUSE
|
|
END IF
|
|
CASE 92 TO 106
|
|
IF Item <> 4 THEN
|
|
IF Item THEN GOSUB PutITEM
|
|
Ix = 66: Iy = 92
|
|
GOSUB GetITEM
|
|
Item = 4
|
|
END IF
|
|
IF LB THEN
|
|
GOSUB CloseMENU
|
|
Sol3HELP 4
|
|
ClearMOUSE
|
|
END IF
|
|
CASE IS > 106
|
|
GOSUB CloseMENU
|
|
CASE ELSE
|
|
END SELECT
|
|
EXIT SUB
|
|
END SELECT
|
|
|
|
'*************************** MENU CLOSED SECTION ****************************
|
|
|
|
SELECT CASE MouseX
|
|
CASE IS < 12
|
|
IF Menu THEN GOSUB PutMENU
|
|
CASE 12 TO 52
|
|
IF Menu <> 1 THEN '-------------------- Game selected
|
|
HideMOUSE
|
|
IF Menu THEN GOSUB PutMENU
|
|
MenuX = 12
|
|
GOSUB GetMENU
|
|
LINE (12, 20)-(52, 36), 15, B
|
|
LINE (12, 36)-(52, 36), 0
|
|
LINE (52, 20)-(52, 36), 0
|
|
PUT (20, 24), MenuGFX(200), PSET
|
|
ShowMOUSE
|
|
Menu = 1
|
|
END IF
|
|
IF Menu = 1 AND LB THEN '-------------- Game opens
|
|
HideMOUSE
|
|
LINE (12, 20)-(52, 36), 14, BF
|
|
LINE (12, 20)-(52, 36), 15, B
|
|
LINE (12, 20)-(12, 36), 0
|
|
LINE (12, 20)-(52, 20), 0
|
|
PUT (21, 24), MenuGFX, PSET
|
|
GET (12, 37)-(112, 110), GetBOX
|
|
MenuXX = 12
|
|
DEF SEG = VARSEG(OtherBOX(0))
|
|
BLOAD "sol3men2.bsv", VARPTR(OtherBOX(0))
|
|
DEF SEG
|
|
PUT (12, 37), OtherBOX, PSET
|
|
Menu = 3
|
|
ShowMOUSE
|
|
END IF
|
|
CASE 53 TO 62
|
|
IF Menu THEN GOSUB PutMENU
|
|
CASE 63 TO 103
|
|
IF Menu <> 2 THEN '------------------ Help selected
|
|
HideMOUSE
|
|
IF Menu THEN GOSUB PutMENU
|
|
MenuX = 63
|
|
GOSUB GetMENU
|
|
LINE (63, 20)-(103, 36), 15, B
|
|
LINE (63, 36)-(103, 36), 0
|
|
LINE (103, 20)-(103, 36), 0
|
|
PUT (73, 24), MenuGFX(300), PSET
|
|
ShowMOUSE
|
|
Menu = 2
|
|
END IF
|
|
IF Menu = 2 AND LB THEN '-------------- Help opens
|
|
HideMOUSE
|
|
LINE (63, 20)-(103, 36), 14, BF
|
|
LINE (63, 20)-(103, 36), 15, B
|
|
LINE (63, 20)-(63, 36), 0
|
|
LINE (63, 20)-(103, 20), 0
|
|
PUT (74, 24), MenuGFX(100), PSET
|
|
GET (63, 37)-(163, 110), GetBOX
|
|
DEF SEG = VARSEG(OtherBOX(0))
|
|
BLOAD "sol3men3.bsv", VARPTR(OtherBOX(0))
|
|
DEF SEG
|
|
PUT (63, 37), OtherBOX, PSET
|
|
MenuXX = 63: Menu = 4
|
|
ShowMOUSE
|
|
END IF
|
|
END SELECT
|
|
|
|
EXIT SUB
|
|
|
|
GetITEM:
|
|
HideMOUSE
|
|
GET (Ix, Iy)-(Ix + 92, Iy + 15), ItemBOX
|
|
PUT (Ix, Iy), ItemBOX, PRESET
|
|
ShowMOUSE
|
|
RETURN
|
|
|
|
PutITEM:
|
|
HideMOUSE
|
|
IF ItemBOX(1) THEN PUT (Ix, Iy), ItemBOX, PSET
|
|
ShowMOUSE
|
|
Item = 0
|
|
RETURN
|
|
|
|
GetMENU:
|
|
HideMOUSE
|
|
GET (MenuX, 20)-(MenuX + 40, 36), MenuBOX
|
|
ShowMOUSE
|
|
RETURN
|
|
|
|
PutMENU:
|
|
HideMOUSE
|
|
PUT (MenuX, 20), MenuBOX, PSET
|
|
ShowMOUSE
|
|
Menu = 0
|
|
RETURN
|
|
|
|
CloseMENU:
|
|
HideMOUSE
|
|
PUT (MenuXX, 37), GetBOX, PSET
|
|
PUT (MenuX, 20), MenuBOX, PSET
|
|
ShowMOUSE
|
|
Menu = 0: Item = 0
|
|
RETURN
|
|
'LINE (16, 42)-(108, 56), 4, B
|
|
'LINE (16, 57)-(108, 71), 4, B
|
|
'LINE (16, 72)-(108, 86), 4, B
|
|
'LINE (16, 92)-(108, 106), 4, B
|
|
|
|
END SUB
|
|
|
|
SUB Sol3UNDO
|
|
SHARED Deck1, Deck2, Deck3, Deck4, LastDECK
|
|
|
|
HideMOUSE
|
|
IF Deck4 > 0 THEN
|
|
IF LastDECK THEN
|
|
LastSUIT = TurnUPs(Deck4).Suit
|
|
LastVALUE = TurnUPs(Deck4).Value
|
|
SELECT CASE LastDECK
|
|
CASE 1
|
|
Deck1 = Deck1 + 1
|
|
Decks(1, Deck1).Suit = LastSUIT
|
|
Decks(1, Deck1).Value = LastVALUE
|
|
PUT (5, 43), CardBACK, PSET
|
|
CASE 2
|
|
Deck2 = Deck2 + 1
|
|
Decks(2, Deck2).Suit = LastSUIT
|
|
Decks(2, Deck2).Value = LastVALUE
|
|
PUT (83, 43), CardBACK, PSET
|
|
CASE 3
|
|
Deck3 = Deck3 + 1
|
|
Decks(3, Deck3).Suit = LastSUIT
|
|
Decks(3, Deck3).Value = LastVALUE
|
|
PUT (161, 43), CardBACK, PSET
|
|
END SELECT
|
|
Deck4 = Deck4 - 1
|
|
LastSUIT = TurnUPs(Deck4).Suit
|
|
LastVALUE = TurnUPs(Deck4).Value
|
|
IF Deck4 = 0 THEN
|
|
LINE (239, 43)-(313, 152), 11, BF
|
|
ELSE
|
|
CardNUM = (LastSUIT - 1) * 13 + LastVALUE
|
|
PutCARD 239, 43, CardNUM
|
|
END IF
|
|
END IF
|
|
END IF
|
|
LastDECK = 0
|
|
ShowMOUSE
|
|
|
|
END SUB
|