Guest User

HGSS Slot Machine Script

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