This is an updated version of my program which was featured at QB64.org. There are some differences in the images on the reels, but mostly the code has been changed to make it clearer for study if desired.
_MAPTRIANGLE(3D) (a favourite Magdha method) has been used to give a realistic impression of Fruit Machine rotating reels. The reels rotate realistically, but the randomness has been produced not by randomness of the rotations (which are fixed in order to keep sync with sounds) but by randomly positioning the fruit images around the reels at each spin. This is not realistic but gives a method to set the desired chances of winning.
The chances of winning are such that the player will always make money after a suitably long time. The chances of getting a winning line are about 1 in 5.
One-Armed Bandit.zip (Size: 9.26 MB / Downloads: 7)
Unzip the file and extract the folder into your PEQB64 directory. In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.
When in play, Press the Spacebar to start the reels turning. Esc at any time to Quit.
The second screenshot shows the opening of the game where we pay tribute to Our Grand Overseer, but he does not appear in actual gameplay.
The picture shows the winning line statistics.
The video shows a short excerpt of the running program giving a winning line.
Fruit Machine Guide.pdf (Size: 213.21 KB / Downloads: 19)
The User Guide gives further background but is not a necessity to run the game.
_MAPTRIANGLE(3D) (a favourite Magdha method) has been used to give a realistic impression of Fruit Machine rotating reels. The reels rotate realistically, but the randomness has been produced not by randomness of the rotations (which are fixed in order to keep sync with sounds) but by randomly positioning the fruit images around the reels at each spin. This is not realistic but gives a method to set the desired chances of winning.
The chances of winning are such that the player will always make money after a suitably long time. The chances of getting a winning line are about 1 in 5.
One-Armed Bandit.zip (Size: 9.26 MB / Downloads: 7)
Unzip the file and extract the folder into your PEQB64 directory. In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.
When in play, Press the Spacebar to start the reels turning. Esc at any time to Quit.
The second screenshot shows the opening of the game where we pay tribute to Our Grand Overseer, but he does not appear in actual gameplay.
The picture shows the winning line statistics.
The video shows a short excerpt of the running program giving a winning line.
Fruit Machine Guide.pdf (Size: 213.21 KB / Downloads: 19)
The User Guide gives further background but is not a necessity to run the game.
Code: (Select All)
' One-armed Bandit Simulation by Magdha 2025-12-10 ex Qwerkey
' Updated for PE
' Clipart from openclipart.org, nicepng.com
' Sounds from FreeSFX.co.uk
_TITLE "One-Armed Bandit PE Edition - Esc to Quit"
$EXEICON:'.\lemon.ico'
CONST False = 0, True = NOT False
CONST SlowSpin! = 0.002, Fruit% = 81, DoshStop% = 250, WinStop% = 750, Ark! = 2 * _PI / 23, Rad! = 23 * Fruit% / (2 * _PI)
CONST Zplane% = -400, BX% = 150, BY% = 240, XB1% = -132, XB2% = 140
DIM ReelPos!(2, 22), deltaTheta!(2), Reels%(2, 22), ReelStats%(2, 4), Pict&(6), WinLine%%(2)
DIM Spin%%(2, 2), SpinCount%(2, 1), NumImg&(9), Taper%%(3, 7), Segment%%(9, 6), Plum%(1, 5), Blinking%(2)
DIM StarsHoriz!(9, 1, 1), StarsVert!(5, 1, 1), Banner&(2)
RANDOMIZE (TIMER)
'IMAGES
'7-segment display
RESTORE SevenSegment
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
READ Taper%%(S%%, R%%)
NEXT R%%
NEXT S%%
FOR S%% = 0 TO 9
FOR R%% = 0 TO 6
READ Segment%%(S%%, R%%)
NEXT R%%
NEXT S%%
Horiz& = _NEWIMAGE(19, 7, 32)
_DEST Horiz&
COLOR _RGB32(3, 220, 3), _RGBA32(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
IF Taper%%(S%%, R%%) THEN
PSET (S%% - 1, R%% - 1), _RGB32(3, 220, 3)
PSET (19 - S%%, 7 - R%%), _RGB32(3, 220, 3)
END IF
NEXT R%%
NEXT S%%
LINE (3, 0)-(15, 6), , BF
Vert& = _NEWIMAGE(7, 19, 32)
_DEST Vert&
COLOR _RGB32(3, 220, 3), _RGBA32(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
FOR R%% = 1 TO 7
IF Taper%%(S%%, R%%) THEN
PSET (R%% - 1, S%% - 1), _RGB32(3, 220, 3)
PSET (7 - R%%, 19 - S%%), _RGB32(3, 220, 3)
END IF
NEXT R%%
NEXT S%%
LINE (0, 3)-(6, 15), , BF
FOR S%% = 0 TO 9
TempImg& = _NEWIMAGE(29, 51, 32)
_DEST TempImg&
IF Segment%%(S%%, 0) THEN _PUTIMAGE (5, 0), Horiz&
IF Segment%%(S%%, 1) THEN _PUTIMAGE (0, 5), Vert&
IF Segment%%(S%%, 2) THEN _PUTIMAGE (22, 5), Vert&
IF Segment%%(S%%, 3) THEN _PUTIMAGE (5, 22), Horiz&
IF Segment%%(S%%, 4) THEN _PUTIMAGE (0, 27), Vert&
IF Segment%%(S%%, 5) THEN _PUTIMAGE (22, 27), Vert&
IF Segment%%(S%%, 6) THEN _PUTIMAGE (5, 44), Horiz&
NumImg&(S%%) = HardwareImage&(TempImg&)
NEXT S%%
_FREEIMAGE Vert&
_FREEIMAGE Horiz&
'Fruit Images
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("cherries.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(0) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("lemony.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(1) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("strawberry.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(2) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("bell.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(3) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_FONT _LOADFONT("calibriz.ttf", 36, "bold")
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
_PRINTSTRING (10, 30), "BAR"
LINE (6, 24)-(74, 56), , B
Pict&(4) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("joker.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(5) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("Steve The Amazing.jpg", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(6) = HardwareImage&(TempImg&)
'Start Frame
TempImg& = _NEWIMAGE(370, 64, 32)
_DEST TempImg&
COLOR _RGBA32(0, 0, 255, 20), _RGBA32(200, 200, 200, 0)
_FONT _LOADFONT("calibriz.ttf", 80)
_PRINTSTRING (25, 5), "MAGDHA"
Greetings& = HardwareImage&(TempImg&)
'Banners (3D)
FOR S%% = 0 TO 2
TempImg& = _NEWIMAGE(BX%, BY%, 32)
_DEST TempImg&
COLOR _RGB32(38 + 20 * S%%, 121 + 20 * S%%, 139 + 20 * S%%), _RGBA32(200, 200, 200, 0)
_FONT _LOADFONT("arialbd.ttf", 74, "bold")
_PRINTSTRING (15, 50), "Q"
COLOR _RGB32(15 + S%% * 5, 30 + S%% * 10, 190 + S%% * 20)
_PRINTSTRING (75, 50), "B"
COLOR _RGB32(203 + S%% * 20, 135 + S%% * 20, 10 + S%% * 2)
_PRINTSTRING (28, 115), "6"
COLOR _RGB32(203 + S%% * 20, 74 + S%% * 10, 10 + S%% * 2)
_PRINTSTRING (76, 115), "4"
_FONT 16
_FONT _LOADFONT("arialbi.ttf", 74, "bold,italic")
COLOR _RGB32(240, 240, 70)
_PRINTSTRING (20, 180), "PE"
Banner&(S%%) = HardwareImage&(TempImg&)
NEXT S%%
'Stars
Star& = _LOADIMAGE("Star.png", 33)
DollarSign& = _LOADIMAGE("Dollar3.png", 33)
Payout& = _LOADIMAGE("Payout.png", 33)
'Background & Frames
PEBackground& = _LOADIMAGE("PEBackground.jpg", 32)
TempImg& = _NEWIMAGE(800, 600, 32)
_DEST TempImg&
_PUTIMAGE (0, 0)-(799, 161), PEBackground&, , (0, 0)-(799, 161)
_PUTIMAGE (0, 438)-(799, 599), PEBackground&, , (0, 438)-(799, 599)
_PUTIMAGE (0, 0)-(235, 599), PEBackground&, , (0, 0)-(235, 599)
_PUTIMAGE (564, 0)-(799, 599), PEBackground&, , (564, 0)-(799, 599)
_FREEIMAGE PEBackground&
'Reel masks
COLOR _RGBA32(80, 80, 80, 65)
LINE (236, 162)-(563, 250), , BF
LINE (236, 349)-(563, 437), , BF
'Frames & frame masks
COLOR _RGBA32(80, 80, 80, 120)
LINE (250, 14)-(529, 123), , BF
LINE (190, 476)-(606, 585), , BF
_PUTIMAGE (217, 145), _LOADIMAGE("Frame3.png", 32)
_PUTIMAGE (250, 14), _LOADIMAGE("Frame1.png", 32)
_PUTIMAGE (190, 476), _LOADIMAGE("Frame2.png", 32)
Bandit& = HardwareImage&(TempImg&)
'Reels background
TempImg& = _NEWIMAGE(400, 300, 32)
_DEST TempImg&
COLOR _RGB32(130, 130, 130)
LINE (0, 0)-(399, 399), , BF
Back& = HardwareImage&(TempImg&)
'Phoenix Logo
Phoenix& = _LOADIMAGE("Red Phoenix.png", 33)
'SOUNDS
Ambience& = _SNDOPEN("Ambience.ogg", "SYNC,VOL")
_SNDVOL Ambience&, 0.3
KerChing& = _SNDOPEN("KerChing.ogg", "SYNC,VOL")
_SNDVOL KerChing&, 1
SlotMachine& = _SNDOPEN("Slot Machine1.ogg", "SYNC,VOL")
_SNDVOL SlotMachine&, 1
'Set Data and Initial Values
'Set Blinking Rate for Winnings Display
RESTORE Blinks:
FOR S%% = 1 TO 2
READ Blinking%(S%%)
NEXT S%%
'Set Winnings Amounts
RESTORE Plums:
FOR S%% = 0 TO 1
FOR R%% = 0 TO 5
READ Plum%(S%%, R%%)
NEXT R%%
NEXT S%%
'Set Chances of Winning Lines
RESTORE ReelData
FOR S%% = 0 TO 2
FOR R%% = 0 TO 4
READ ReelStats%(S%%, R%%)
NEXT R%%
NEXT S%%
'Set Timings of Reel Spin
RESTORE SpinData:
FOR S%% = 0 TO 2
READ SpinCount%(S%%, 1)
NEXT S%%
'Set Rates of Reel Spin
RESTORE ThetaData:
FOR S%% = 0 TO 2
READ deltaTheta!(S%%)
NEXT S%%
'Set Reel Fruit Types - Fruits Are Never The Same as Neighbours at Start
FOR Reel%% = 0 TO 2
FOR Posn%% = 0 TO 22
ReelPos!(Reel%%, Posn%%) = (Posn%% * Ark!) - _PI + Ark! / 2
IF Posn%% = 11 THEN
'Steve The Amazing in payout line at start
Reels%(Reel%%, 11) = 6
ELSE
Same%% = True
WHILE Same%%
P! = 1000 * RND
IF P! >= ReelStats%(Reel%%, 4) THEN
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 4
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 4 OR Reels%(Reel%%, Posn%% - 1) = 4) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 4 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 4
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 3
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 3 OR Reels%(Reel%%, Posn%% - 1) = 3) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 3 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 3
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 2
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 2 OR Reels%(Reel%%, Posn%% - 1) = 2) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 2 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 2
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 1
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 1 OR Reels%(Reel%%, Posn%% - 1) = 1) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 1 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 1
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 0
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 9 OR Reels%(Reel%%, Posn%% - 1) = 0) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 0 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 0
Same%% = False
END IF
ELSE
IF Posn%% = 0 THEN
Reels%(Reel%%, Posn%%) = 5
Same%% = False
ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 5 OR Reels%(Reel%%, Posn%% - 1) = 5) THEN
'Same as previous
ELSEIF Reels%(Reel%%, Posn%% - 1) = 5 THEN
'Same as previous
ELSE
Reels%(Reel%%, Posn%%) = 5
Same%% = False
END IF
END IF
WEND
END IF
NEXT Posn%%
Spin%%(Reel%%, 0) = True
Spin%%(Reel%%, 1) = True
Spin%%(Reel%%, 2) = False
SpinCount%(Reel%%, 0) = 0
NEXT Reel%%
'Stars Display
FOR S%% = 0 TO 9
FOR R%% = 0 TO 1
IF RND > 0.5 THEN
StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
ELSE
StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
END IF
NEXT R%%
NEXT S%%
FOR S%% = 0 TO 5
FOR R%% = 0 TO 1
IF RND > 0.5 THEN
StarsVert!(S%%, R%%, 1) = (RND + 0.5) * 0.011
ELSE
StarsVert!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
END IF
NEXT R%%
NEXT S%%
'Set Initial Values & Load Files
Twinkle%% = True 'Set this to False if twirling stars not required
DoSounds%% = True 'Set this to False if Sounds Not Required
RandomReels%% = True 'Set this to False to ensure Fruits Are Never the Same as Neighbouring
X0% = -Fruit% \ 2
X1% = X0% + Fruit% - 1
X2% = X0% - (Fruit% + 5)
X3% = X1% - (Fruit% + 5)
Spin%%(2, 2) = True
SettleUp%% = False
Cash& = 500
Winnings% = 0
WinCount% = 0
Blink%% = False
WinBan%% = False
WinDisp%% = False
AmbCount& = 0
DispMagdha%% = True
Casino%% = True
IF DoSounds%% THEN _SNDPLAY Ambience&
SCREEN _NEWIMAGE(1000, 800, 32)
_SCREENMOVE 30, 10
_DEST 0
_DISPLAYORDER _HARDWARE 'Hardware images only
WHILE Casino%%
_LIMIT 250
'Reel Images
_PUTIMAGE (300, 250), Back&
FOR Reel%% = 0 TO 2
FOR Posn%% = 0 TO 22
IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
FOR Q%% = 0 TO 3
Theta0! = ReelPos!(Reel%%, Posn%%) + (-(Fruit% / 2) + Q%% * Fruit% / 4) / Rad!
Theta1! = ReelPos!(Reel%%, Posn%%) + (-(Fruit% / 2) + (Q%% + 1) * Fruit% / 4) / Rad!
Zed0! = Rad! * COS(Theta0!) - 2.5 * Rad!
Zed1! = Rad! * COS(Theta1!) - 2.5 * Rad!
Y0% = SIN(Theta0!) * Rad!
Y1% = SIN(Theta1!) * Rad!
X1% = Fruit% - 1
Y2% = CINT(Fruit% - 1 - (Q%% * Fruit% / 4))
Y3% = CINT(Fruit% - 1 - ((Q%% + 1) * Fruit% / 4))
X4% = X2% + Reel%% * (Fruit% + 5)
X5% = X3% + Reel%% * (Fruit% + 5)
_MAPTRIANGLE (0, Y2%)-(X1%, Y2%)-(0, Y3%), Pict&(Reels%(Reel%%, Posn%%)) TO(X4%, Y0%, Zed0!)-(X5%, Y0%, Zed0!)-(X4%, Y1%, Zed1!), , _SMOOTH
_MAPTRIANGLE (X1%, Y3%)-(0, Y3%)-(X1%, Y2%), Pict&(Reels%(Reel%%, Posn%%)) TO(X5%, Y1%, Zed1!)-(X4%, Y1%, Zed1!)-(X5%, Y0%, Zed0!), , _SMOOTH
NEXT Q%%
END IF
NEXT Posn%%
NEXT Reel%%
'Background, logo, banners & cash images
_PUTIMAGE (100, 100), Bandit&
_PUTIMAGE (140, 130)-(290, 280), Phoenix&
_PUTIMAGE (720, 130)-(870, 280), Phoenix&
_PUTIMAGE (390, 136), DollarSign&
C$ = LTRIM$(STR$(Cash&))
FOR S%% = 1 TO LEN(C$)
R%% = VAL(MID$(C$, S%%, 1))
_PUTIMAGE (410 + (38 * S%%), 143), NumImg&(R%%)
NEXT S%%
FOR S%% = 0 TO 2
Z1% = Zplane% + 4 * (S%% - 1)
_MAPTRIANGLE (0, 0)-(149, 0)-(0, 249), Banner&(S%%) TO(XB1% - BX%, BY% / 2, Z1%)-(XB1%, BY% / 2, Z1%)-(XB1% - BX%, -BY% / 2, Z1%)
_MAPTRIANGLE (149, 249)-(0, 249)-(149, 0), Banner&(S%%) TO(XB1%, -BY% / 2, Z1%)-(XB1% - BX%, -BY% / 2, Z1%)-(XB1%, BY% / 2, Z1%)
_MAPTRIANGLE (0, 0)-(149, 0)-(0, 249), Banner&(S%%) TO(XB2%, BY% / 2, Z1%)-(XB2% + BX%, BY% / 2, Z1%)-(XB2%, -BY% / 2, Z1%)
_MAPTRIANGLE (149, 249)-(0, 249)-(149, 0), Banner&(S%%) TO(XB2% + BX%, -BY% / 2, Z1%)-(XB2%, -BY% / 2, Z1%)-(XB2% + BX%, BY% / 2, Z1%)
NEXT S%%
IF DispMagdha%% THEN
_PUTIMAGE (315, 600), Greetings&
ELSEIF Blink%% AND (WinDisp%% OR WinBan%%) THEN
_PUTIMAGE (315, 600), Payout&
C$ = LTRIM$(STR$(Swag%))
FOR S%% = 1 TO LEN(C$)
R%% = VAL(MID$(C$, S%%, 1))
_PUTIMAGE (540 + (38 * S%%), 605), NumImg&(R%%)
NEXT S%%
END IF
'Star Images
IF Twinkle%% THEN
FOR S%% = 0 TO 9
FOR R%% = 0 TO 1
StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) + StarsHoriz!(S%%, R%%, 1)
IF StarsHoriz!(S%%, R%%, 0) > _PI THEN
StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) - 2 * _PI
ELSEIF StarsHoriz!(S%%, R%%, 0) < -_PI THEN
StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) + 2 * _PI
END IF
StarZ1% = CINT((15 * SIN(StarsHoriz!(S%%, R%%, 0))) + Zplane%)
StarZ2% = CINT((-15 * SIN(StarsHoriz!(S%%, R%%, 0))) + Zplane%)
StarX1% = CINT((15 * COS(StarsHoriz!(S%%, R%%, 0)))) - 320 + S%% * 71
StarX2% = CINT((-15 * COS(StarsHoriz!(S%%, R%%, 0)))) - 320 + S%% * 71
StarY1% = 15 + 250 - R%% * 500
StarY2% = -15 + 250 - R%% * 500
_MAPTRIANGLE (29, 0)-(0, 0)-(29, 29), Star& TO(StarX1%, StarY1%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)-(StarX1%, StarY2%, StarZ1%), , _SMOOTH
_MAPTRIANGLE (0, 29)-(29, 29)-(0, 0), Star& TO(StarX2%, StarY2%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)-(StarX2%, StarY1%, StarZ2%), , _SMOOTH
IF RND > 0.9995 THEN
IF RND > 0.5 THEN
StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
ELSE
StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
END IF
END IF
NEXT R%%
NEXT S%%
FOR S%% = 0 TO 5
FOR R%% = 0 TO 1
StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) + StarsVert!(S%%, R%%, 1)
IF StarsVert!(S%%, R%%, 0) > _PI THEN
StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) - 2 * _PI
ELSEIF StarsVert!(S%%, R%%, 0) < -_PI THEN
StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) + 2 * _PI
END IF
StarZ1% = CINT((15 * SIN(StarsVert!(S%%, R%%, 0))) + Zplane%)
StarZ2% = CINT((-15 * SIN(StarsVert!(S%%, R%%, 0))) + Zplane%)
StarX1% = CINT((15 * COS(StarsVert!(S%%, R%%, 0)))) - 320 + R%% * 640
StarX2% = CINT((-15 * COS(StarsVert!(S%%, R%%, 0)))) - 320 + R%% * 640
StarY1% = 15 + 180 - S%% * 71
StarY2% = -15 + 180 - S%% * 71
_MAPTRIANGLE (29, 0)-(0, 0)-(29, 29), Star& TO(StarX1%, StarY1%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)
_MAPTRIANGLE (0, 29)-(29, 29)-(0, 0), Star& TO(StarX2%, StarY2%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)
IF RND > 0.9995 THEN
IF RND > 0.5 THEN
StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
ELSE
StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
END IF
END IF
NEXT R%%
NEXT S%%
END IF
_DISPLAY
'Reel Spin
IF NOT Spin%%(2, 2) THEN
FOR Reel%% = 0 TO 2
IF Spin%%(Reel%%, 0) THEN
SpinCount%(Reel%%, 0) = SpinCount%(Reel%%, 0) + 1
IF SpinCount%(Reel%%, 0) = SpinCount%(Reel%%, 1) THEN Spin%%(Reel%%, 0) = False
ELSEIF NOT Spin%%(Reel%%, 2) THEN
AngleRem!(Reel%%) = AngleRem!(Reel%%) - SlowSpin!
IF AngleRem!(Reel%%) <= 0 THEN
Spin%%(Reel%%, 2) = True
IF Reel%% = 2 THEN SettleUp%% = True
END IF
END IF
FOR Posn%% = 0 TO 22
IF Spin%%(Reel%%, 0) THEN
ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) - deltaTheta!(Reel%%)
ELSEIF NOT Spin%%(Reel%%, 2) THEN
ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) - SlowSpin!
END IF
IF ReelPos!(Reel%%, Posn%%) < -_PI THEN ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) + 2 * _PI
IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
IF NOT Spin%%(Reel%%, 0) AND Spin%%(Reel%%, 1) AND ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) >= 2 * _PI / 23 THEN
AngleRem!(Reel%%) = ReelPos!(Reel%%, Posn%%)
WinLine%%(Reel%%) = Reels%(Reel%%, Posn%%)
Spin%%(Reel%%, 1) = False
END IF
END IF
NEXT Posn%%
NEXT Reel%%
END IF
'Check for Winning Lines
IF SettleUp%% THEN
SettleUp%% = False
HaveWon%% = False
IF (WinLine%%(2) = 0 OR WinLine%%(2) = 4) AND WinLine%%(1) = 0 AND WinLine%%(0) = 0 THEN
Plumpet%% = 1
HaveWon%% = True
ELSEIF (WinLine%%(2) = 1 OR WinLine%%(2) = 4) AND WinLine%%(1) = 1 AND WinLine%%(0) = 1 THEN
Plumpet%% = 2
HaveWon%% = True
ELSEIF (WinLine%%(2) = 2 OR WinLine%%(2) = 4) AND WinLine%%(1) = 2 AND WinLine%%(0) = 2 THEN
Plumpet%% = 3
HaveWon%% = True
ELSEIF (WinLine%%(2) = 3 OR WinLine%%(2) = 4) AND WinLine%%(1) = 3 AND WinLine%%(0) = 3 THEN
Plumpet%% = 4
HaveWon%% = True
ELSEIF WinLine%%(2) = 0 AND WinLine%%(1) = 0 THEN
Plumpet%% = 0
HaveWon%% = True
ELSEIF WinLine%%(2) = 4 AND WinLine%%(1) = 4 AND WinLine%%(0) = 4 THEN
Plumpet%% = 5
HaveWon%% = True
END IF
IF HaveWon%% THEN
Winnings% = Plum%(0, Plumpet%%)
Swag% = Winnings%
Blink%% = True
MoreDosh%% = True
Dosh%% = 1
WinBan%% = True
END IF
FOR Reel%% = 0 TO 2
FOR Posn%% = 0 TO 22
Cardinal% = CINT(ReelPos!(Reel%%, Posn%%) / Ark!)
ReelPos!(Reel%%, Posn%%) = Cardinal% * Ark!
NEXT Posn%%
NEXT Reel%%
END IF
'Determine Winnings
IF Winnings% <> 0 THEN
IF Dosh%% > Plum%(1, Plumpet%%) THEN
Winnings% = 0
WinBan%% = False
WinDisp%% = True
ELSE
IF MoreDosh%% THEN
Cash& = Cash& + (Winnings% / Plum%(1, Plumpet%%))
IF Cash& > 5000 THEN Cash& = 5000
Dosh%% = Dosh%% + 1
MoreDosh%% = False
IF DoSounds%% THEN _SNDPLAY KerChing&
DoshCount% = 0
ELSE
DoshCount% = DoshCount% + 1
IF DoshCount% = DoshStop% THEN MoreDosh%% = True
END IF
END IF
END IF
'Display Winnings
IF WinDisp%% THEN
IF WinCount% < WinStop% THEN
WinCount% = WinCount% + 1
ELSE
WinDisp%% = False
END IF
END IF
Blinking%(0) = Blinking%(0) + 1
IF Blinking%(0) = Blinking%(1) AND Blink%% THEN
Blinking%(0) = 0
Blink%% = False
ELSEIF Blinking%(0) = Blinking%(2) AND NOT Blink%% THEN
Blinking%(0) = 0
Blink%% = True
END IF
'Ambient Sound
AmbCount& = AmbCount& + 1
IF AmbCount& = 16000 THEN
IF DoSounds%% THEN _SNDPLAY Ambience&
AmbCount& = 0
END IF
'Keyboard input (Esc to Quit or Spacebar to Start Reel Spin)
k$ = INKEY$
IF k$ <> "" THEN
IF ASC(k$) = 27 THEN
Casino%% = False
ELSEIF ASC(k$) = 32 AND Spin%%(2, 2) AND Winnings% = 0 THEN
DispMagdha%% = False
'Start rolling
FOR Reel%% = 0 TO 2
Spin%%(Reel%%, 0) = True
Spin%%(Reel%%, 1) = True
Spin%%(Reel%%, 2) = False
SpinCount%(Reel%%, 0) = 0
NEXT Reel%%
Cash& = Cash& - 1
IF Cash& < 0 THEN Cash& = 0
WinCount% = 0
MoreDosh%% = False
WinDisp%% = False
WinBan%% = False
RANDOMIZE (TIMER)
'Set fruit type in positions which are not visible
FOR Reel%% = 0 TO 2
FOR Posn%% = 0 TO 22
IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
'Do nothing
ELSE
IF RandomReels%% THEN
'Fruit Type Not Dependent Upon Neighbouring Positions
P! = 1000 * RND
IF P! >= ReelStats%(Reel%%, 4) THEN
Reels%(Reel%%, Posn%%) = 4
ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
Reels%(Reel%%, Posn%%) = 3
ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
Reels%(Reel%%, Posn%%) = 2
ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
Reels%(Reel%%, Posn%%) = 1
ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
Reels%(Reel%%, Posn%%) = 0
ELSE
Reels%(Reel%%, Posn%%) = 5
END IF
ELSE
'Fruit Type Never The Same as Neighbouting Positions
Same%% = True
WHILE Same%%
P! = 1000 * RND
IF P! >= ReelStats%(Reel%%, 4) THEN
'Bar
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 4 OR Reels%(Reel%%, 1) = 4 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 4
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 4 OR Reels%(Reel%%, 21) = 4 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 4
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 4 OR Reels%(Reel%%, Posn%% + 1) = 4 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 4
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
'Bell
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 3 OR Reels%(Reel%%, 1) = 3 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 3
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 3 OR Reels%(Reel%%, 21) = 3 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 3
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 3 OR Reels%(Reel%%, Posn%% + 1) = 3 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 3
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
'Strawberry
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 2 OR Reels%(Reel%%, 1) = 2 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 2
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 2 OR Reels%(Reel%%, 21) = 2 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 2
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 2 OR Reels%(Reel%%, Posn%% + 1) = 2 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 2
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
'Lemon
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 1 OR Reels%(Reel%%, 1) = 1 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 1
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 1 OR Reels%(Reel%%, 21) = 1 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 1
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 1 OR Reels%(Reel%%, Posn%% + 1) = 1 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 1
Same%% = False
END IF
ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
'Cheries
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 0 OR Reels%(Reel%%, 1) = 0 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 0
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 0 OR Reels%(Reel%%, 21) = 0 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 0
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 0 OR Reels%(Reel%%, Posn%% + 1) = 0 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 0
Same%% = False
END IF
ELSE
'Joker
IF Posn%% = 0 THEN
IF Reels%(Reel%%, 22) = 5 OR Reels%(Reel%%, 1) = 5 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 5
Same%% = False
END IF
ELSEIF Posn%% = 22 THEN
IF Reels%(Reel%%, 0) = 5 OR Reels%(Reel%%, 21) = 5 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 5
Same%% = False
END IF
ELSEIF Reels%(Reel%%, Posn%% - 1) = 5 OR Reels%(Reel%%, Posn%% + 1) = 5 THEN
'Same as either side
ELSE
Reels%(Reel%%, Posn%%) = 5
Same%% = False
END IF
END IF
WEND
END IF
END IF
NEXT Posn%%
NEXT Reel%%
IF DoSounds%% THEN _SNDPLAY SlotMachine&
END IF
END IF
k$ = ""
WEND
'Free Images
_FREEIMAGE Bandit&
_FREEIMAGE Back&
_FREEIMAGE DollarSign&
_FREEIMAGE Payout&
_FREEIMAGE Star&
FOR S%% = 0 TO 2
_FREEIMAGE Banner&(S%%)
NEXT S%%
FOR S%% = 0 TO 5
_FREEIMAGE Pict&(S%%)
NEXT S%%
FOR S%% = 0 TO 9
_FREEIMAGE NumImg&(S%%)
NEXT S%%
'Free Sounds
_SNDCLOSE SlotMachine&
_SNDCLOSE KerChing&
_SNDCLOSE Ambience&
SYSTEM
'DATA
SevenSegment:
DATA 0,0,0,-1,0,0,0
DATA 0,0,-1,-1,-1,0,0
DATA 0,-1,-1,-1,-1,-1,0
DATA -1,-1,-1,0,-1,-1,-1
DATA 0,0,-1,0,0,-1,0
DATA -1,0,-1,-1,-1,0,-1
DATA -1,0,-1,-1,0,-1,-1
DATA 0,-1,-1,-1,0,-1,0
DATA -1,-1,0,-1,0,-1,-1
DATA -1,-1,0,-1,-1,-1,-1
DATA -1,0,-1,0,0,-1,0
DATA -1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,0,-1,0
Blinks:
DATA 150,35
Plums:
DATA 3,10,20,50,100,250
DATA 1,1,2,2,4,5
ReelData:
DATA 5,168,496,666,800
DATA 5,404,596,766,900
DATA 50,500,593,764,900
SpinData:
DATA 500,800,1100
ThetaData:
DATA 0.008,0.009,0.01
FUNCTION HardwareImage& (ImageName&)
HardwareImage& = _COPYIMAGE(ImageName&, 33)
_FREEIMAGE ImageName&
END FUNCTION

