Advertisement
Guest User

HGSS Slot Machine Script

a guest
Feb 26th, 2020
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.40 KB | None | 0 0
  1. ################################################################################
  2. # "Slot Machine" mini-game
  3. # By Maruno
  4. #-------------------------------------------------------------------------------
  5. # Run with: pbSlotMachine(1)
  6. # - The number is either 0 (easy), 1 (default) or 2 (hard).
  7. ################################################################################
  8. class SlotMachineReel < BitmapSprite
  9. attr_accessor :reel
  10. attr_accessor :toppos
  11. attr_accessor :spinning
  12. attr_accessor :stopping
  13. attr_accessor :slipping
  14. SCROLLSPEED = 16 # Must be a divisor of 48
  15. ICONSPOOL = [[0,0,0,0,1,1,2,2,3,3,3,4,4,4,5,5], # 0 - Easy
  16. [0,0,0,0,1,1,1,2,2,2,3,3,4,4,5], # 1 - Medium (default)
  17. [0,0,1,1,1,2,2,2,3,3,4,4,5] # 2 - Hard
  18. ]
  19. SLIPPING = [0,0,0,0,0,0,1,1,1,2,2,3]
  20.  
  21. def initialize(x,y,difficulty=1)
  22. @viewport=Viewport.new(x,y,64,144)
  23. @viewport.z=99999
  24. super(64,144,@viewport)
  25. @reel=[]
  26. for i in 0...ICONSPOOL[difficulty].length
  27. @reel.push(ICONSPOOL[difficulty][i])
  28. end
  29. @reel.shuffle!
  30. @toppos=0
  31. @spinning=false
  32. @stopping=false
  33. @slipping=0
  34. @index=rand(@reel.length)
  35. @images=AnimatedBitmap.new(_INTL("Graphics/Pictures/Slot Machine/images"))
  36. @shading=AnimatedBitmap.new(_INTL("Graphics/Pictures/Slot Machine/ReelOverlay"))
  37. update
  38. end
  39.  
  40. def startSpinning
  41. @spinning=true
  42. end
  43.  
  44. def stopSpinning(noslipping=false)
  45. @stopping=true
  46. @slipping=SLIPPING[rand(SLIPPING.length)]
  47. @slipping=0 if noslipping
  48. end
  49.  
  50. def showing
  51. array=[]
  52. for i in 0...3
  53. num=@index-i
  54. num+=@reel.length if num<0
  55. array.push(@reel[num])
  56. end
  57. return array # [0] = top, [1] = middle, [2] = bottom
  58. end
  59.  
  60. def update
  61. self.bitmap.clear
  62. if @toppos==0 && @stopping && @slipping==0
  63. @spinning=@stopping=false
  64. end
  65. if @spinning
  66. @toppos+=SCROLLSPEED
  67. if @toppos>0
  68. @toppos-=48
  69. @index=(@index+1)%@reel.length
  70. @slipping-=1 if @slipping>0
  71. end
  72. end
  73. for i in 0...4
  74. num=@index-i
  75. num+=@reel.length if num<0
  76. self.bitmap.blt(0,@toppos+i*48,@images.bitmap,Rect.new(@reel[num]*64,0,64,48))
  77. end
  78. self.bitmap.blt(0,0,@shading.bitmap,Rect.new(0,0,64,144))
  79. end
  80. end
  81.  
  82.  
  83.  
  84. class SlotMachineScore < BitmapSprite
  85. attr_reader :score
  86.  
  87. def initialize(x,y,score=0)
  88. @viewport=Viewport.new(x,y,70,22)
  89. @viewport.z=99999
  90. super(70,22,@viewport)
  91. @numbers=AnimatedBitmap.new(_INTL("Graphics/Pictures/Slot Machine/numbers"))
  92. self.score=score
  93. end
  94.  
  95. def score=(value)
  96. @score=value
  97. @score=MAXCOINS if @score>MAXCOINS
  98. refresh
  99. end
  100.  
  101. def refresh
  102. self.bitmap.clear
  103. for i in 0...5
  104. digit=(@score/(10**i))%10 # Least significant digit first
  105. self.bitmap.blt(14*(4-i),0,@numbers.bitmap,Rect.new(digit*14,0,14,22))
  106. end
  107. end
  108. end
  109.  
  110.  
  111.  
  112. class SlotMachineScene
  113. attr_accessor :gameRunning
  114. attr_accessor :gameEnd
  115. attr_accessor :wager
  116. attr_accessor :replay
  117.  
  118. def update
  119. pbUpdateSpriteHash(@sprites)
  120. end
  121.  
  122. def pbPayout
  123. @replay=false
  124. payout=0
  125. bonus=0
  126. wonRow=[]
  127. # Get reel pictures
  128. reel1=@sprites["reel1"].showing
  129. reel2=@sprites["reel2"].showing
  130. reel3=@sprites["reel3"].showing
  131. combinations=[[reel1[1],reel2[1],reel3[1]], # Centre row
  132. [reel1[0],reel2[0],reel3[0]], # Top row
  133. [reel1[2],reel2[2],reel3[2]], # Bottom row
  134. [reel1[0],reel2[1],reel3[2]], # Diagonal top left -> bottom right
  135. [reel1[2],reel2[1],reel3[0]], # Diagonal bottom left -> top right
  136. ]
  137. for i in 0...combinations.length
  138. break if i>=1 && @wager<=1 # One coin = centre row only
  139. break if i>=3 && @wager<=2 # Two coins = three rows only
  140. wonRow[i]=true
  141. case combinations[i]
  142. when [1,1,1] # Three Marills
  143. payout+=10
  144. when [2,2,2] # Three Pikachus
  145. payout+=15
  146. when [3,3,3] # 777
  147. payout+=300
  148. bonus=1 if bonus<1
  149. when [4,4,4] # Pokéball
  150. payout+=100
  151. when [5,5,5] # Three replays
  152. @replay=true
  153. else
  154. if combinations[i][0]==0 # Left apricorn
  155. if combinations[i][1]==0 # Centre apricorn as well
  156. payout+=4
  157. else
  158. payout+=2
  159. end
  160. else
  161. wonRow[i]=false
  162. end
  163. end
  164. end
  165. @sprites["payout"].score=payout
  166. frame=0
  167. if payout>0 || @replay
  168. if bonus>0
  169. pbMEPlay("Slots big win")
  170. else
  171. pbMEPlay("Slots win")
  172. end
  173. # Show winning animation
  174. until frame==120 # 40 frames per seconds
  175. Graphics.update
  176. Input.update
  177. update
  178. @sprites["window2"].bitmap.clear if @sprites["window2"].bitmap
  179. @sprites["window1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/win"))
  180. @sprites["window1"].src_rect.set(152*((frame/5)%4),0,152,208)
  181. if bonus>0
  182. @sprites["window2"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/bonus"))
  183. @sprites["window2"].src_rect.set(152*(bonus-1),0,152,208)
  184. end
  185. @sprites["light1"].visible=true
  186. @sprites["light1"].src_rect.set(0,26*((frame/5)%4),96,26)
  187. @sprites["light2"].visible=true
  188. @sprites["light2"].src_rect.set(0,26*((frame/5)%4),96,26)
  189. for i in 1..5
  190. if wonRow[i-1]
  191. @sprites["row#{i}"].visible=(frame%10<5)
  192. else
  193. @sprites["row#{i}"].visible=false
  194. end
  195. end
  196. frame+=1
  197. end
  198. @sprites["light1"].visible=false
  199. @sprites["light2"].visible=false
  200. @sprites["window1"].src_rect.set(0,0,152,208)
  201. # Pay out
  202. loop do
  203. break if @sprites["payout"].score<=0
  204. Graphics.update
  205. Input.update
  206. update
  207. @sprites["payout"].score-=1
  208. @sprites["credit"].score+=1
  209. if Input.trigger?(Input::C) || @sprites["credit"].score==MAXCOINS
  210. @sprites["credit"].score+=@sprites["payout"].score
  211. @sprites["payout"].score=0
  212. end
  213. end
  214. 20.times do
  215. Graphics.update
  216. Input.update
  217. update
  218. end
  219. else
  220. # Show losing animation
  221. until frame==80 # 40 frames per seconds
  222. Graphics.update
  223. Input.update
  224. update
  225. @sprites["window2"].bitmap.clear if @sprites["window2"].bitmap
  226. @sprites["window1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/lose"))
  227. @sprites["window1"].src_rect.set(152*((frame/10)%2),0,152,208)
  228. frame+=1
  229. end
  230. end
  231. @wager=0
  232. end
  233.  
  234. def pbStartScene(difficulty)
  235. @sprites={}
  236. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  237. @viewport.z=99999
  238. addBackgroundPlane(@sprites,"bg","Slot Machine/bg",@viewport)
  239. @sprites["reel1"]=SlotMachineReel.new(64,112,difficulty)
  240. @sprites["reel2"]=SlotMachineReel.new(144,112,difficulty)
  241. @sprites["reel3"]=SlotMachineReel.new(224,112,difficulty)
  242. for i in 1..3
  243. @sprites["button#{i}"]=IconSprite.new(68+80*(i-1),260,@viewport)
  244. @sprites["button#{i}"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/button"))
  245. @sprites["button#{i}"].visible=false
  246. end
  247. for i in 1..5
  248. y=[170,122,218,82,82][i-1]
  249. @sprites["row#{i}"]=IconSprite.new(1,y,@viewport)
  250. @sprites["row#{i}"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/line%1d%s",
  251. 1+i/2,(i>=4) ? ((i==4) ? "a" : "b") : ""))
  252. @sprites["row#{i}"].visible=false
  253. end
  254. @sprites["light1"]=IconSprite.new(16,32,@viewport)
  255. @sprites["light1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/lights"))
  256. @sprites["light1"].visible=false
  257. @sprites["light2"]=IconSprite.new(240,32,@viewport)
  258. @sprites["light2"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/lights"))
  259. @sprites["light2"].mirror=true
  260. @sprites["light2"].visible=false
  261. @sprites["window1"]=IconSprite.new(358,96,@viewport)
  262. @sprites["window1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/insert"))
  263. @sprites["window1"].src_rect.set(0,0,152,208)
  264. @sprites["window2"]=IconSprite.new(358,96,@viewport)
  265. @sprites["credit"]=SlotMachineScore.new(360,66,$PokemonGlobal.coins)
  266. @sprites["payout"]=SlotMachineScore.new(438,66,0)
  267. @wager=0
  268. update
  269. pbFadeInAndShow(@sprites)
  270. end
  271.  
  272. def pbMain
  273. frame=0
  274. loop do
  275. Graphics.update
  276. Input.update
  277. update
  278. @sprites["window1"].bitmap.clear if @sprites["window1"].bitmap
  279. @sprites["window2"].bitmap.clear if @sprites["window2"].bitmap
  280. if @sprites["credit"].score==MAXCOINS
  281. Kernel.pbMessage(_INTL("You've got 99,999 Coins."))
  282. break
  283. elsif $PokemonGlobal.coins==0
  284. Kernel.pbMessage(_INTL("You've run out of Coins.\nGame over!"))
  285. break
  286. elsif @gameRunning # Reels are spinning
  287. @sprites["window1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/stop"))
  288. @sprites["window1"].src_rect.set(152*((frame/10)%4),0,152,208)
  289. if Input.trigger?(Input::C)
  290. pbSEPlay("Slots stop")
  291. if @sprites["reel1"].spinning
  292. @sprites["reel1"].stopSpinning(@replay)
  293. @sprites["button1"].visible=true
  294. elsif @sprites["reel2"].spinning
  295. @sprites["reel2"].stopSpinning(@replay)
  296. @sprites["button2"].visible=true
  297. elsif @sprites["reel3"].spinning
  298. @sprites["reel3"].stopSpinning(@replay)
  299. @sprites["button3"].visible=true
  300. end
  301. end
  302. if !@sprites["reel3"].spinning
  303. @gameEnd=true
  304. @gameRunning=false
  305. end
  306. elsif @gameEnd # Reels have been stopped
  307. pbPayout
  308. # Reset graphics
  309. @sprites["button1"].visible=false
  310. @sprites["button2"].visible=false
  311. @sprites["button3"].visible=false
  312. for i in 1..5
  313. @sprites["row#{i}"].visible=false
  314. end
  315. @gameEnd=false
  316. else # Awaiting coins for the next spin
  317. @sprites["window1"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/insert"))
  318. @sprites["window1"].src_rect.set(152*((frame/15)%2),0,152,208)
  319. if @wager>0
  320. @sprites["window2"].setBitmap(sprintf("Graphics/Pictures/Slot Machine/press"))
  321. @sprites["window2"].src_rect.set(152*((frame/15)%2),0,152,208)
  322. end
  323. if Input.trigger?(Input::DOWN) && @wager<3 && @sprites["credit"].score>0
  324. pbSEPlay("Slots coin")
  325. @wager+=1
  326. @sprites["credit"].score-=1
  327. if @wager>=3
  328. @sprites["row5"].visible=true
  329. @sprites["row4"].visible=true
  330. elsif @wager>=2
  331. @sprites["row3"].visible=true
  332. @sprites["row2"].visible=true
  333. elsif @wager>=1
  334. @sprites["row1"].visible=true
  335. end
  336. elsif @wager>=3 || (@wager>0 && @sprites["credit"].score==0) ||
  337. (Input.trigger?(Input::C) && @wager>0) || @replay
  338. if @replay
  339. @wager=3
  340. for i in 1..5
  341. @sprites["row#{i}"].visible=true
  342. end
  343. end
  344. @sprites["reel1"].startSpinning
  345. @sprites["reel2"].startSpinning
  346. @sprites["reel3"].startSpinning
  347. frame=0
  348. @gameRunning=true
  349. elsif Input.trigger?(Input::B) && @wager==0
  350. break
  351. end
  352. end
  353. frame=(frame+1)%120
  354. end
  355. $PokemonGlobal.coins=@sprites["credit"].score
  356. end
  357.  
  358. def pbEndScene
  359. pbMEPlay("Voltorb Flip game over")
  360. pbWait(135)
  361. pbFadeOutAndHide(@sprites)
  362. pbDisposeSpriteHash(@sprites)
  363. @viewport.dispose
  364. end
  365. end
  366.  
  367.  
  368.  
  369. class SlotMachine
  370. def initialize(scene)
  371. @scene=scene
  372. end
  373.  
  374. def pbStartScreen(difficulty)
  375. @scene.pbStartScene(difficulty)
  376. @scene.pbMain
  377. @scene.pbEndScene
  378. end
  379. end
  380.  
  381.  
  382.  
  383. def pbSlotMachine(difficulty=1)
  384. if hasConst?(PBItems,:COINCASE) && !$PokemonBag.pbHasItem?(:COINCASE)
  385. Kernel.pbMessage(_INTL("It's a Slot Machine."))
  386. elsif $PokemonGlobal.coins==0
  387. Kernel.pbMessage(_INTL("You don't have any Coins to play!"))
  388. elsif $PokemonGlobal.coins==MAXCOINS
  389. Kernel.pbMessage(_INTL("Your Coin Case is full!"))
  390. else
  391. pbFadeOutIn(99999){
  392. scene = SlotMachineScene.new
  393. screen = SlotMachine.new(scene)
  394. screen.pbStartScreen(difficulty)
  395. }
  396. end
  397. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement