Advertisement
M3rein

Dye UI

Jun 8th, 2017
567
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 33.46 KB | None | 0 0
  1. # Missing an oval shadow for the Dye Selection underneath the character, fyi.
  2.  
  3. # To restock dyes for a $Shop, use
  4. # pbRestockDyes(key, color, stock,color,stock,etc.) #Can go infinite
  5. # pbRestockDyes(key, "all", stock) to restock all dyes in $Shop[key]
  6.  
  7. # To open the main dye menu: pbDyeMenu
  8. # To open just the dye shop: pbDyeShop
  9.  
  10. # Edit shops at line 47+. You'll MOST likely have to rewrite a lot of the shop
  11. # stuff. Sorry bout that. Wasn't sure how you'd like it.
  12.  
  13. MOVE_SOUND = "TileGameMove"
  14.  
  15. $Shop = {}
  16.  
  17. # Temporary dye storage for the trainer
  18. $Inventory = []
  19.  
  20. # The trainer outfit. Will probably be $Trainer.outfit.
  21. $Outfit = 0
  22.  
  23. class Dye # Dye class. Stock is also used for the inv. dye storage, not just shop.
  24.   attr_accessor :color
  25.   attr_accessor :stock
  26.   attr_accessor :price
  27.  
  28.   def initialize(color, stock, price=0)
  29.     self.color = color
  30.     self.stock = stock
  31.     self.price = price
  32.   end
  33.  
  34.   def id # 0-based array for IDs (order of dyes.png as well)
  35.     array = ["Red","Blue","Green","Orange","Yellow","Pink","Purple",
  36.              "Black","White"].index(self.color)
  37.   end
  38. end
  39.  
  40. def dyes(*args)
  41.   ar = []
  42.   i = 0
  43.   while i < args.size
  44.     ar.push(Dye.new(args[i],args[i+1],args[i+2]))
  45.     i += 3
  46.   end
  47.   ar
  48. end
  49.  
  50. # "def dyes" just converts the arguments into classes. This way, you don't have
  51. # to write out "Dye.new("Blue",4,5000)," out all the time.
  52.  
  53. $Shop["one"] = dyes(
  54. "Blue",4,5000,
  55. "Red",4,5000,
  56. "Green",4,5000,
  57. "Orange",4,5000,
  58. "Yellow",4,5000,
  59. "Pink",4,5000,
  60. "Purple",4,5000,
  61. "Black",2,10000,
  62. "White",2,10000)
  63.  
  64. $Shop["two"] = dyes(
  65. "Blue",4,5000,
  66. "Red",4,5000,
  67. "Green",4,5000,
  68. "Orange",4,5000,
  69. "Yellow",4,5000,
  70. "Pink",4,5000,
  71. "Purple",4,5000,
  72. "Black",2,10000,
  73. "White",2,10000,
  74. "Red",1,4000,
  75. "Green",2,5000,
  76. "Blue",4,7500)
  77.  
  78. def pbDyeMenu
  79.   DyeMenu.new
  80. end
  81.  
  82. def pbRestockDyes(*args)
  83.   for i in 0...$Shop[args[0]].size
  84.     if args[1] == "all"
  85.       $Shop[args[0]][i].stock = args[2]
  86.     else
  87.       for j in 1...args.size
  88.         next if j % 2 == 0
  89.         if args[j] == $Shop[args[0]][i].color
  90.           $Shop[args[0]][i].stock = args[j+1]
  91.         end
  92.       end
  93.     end
  94.   end
  95. end
  96.  
  97. def dotNumber(int, char = ',') # Better display for numbers (9999999 -> 9,999,999)
  98.   chars = int.to_s.scan(/\w/).reverse!
  99.   for i in 0...chars.size+1
  100.     chars.insert(i, char) if ((i + 1) % 4 == 0) && chars.length > i
  101.   end
  102.   chars.reverse!.to_s
  103. end
  104.  
  105. class ShopBox < Sprite
  106.   attr_accessor :dye
  107.   attr_reader :selected
  108.  
  109.   def initialize(viewport, dye)
  110.     super(viewport)
  111.     self.dye = dye
  112.     self.bitmap = Bitmap.new("PR/Dye Shop/Resources/box1")
  113.   end
  114.  
  115.   def selected=(val)
  116.     if val
  117.       self.bitmap = Bitmap.new("PR/Dye Shop/Resources/box2")
  118.     else
  119.       self.bitmap = Bitmap.new("PR/Dye Shop/Resources/box1")
  120.     end
  121.   end
  122. end
  123.                    
  124. class DyeMenu
  125.   def initialize(index = 0)
  126.     #idk why
  127.     raise ArgumentError.new(_INTL("Index cannot be greater than 2 or lower than 0.")) if index < 0 || index > 2
  128.     @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
  129.     @viewport.z = 99997
  130.     @sprites = {}
  131.     @sprites["bg"] = Sprite.new(@viewport)
  132.     @sprites["bg"].bitmap = Bitmap.new("PR/Dye Menu/Resources/background")
  133.     @sprites["bg"].opacity = 0
  134.     @sprites["bg"].z = -1
  135.     @sprites["bmp"] = Sprite.new(@viewport)
  136.     @sprites["bmp"].bitmap = Bitmap.new(Graphics.width*3,Graphics.height)
  137.     @sprites["bmp"].opacity = 0
  138.     @sprites["bmp"].z = 2
  139.     @txt = @sprites["bmp"].bitmap
  140.     @sel = index
  141.     pbSetSystemFont(@txt)
  142.     @txt.font.size = 20
  143.     @sprites["cursor"] = Sprite.new(@viewport)
  144.     @sprites["cursor"].bitmap = Bitmap.new("PR/Dye Menu/Resources/cursor")
  145.     @sprites["cursor"].opacity = 0
  146.     @sprites["cursor"].x = 24
  147.     @sprites["cursor"].y = 16 + 56 * @sel
  148.     @sprites["cursor"].z = 2
  149.     for i in 0..2
  150.       @sprites["btn#{i}"] = Sprite.new(@viewport)
  151.       @sprites["btn#{i}"].bitmap = Bitmap.new(Graphics.width, Graphics.height)
  152.       @sprites["btn#{i}"].bitmap.fill_rect(24,16+56*i, 272,43,Color.new(255,255,255))
  153.       @sprites["btn#{i}"].opacity = 0
  154.     end
  155.     pbDrawOutlineText(@txt,-1,-83,320,240,"Shop",Color.new(0,0,0),Color.new(0,0,0,0),1)
  156.     pbDrawOutlineText(@txt,-1,-26,320,240,"Dye Selection",Color.new(0,0,0),Color.new(0,0,0,0),1)
  157.     pbDrawOutlineText(@txt,-1,30,320,240,"Crafting",Color.new(0,0,0),Color.new(0,0,0,0),1)
  158.    
  159.     16.times do
  160.       Graphics.update
  161.       @sprites["bg"].opacity += 16
  162.       @sprites["bmp"].opacity += 16
  163.       @sprites["cursor"].opacity += 16
  164.       for i in 0..2
  165.         @sprites["btn#{i}"].opacity += 16
  166.       end
  167.     end
  168.     main
  169.   end
  170.  
  171.   def main
  172.     loop do
  173.       Graphics.update
  174.       Input.update
  175.       break if Input.trigger?(Input::B)
  176.       move(:down) if Input.trigger?(Input::DOWN)
  177.       move(:up) if Input.trigger?(Input::UP)
  178.       choose if Input.trigger?(Input::C)
  179.     end
  180.     dispose
  181.   end
  182.  
  183.   def move(dir)
  184.     if @sel > 0 && dir == :up
  185.       @sel -= 1
  186.       pbSEPlay(MOVE_SOUND)
  187.     elsif @sel < 2 && dir == :down
  188.       @sel += 1
  189.       pbSEPlay(MOVE_SOUND)
  190.     end
  191.     @sprites["cursor"].y = 16 + 56 * @sel
  192.   end
  193.  
  194.   def choose
  195.     hide_buttons
  196.     if @sel == 0
  197.       pbDyeShop("one", false)
  198.     elsif @sel == 1
  199.       pbDyeSelection(false)
  200.     else
  201.       p "crafting"
  202.     end
  203.     show_buttons
  204.   end
  205.  
  206.   def hide_buttons
  207.     for i in 0...12
  208.       Graphics.update
  209.       @sprites["bmp"].opacity -= 32
  210.       @sprites["cursor"].opacity -= 24
  211.       for j in 0..2
  212.         @sprites["btn#{j}"].opacity -= 24
  213.       end
  214.     end
  215.   end
  216.  
  217.   def show_buttons
  218.     for i in 0...12
  219.       Graphics.update
  220.       @sprites["bmp"].opacity += 32 if i > 3
  221.       @sprites["cursor"].opacity += 24
  222.       for j in 0..2
  223.         @sprites["btn#{j}"].opacity += 24
  224.       end
  225.     end
  226.   end
  227.  
  228.   def dispose(anim = true)
  229.     16.times do
  230.       Graphics.update if anim
  231.       @sprites["bg"].opacity -= 16
  232.       @sprites["bmp"].opacity -= 16
  233.       for i in 0..2
  234.         @sprites["btn#{i}"].opacity -= 16
  235.       end
  236.     end
  237.     pbDisposeSpriteHash(@sprites)
  238.     @viewport.dispose
  239.     pbWait(1)
  240.   end
  241. end
  242.  
  243. def pbDyeShop(shop, directly = true)
  244.   for key in $Shop.keys
  245.     DyeShop.new($Shop[key], directly) if key == shop
  246.   end
  247. end
  248.  
  249. def pbDyeSelection(directly = true)
  250.   DyeSelection.new(directly)
  251. end
  252.  
  253. class DyeShop
  254.   def initialize(shop, directly = true)
  255.     @shop = shop # The dyes the shop should sell
  256.     @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
  257.     @viewport.z = 99999
  258.     @sprites = {}
  259.     @sprites["bg"] = Sprite.new(@viewport)
  260.     @sprites["bg"].bitmap = Bitmap.new("PR/Dye Menu/Resources/background")
  261.     @sprites["bg"].opacity = 0
  262.     @sprites["label"] = Sprite.new(@viewport)
  263.     @sprites["label"].bitmap = Bitmap.new("PR/Dye Shop/Resources/clothing_dyes")
  264.     @sprites["label"].y = -1 * @sprites["label"].bitmap.height
  265.     @sprites["money"] = Sprite.new(@viewport)
  266.     @sprites["money"].bitmap = Bitmap.new("PR/Dye Shop/Resources/money")
  267.     @sprites["money"].x = Graphics.width - @sprites["money"].bitmap.width
  268.     @sprites["money"].y = -1 * @sprites["money"].bitmap.height
  269.     @sprites["moneybmp"] = Sprite.new(@viewport)
  270.     @sprites["moneybmp"].bitmap = Bitmap.new(Graphics.width*3, Graphics.height)
  271.     @sprites["moneybmp"].z = 2
  272.     @sprites["moneybmp"].opacity = 0
  273.     @money = @sprites["moneybmp"].bitmap
  274.     pbSetSystemFont(@money)
  275.     @money.font.size = 17
  276.     # Money has its own bitmap as it should never be moved.
  277.     @sprites["back"] = Sprite.new(@viewport)
  278.     @sprites["back"].bitmap = Bitmap.new("PR/Dye Shop/Resources/back1")
  279.     @sprites["back"].y = Graphics.height
  280.     @sprites["bmp"] = Sprite.new(@viewport)
  281.     @sprites["bmp"].bitmap = Bitmap.new(Graphics.width*3, Graphics.height)
  282.     @sprites["bmp"].z = 2
  283.     @sprites["bmp"].opacity = 0
  284.     @txt = @sprites["bmp"].bitmap
  285.     pbSetSystemFont(@txt)
  286.     @sprites["bmp"].bitmap.font.size = 17
  287.     if @shop.nil? || @shop.size == 0
  288.       pbDrawTextPositions(@txt,[[_INTL("This shop doesn't sell any dyes."),
  289.           Graphics.width / 2, Graphics.height / 2, 2, Color.new(64,64,64)]])
  290.       12.times { |i| Graphics.update; @sprites["bg"].opacity += 24; @sprites["bmp"].opacity += 32 if i > 3 }
  291.       loop { Graphics.update; break if Input.trigger?(Input::C) || Input.trigger?(Input::B) }
  292.       dispose
  293.     else
  294.       @sel = 0 # Selected box
  295.       @box = 0 # Determine what box is selected for moving the boxes
  296.       # Due to a strange bug in this RGSS version (presumably), I had to
  297.       # use @page as a workaround.
  298.       @page = 0
  299.       @last = [2,2] # Used for choosing the "Back" button
  300.       @directly = directly # Whether a new main menu scene should be started or not
  301.       @sprites["shopbmp"] = Sprite.new(@viewport)
  302.       @sprites["shopbmp"].bitmap = Bitmap.new(Graphics.width*3, Graphics.height)
  303.       @sprites["shopbmp"].opacity = 0
  304.       @sprites["shopbmp"].z = 2
  305.       @shop_txt = @sprites["shopbmp"].bitmap
  306.       pbSetSystemFont(@shop_txt)
  307.       @shop_txt.font.size = 17
  308.       load_boxes # Setup boxes/dyes/text. Everything is drawn, some just not visible
  309.       @sprites["box0"].selected = true
  310.       pbDrawTextPositions(@money,[[_INTL("$"+dotNumber($Trainer.money)),Graphics.width - 1,1,true,Color.new(64,64,64),Color.new(255,255,255,48)]])
  311.       for i in 0...12
  312.         Graphics.update
  313.         @sprites["bg"].opacity += 32
  314.         @sprites["label"].y += @sprites["label"].bitmap.height / 12
  315.         @sprites["money"].y += @sprites["money"].bitmap.height / 12
  316.         @sprites["back"].y -= 1.916
  317.         num = @shop.size
  318.         num += @shop.size % 3
  319.         num = 9 if num < 9
  320.         for j in 0...num
  321.           @sprites["box#{j}"].opacity += 32 if i > 3
  322.           @sprites["dye#{j}"].opacity += 32 if i > 3 rescue nil # doesn't have to exist
  323.         end
  324.         @sprites["bmp"].opacity += 32 if i > 3
  325.         @sprites["moneybmp"].opacity += 32 if i > 3
  326.         @sprites["shopbmp"].opacity += 32 if i > 3
  327.       end
  328.       main
  329.     end
  330.   end
  331.  
  332.   def load_boxes
  333.     num = @shop.size
  334.     num += @shop.size % 3
  335.     num = 9 if num < 9
  336.     for i in 0...num
  337.       x = 6 + 105 * (i / 3).floor
  338.       y = 27 + 64 * (i % 3)
  339.       @sprites["box#{i}"] = ShopBox.new(@viewport, @shop[i])
  340.       @sprites["box#{i}"].x = x
  341.       @sprites["box#{i}"].y = y
  342.       @sprites["box#{i}"].opacity = 0
  343.       begin
  344.         pbDrawTextPositions(@shop_txt,[[_INTL("$"+dotNumber(@sprites["box#{i}"].dye.price).to_s),
  345.             x+@sprites["box#{i}"].bitmap.width-8,y+4,true,Color.new(64,64,64),
  346.             Color.new(0,0,0,0)],
  347.             [_INTL(@sprites["box#{i}"].dye.color+" Dye"),x+@sprites["box#{i}"].bitmap.width / 2,y+@sprites["box#{i}"].bitmap.height-20,2,Color.new(64,64,64),Color.new(0,0,0,0)]])
  348.         pbDrawTextPositions(@txt,[[_INTL("x"+@sprites["box#{i}"].dye.stock.to_s),x+8,y+4,false,Color.new(64,64,64),
  349.             Color.new(0,0,0,0)],])
  350.         # I didn't deem a new Sprite class for Dye necessary
  351.         @sprites["dye#{i}"] = Sprite.new(@viewport)
  352.         @sprites["dye#{i}"].bitmap = Bitmap.new("PR/dyes#{i == 0 ? "2" : "1"}")
  353.         @sprites["dye#{i}"].src_rect.width = @sprites["dye#{i}"].bitmap.height
  354.         @sprites["dye#{i}"].src_rect.x = 32 * @shop[i].id
  355.         @sprites["dye#{i}"].oy = @sprites["dye#{i}"].bitmap.height / 2
  356.         @sprites["dye#{i}"].x = x + @sprites["box#{i}"].bitmap.width / 2 - 16
  357.         @sprites["dye#{i}"].y = y + @sprites["box#{i}"].bitmap.height / 2
  358.         @sprites["dye#{i}"].opacity = 0
  359.       rescue; end
  360.     end
  361.   end
  362.  
  363.   def main
  364.     loop do
  365.       Graphics.update
  366.       Input.update
  367.       break if Input.trigger?(Input::B) || @brk
  368.       move(:down) if Input.trigger?(Input::DOWN)
  369.       move(:up) if Input.trigger?(Input::UP)
  370.       move(:left) if Input.trigger?(Input::LEFT)
  371.       move(:right) if Input.trigger?(Input::RIGHT)
  372.       purchase if Input.trigger?(Input::C)
  373.     end
  374.     dispose
  375.   end
  376.  
  377.   def purchase
  378.     if @sel == -1
  379.       @brk = true
  380.     else
  381.       return if !@shop[@sel]
  382.       tone = Sprite.new(@viewport)
  383.       tone.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  384.       tone.bitmap.fill_rect(0,0,Graphics.width,Graphics.height,Color.new(0,0,0))
  385.       tone.opacity = 0
  386.       tone.z = 1
  387.       bmp = Sprite.new(@viewport)
  388.       bmp.z = 3
  389.       bmp.opacity = 0
  390.       bmp.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  391.       pbSetSystemFont(bmp.bitmap)
  392.       bmp.bitmap.font.size = 20
  393.       ch = Sprite.new(@viewport)
  394.       ch.z = 3
  395.       ch.opacity = 0
  396.       ch.bitmap = Bitmap.new(Graphics.width, Graphics.height)
  397.       pbSetSystemFont(ch.bitmap)
  398.       ch.bitmap.font.size = 20
  399.       if @shop[@sel].stock < 1
  400.         pbDrawTextPositions(bmp.bitmap,[[_INTL("This dye is out of stock."),
  401.           Graphics.width / 2, Graphics.height / 2, 2, Color.new(255,255,255),
  402.           Color.new(0,0,0,0)]])
  403.         8.times do
  404.           Graphics.update
  405.           tone.opacity += 12
  406.           bmp.opacity += 32
  407.         end
  408.         24.times { Graphics.update }
  409.       elsif $Trainer.money < @shop[@sel].price
  410.         pbDrawTextPositions(bmp.bitmap,[[_INTL("You don't have enough money."),
  411.         Graphics.width / 2, Graphics.height / 2, 2, Color.new(255,255,255),
  412.         Color.new(0,0,0,0)]])
  413.         8.times do
  414.           Graphics.update
  415.           tone.opacity += 12
  416.           bmp.opacity += 32
  417.         end
  418.         24.times { Graphics.update }
  419.       else
  420.         pbDrawTextPositions(bmp.bitmap,[[_INTL("Are you sure you want to buy #{@shop[@sel].color} Dye?"),
  421.             Graphics.width / 2, Graphics.height / 2 - 10, 2, Color.new(255,255,255),
  422.             Color.new(0,0,0,0)],
  423.             [_INTL("for $#{dotNumber(@shop[@sel].price)}?"), Graphics.width / 2,
  424.             Graphics.height / 2 + 10, 2, Color.new(255,255,255), Color.new(0,0,0,0)]])
  425.         pbDrawTextPositions(ch.bitmap,[[_INTL("Yes"), Graphics.width / 2 - 48, Graphics.height / 2 + 48, 2,
  426.             Color.new(255,255,255),Color.new(0,0,0,0)],
  427.             [_INTL("No"), Graphics.width / 2 + 48, Graphics.height / 2 + 48, 2,
  428.             Color.new(128,128,128),Color.new(0,0,0,0)]])
  429.         8.times do
  430.           Graphics.update
  431.           tone.opacity += 12
  432.           bmp.opacity += 32
  433.           ch.opacity += 32
  434.         end
  435.         sel = 0
  436.         loop do
  437.           Graphics.update
  438.           Input.update
  439.           if Input.trigger?(Input::LEFT)
  440.             sel = 0
  441.             ch.bitmap.clear
  442.             pbDrawTextPositions(ch.bitmap,[[_INTL("Yes"), Graphics.width / 2 - 48, Graphics.height / 2 + 48, 2,
  443.             Color.new(255,255,255),Color.new(0,0,0,0)],
  444.             [_INTL("No"), Graphics.width / 2 + 48, Graphics.height / 2 + 48, 2,
  445.             Color.new(128,128,128),Color.new(0,0,0,0)]])
  446.           end
  447.           if Input.trigger?(Input::RIGHT)
  448.             sel = 1
  449.             ch.bitmap.clear
  450.             pbDrawTextPositions(ch.bitmap,[[_INTL("Yes"), Graphics.width / 2 - 48, Graphics.height / 2 + 48, 2,
  451.             Color.new(128,128,128),Color.new(0,0,0,0)],
  452.             [_INTL("No"), Graphics.width / 2 + 48, Graphics.height / 2 + 48, 2,
  453.             Color.new(255,255,255),Color.new(0,0,0,0)]])
  454.           end
  455.           if Input.trigger?(Input::B)
  456.             sel = 1
  457.             break
  458.           end
  459.           break if Input.trigger?(Input::C)
  460.         end
  461.         pbWait(1)
  462.         if sel == 0
  463.           8.times do
  464.             Graphics.update
  465.             bmp.opacity -= 32
  466.             ch.opacity -= 32
  467.           end
  468.           bmp.bitmap.clear
  469.           if $Trainer.money >= @shop[@sel].price
  470.             pbDrawTextPositions(bmp.bitmap,[[_INTL("You succesfully purchased #{@shop[@sel].color} Dye."),
  471.             Graphics.width / 2, Graphics.height / 2, 2, Color.new(255,255,255),
  472.             Color.new(0,0,0,0)]])
  473.           end
  474.           8.times do
  475.             Graphics.update
  476.             bmp.opacity += 32
  477.           end
  478.           24.times { Graphics.update }
  479.           if $Trainer.money >= @shop[@sel].price
  480.             $Trainer.money -= @shop[@sel].price
  481.             @shop[@sel].stock -= 1
  482.             ar = []
  483.             for i in 0...$Inventory.size
  484.               if $Inventory[i].color == @shop[@sel].color
  485.                 added = true
  486.                 ar.push(Dye.new(@shop[@sel].color,$Inventory[i].stock+1))
  487.               else
  488.                 ar.push($Inventory[i])
  489.               end
  490.             end
  491.             ar.push(Dye.new(@shop[@sel].color,1)) if !added
  492.             $Inventory = ar
  493.             x = @sprites["bmp"].x
  494.             @txt.dispose
  495.             @money.clear
  496.             pbDrawTextPositions(@money,[[_INTL("$"+dotNumber($Trainer.money)),Graphics.width - 1,1,true,Color.new(64,64,64),Color.new(255,255,255,48)]])
  497.             @sprites["bmp"] = Sprite.new(@viewport)
  498.             @sprites["bmp"].bitmap = Bitmap.new(Graphics.width*3, Graphics.height)
  499.             @txt = @sprites["bmp"].bitmap
  500.             pbSetSystemFont(@txt)
  501.             @txt.font.size = 17
  502.             num = @shop.size
  503.             num += @shop.size % 3
  504.             num = 9 if num < 9
  505.             @sprites["bmp"].x = 0
  506.             for i in 0...num
  507.               pbDrawTextPositions(@txt,[[_INTL("x"+@sprites["box#{i}"].dye.stock.to_s),
  508.                   @sprites["box#{i}"].x+8+105*@page,@sprites["box#{i}"].y+4,false,Color.new(64,64,64),
  509.                   Color.new(0,0,0,0)]])
  510.             end
  511.             @sprites["bmp"].x = x
  512.           end
  513.         end
  514.       end
  515.       8.times do
  516.         Graphics.update
  517.         tone.opacity -= 12
  518.         bmp.opacity -= 32
  519.         ch.opacity -= 32
  520.       end
  521.       tone.dispose
  522.       bmp.dispose
  523.       ch.dispose
  524.       pbWait(1)
  525.     end
  526.   end
  527.  
  528.   def move(dir)
  529.     play = false
  530.     if @sel > -1
  531.       @sprites["box#{@sel}"].selected = false
  532.       begin
  533.         @sprites["dye#{@sel}"].bitmap = Bitmap.new("PR/dyes1")
  534.         @sprites["dye#{@sel}"].src_rect.width = @sprites["dye#{@sel}"].bitmap.height
  535.         @sprites["dye#{@sel}"].src_rect.x = @sprites["dye#{@sel}"].src_rect.width * @sprites["box#{@sel}"].dye.id
  536.       rescue; end
  537.     else
  538.       @sprites["back"].bitmap = Bitmap.new("PR/Dye Shop/Resources/back1")
  539.     end
  540.     if dir == :up
  541.       if @sel == -1 # Back button
  542.         @sel = @last[0]
  543.         @box = @last[1]
  544.         play = true
  545.       elsif @sel != 0 && @sel % 3 != 0
  546.         @sel -= 1
  547.         @box -= 1
  548.         play = true
  549.       end
  550.     elsif dir == :down
  551.       if (@sel + 1) % 3 != 0
  552.         @sel += 1
  553.         @box += 1
  554.         play = true
  555.       elsif @sel > -1
  556.         @last = [@sel,@box]
  557.         @sel = -1 # Back button
  558.         @box = -1
  559.         play = true
  560.       end
  561.     elsif dir == :right
  562.       if @box > 5 && @box < 9
  563.         if @sel % 3 == 0 && @sel + 3 < @shop.size ||
  564.            (@sel - 1) % 3 == 0 && @sel + 2 < @shop.size ||
  565.            (@sel - 2) % 3 == 0 && @sel + 1 < @shop.size
  566.           for j in 0...12
  567.             Graphics.update
  568.             pbSEPlay(MOVE_SOUND) if j == 4
  569.             @sprites["shopbmp"].x -= 8.75
  570.             @sprites["bmp"].x -= 8.75
  571.             num = @shop.size
  572.             num += @shop.size % 3
  573.             num = 9 if num < 9
  574.             for i in 0...num
  575.               @sprites["box#{i}"].x -= 8.75
  576.               @sprites["dye#{i}"].x -= 8.75 rescue nil
  577.             end
  578.           end
  579.           @sel += 3
  580.           @page += 1
  581.         end
  582.       elsif @sel > -1
  583.         @sel += 3
  584.         @box += 3
  585.         play = true
  586.       end
  587.     elsif dir == :left
  588.       if @box > -1 && @box < 3
  589.         if @sel % 3 == 0 && @sel - 1 > -1 ||
  590.            (@sel - 1) % 3 == 0 && @sel - 2 > -1 ||
  591.            (@sel - 2) % 3 == 0 && @sel - 3 > -1
  592.           for j in 0...12
  593.             Graphics.update
  594.             pbSEPlay(MOVE_SOUND) if j == 4
  595.             @sprites["shopbmp"].x += 8.75
  596.             @sprites["bmp"].x += 8.75
  597.             num = @shop.size
  598.             num += @shop.size % 3
  599.             num = 9 if num < 9
  600.             for i in 0...num
  601.               @sprites["box#{i}"].x += 8.75
  602.               @sprites["dye#{i}"].x += 8.75 rescue nil
  603.             end
  604.           end
  605.           @sel -= 3
  606.           @page -= 1
  607.         end
  608.       elsif @sel > -1
  609.         @sel -= 3
  610.         @box -= 3
  611.         play = true
  612.       end
  613.     end
  614.     if @sel > -1
  615.       @sprites["box#{@sel}"].selected = true
  616.       begin
  617.         @sprites["dye#{@sel}"].bitmap = Bitmap.new("PR/dyes2")
  618.         @sprites["dye#{@sel}"].src_rect.width = @sprites["dye#{@sel}"].bitmap.height
  619.         @sprites["dye#{@sel}"].src_rect.x = @sprites["dye#{@sel}"].src_rect.width * @sprites["box#{@sel}"].dye.id
  620.       rescue; end
  621.     else
  622.       @sprites["back"].bitmap = Bitmap.new("PR/Dye Shop/Resources/back2")
  623.     end
  624.     pbSEPlay(MOVE_SOUND) if play
  625.   end
  626.  
  627.   def dispose
  628.     for i in 0...12
  629.       Graphics.update
  630.       @sprites["label"].y -= @sprites["label"].bitmap.height / 12
  631.       @sprites["money"].y -= @sprites["money"].bitmap.height / 12
  632.       @sprites["back"].y += 1.916
  633.       num = @shop.size
  634.       num += @shop.size % 3
  635.       num = 9 if num < 9
  636.       for j in 0...num
  637.         @sprites["box#{j}"].opacity -= 256 / 12
  638.         @sprites["dye#{j}"].opacity -= 256 / 12 rescue nil
  639.       end
  640.       @sprites["bmp"].opacity -= 32 if i > 3
  641.       @sprites["shopbmp"].opacity -= 32 if i > 3
  642.       @sprites["bg"].opacity -= 32 if i > 3 && @directly
  643.     end
  644.     pbDisposeSpriteHash(@sprites)
  645.     @viewport.dispose
  646.     pbWait(1) if @directly
  647.   end
  648. end
  649.  
  650. def invDyes(*args)
  651.   ar = []
  652.   i = 0
  653.   while i < args.size
  654.     ar.push(Dye.new(args[i],args[i+1]))
  655.     i += 2
  656.   end
  657.   ar
  658. end
  659.  
  660. class DyeBox < Sprite
  661.   attr_accessor :dye
  662.   attr_reader :selected
  663.  
  664.   def initialize(viewport, dye)
  665.     super(viewport)
  666.     self.dye = dye
  667.     self.bitmap = Bitmap.new("PR/Dye Selection/Resources/box1")
  668.   end
  669.  
  670.   def selected=(b)
  671.     if b
  672.       self.bitmap = Bitmap.new("PR/Dye Selection/Resources/box2")
  673.     else
  674.       self.bitmap = Bitmap.new("PR/Dye Selection/Resources/box1")
  675.     end
  676.   end
  677. end
  678.  
  679. class DyeSelection
  680.   def initialize(directly)
  681.     @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
  682.     @viewport.z = 99998
  683.     @sprites = {}
  684.     @inv = $Inventory
  685.     @directly = directly
  686.     @brk = false
  687.     @sprites["bg"] = Sprite.new(@viewport)
  688.     @sprites["bg"].bitmap = Bitmap.new("PR/Dye Selection/Resources/background")
  689.     @sprites["bg"].opacity = 0
  690.     @sprites["label"] = Sprite.new(@viewport)
  691.     @sprites["label"].bitmap = Bitmap.new("PR/Dye Selection/Resources/dyeSelection")
  692.     @sprites["label"].y = -1 * @sprites["label"].bitmap.height
  693.     @sprites["back"] = Sprite.new(@viewport)
  694.     @sprites["back"].bitmap = Bitmap.new("PR/Dye Selection/Resources/back1")
  695.     @sprites["back"].y = Graphics.height
  696.     @sprites["removedye"] = Sprite.new(@viewport)
  697.     @sprites["removedye"].bitmap = Bitmap.new("PR/Dye Selection/Resources/removeDye1")
  698.     @sprites["removedye"].x = @sprites["back"].bitmap.width + 4
  699.     @sprites["removedye"].y = Graphics.height
  700.     @path = $Trainer.gender == 0 ? "Alto" : "Aria"
  701.     @sprites["outfit"] = Sprite.new(@viewport)
  702.     @sprites["outfit"].bitmap = Bitmap.new("PR/#{@path}/#{$Outfit}")
  703.     @sprites["outfit"].x = 201
  704.     @sprites["outfit"].y = 6
  705.     @sprites["outfit"].opacity = 0
  706.    
  707.     @sprites["main"] = Sprite.new(@viewport)
  708.     @sprites["main"].bitmap = Bitmap.new(Graphics.width,Graphics.height*2)
  709.     @sprites["main"].z = 2
  710.     @main = @sprites["main"].bitmap
  711.     pbSetSystemFont(@main)
  712.     @main.font.size = 17
  713.     @sprites["bar"] = Sprite.new(@viewport)
  714.     @sprites["bar"].bitmap = Bitmap.new("PR/Dye Selection/Resources/textBox")
  715.     @sprites["bar"].x = -220
  716.     pbDrawTextPositions(@main,[[_INTL("Which dye color would you like?"),15,188,
  717.         false,Color.new(255,255,255),Color.new(0,0,0,0)]])
  718.     @sprites["main"].x = -220
  719.     @boxvp = Viewport.new(9, 39, Graphics.width, 134)
  720.     @boxvp.z = 99999
  721.     @box = 0
  722.     @sel = 0
  723.     @last = []
  724.     load_boxes(true)
  725.     for i in 0...12
  726.       Graphics.update
  727.       @sprites["bg"].opacity += 32
  728.       @sprites["label"].y += @sprites["label"].bitmap.height / 12
  729.       @sprites["back"].y -= 1.916
  730.       @sprites["removedye"].y -= 1.916
  731.       if i > 3
  732.         @sprites["bar"].x += 27.5
  733.         @sprites["main"].x += 27.5
  734.         @sprites["outfit"].opacity += 32
  735.         num = @inv.size
  736.         num += @inv.size % 4
  737.         num = 12 if num < 12
  738.         for j in 0...num
  739.           @sprites["box#{j}"].opacity += 32
  740.           if @inv[j]
  741.             @sprites["count#{j}"].opacity += 32
  742.             @sprites["dye#{j}"].opacity += 32
  743.           end
  744.         end
  745.       end
  746.     end
  747.     main
  748.   end
  749.  
  750.   def load_boxes(anim)
  751.     num = @inv.size
  752.     num += @inv.size % 4
  753.     num = 12 if num < 12
  754.     for i in 0...num
  755.       x = 2 + 44 * (i % 4)
  756.       y = 1 + 45 * (i / 4).floor
  757.       @sprites["box#{i}"] = DyeBox.new(@boxvp, @inv[i])
  758.       @sprites["box#{i}"].x = x
  759.       @sprites["box#{i}"].y = y
  760.       @sprites["box#{i}"].opacity = 0 if anim
  761.       if @inv[i]
  762.         @sprites["count#{i}"] = Sprite.new(@boxvp)
  763.         @sprites["count#{i}"].bitmap = Bitmap.new("PR/Dye Selection/Resources/#{@inv[i].stock}a")
  764.         @sprites["count#{i}"].x = x - 2
  765.         @sprites["count#{i}"].y = y - 2
  766.         @sprites["count#{i}"].opacity = 0 if anim
  767.         @sprites["dye#{i}"] = Sprite.new(@boxvp)
  768.         @sprites["dye#{i}"].bitmap = Bitmap.new("PR/dyes1")
  769.         @sprites["dye#{i}"].src_rect.width = @sprites["dye#{i}"].bitmap.height
  770.         @sprites["dye#{i}"].src_rect.x = @sprites["dye#{i}"].bitmap.height * @inv[i].id
  771.         @sprites["dye#{i}"].x = x + 5
  772.         @sprites["dye#{i}"].y = y + 5
  773.         @sprites["dye#{i}"].opacity = 0 if anim
  774.       end
  775.     end
  776.     @sprites["box0"].selected = true
  777.     if @inv[0]
  778.       @sprites["dye0"].bitmap = Bitmap.new("PR/dyes2")
  779.       @sprites["dye0"].src_rect.width = @sprites["dye0"].bitmap.height
  780.       @sprites["dye0"].src_rect.x = @sprites["dye0"].bitmap.height * @inv[0].id
  781.       @sprites["count0"].bitmap = Bitmap.new("PR/Dye Selection/Resources/#{@inv[0].stock}b")
  782.     end
  783.   end
  784.  
  785.   def main
  786.     loop do
  787.       Graphics.update
  788.       Input.update
  789.       break if @brk
  790.       move(:bottom) if Input.trigger?(Input::B)
  791.       choose if Input.trigger?(Input::C)
  792.       choose if Input.trigger?(Input::B) && @sel < 0
  793.       move(:left) if Input.trigger?(Input::LEFT)
  794.       move(:right) if Input.trigger?(Input::RIGHT)
  795.       move(:up) if Input.trigger?(Input::UP)
  796.       move(:down) if Input.trigger?(Input::DOWN)
  797.     end
  798.     dispose
  799.   end
  800.  
  801.   def choose
  802.     pbWait(1)
  803.     if @sel == -1
  804.       @brk = true
  805.     elsif @sel == -2
  806.       $Outfit = 0
  807.       @sprites["outfit"].bitmap = Bitmap.new("PR/#{@path}/0")
  808.     else
  809.       confirm_usage if @inv[@sel]
  810.     end
  811.   end
  812.  
  813.   def confirm_usage
  814.     @sprites["use"] = Sprite.new(@boxvp)
  815.     @sprites["use"].bitmap = Bitmap.new("PR/Dye Selection/Resources/useBtn")
  816.     @sprites["use"].x = @sprites["box#{@sel}"].x + @sprites["box#{@sel}"].bitmap.width - 15
  817.     @sprites["use"].y = @sprites["box#{@sel}"].y + @sprites["box#{@sel}"].bitmap.height - 11
  818.     @sprites["use"].z = 2
  819.     @sprites["use"].opacity = 0
  820.     4.times do
  821.       Graphics.update
  822.       @sprites["use"].opacity += 64
  823.     end
  824.     @sprites["outfit"].bitmap = Bitmap.new("PR/#{@path}/#{@inv[@sel].id}")
  825.     cnfrmd = false
  826.     loop do
  827.       Graphics.update
  828.       Input.update
  829.       break if Input.trigger?(Input::B) || Input.trigger?(Input::LEFT) ||
  830.                Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN) ||
  831.                Input.trigger?(Input::RIGHT)
  832.       if Input.trigger?(Input::C)
  833.         cnfrmd = true; break
  834.       end
  835.     end
  836.     4.times do
  837.       Graphics.update
  838.       @sprites["use"].opacity -= 64
  839.     end
  840.     if cnfrmd
  841.       $Outfit = @inv[@sel].id
  842.       @inv[@sel].stock -= 1
  843.       # Doing a global array check instead of just deleting at an index.
  844.       r = []
  845.       for i in 0...@inv.size
  846.         r.push(@inv[i]) if @inv[i].stock > 0
  847.       end
  848.       num = @inv.size
  849.       num += @inv.size % 4
  850.       num = 12 if num < 12
  851.       if @inv[@sel].stock == 0
  852.         4.times do
  853.           Graphics.update
  854.           @sprites["count#{@sel}"].opacity -= 64
  855.           @sprites["dye#{@sel}"].opacity -= 64
  856.         end
  857.       end
  858.       for i in 0...num
  859.         @sprites["box#{i}"].dispose
  860.         if @inv[i]
  861.           @sprites["count#{i}"].dispose
  862.           @sprites["dye#{i}"].dispose
  863.         end
  864.       end
  865.       @inv = r
  866.       $Inventory = r
  867.       load_boxes(false)
  868.     else
  869.       @sprites["outfit"].bitmap = Bitmap.new("PR/#{@path}/#{$Outfit}")
  870.     end
  871.     @sprites["use"].dispose
  872.   end
  873.  
  874.   def move(dir)
  875.     play = false
  876.     if @sel > -1
  877.       @sprites["box#{@sel}"].selected = false
  878.       if @inv[@sel]
  879.         @sprites["dye#{@sel}"].bitmap = Bitmap.new("PR/dyes1")
  880.         @sprites["dye#{@sel}"].src_rect.width = @sprites["dye#{@sel}"].bitmap.height
  881.         @sprites["dye#{@sel}"].src_rect.x = @sprites["dye#{@sel}"].bitmap.height * @inv[@sel].id
  882.         @sprites["count#{@sel}"].bitmap = Bitmap.new("PR/Dye Selection/Resources/#{@inv[@sel].stock}a")
  883.       end
  884.     end
  885.     if dir == :right
  886.       if @sel == -1
  887.         @sel = -2
  888.         @sprites["removedye"].bitmap = Bitmap.new("PR/Dye Selection/Resources/removeDye2")
  889.         @sprites["back"].bitmap = Bitmap.new("PR/Dye Selection/Resources/back1")
  890.         play = true
  891.       elsif (@sel + 1) % 4 != 0 && @sel > -1
  892.         @sel += 1
  893.         @box += 1
  894.         play = true
  895.       end
  896.     end
  897.     if dir == :left
  898.       if @sel == -2
  899.         @sel = -1
  900.         @sprites["removedye"].bitmap = Bitmap.new("PR/Dye Selection/Resources/removeDye1")
  901.         @sprites["back"].bitmap = Bitmap.new("PR/Dye Selection/Resources/back2")
  902.         play = true
  903.       elsif @sel % 4 != 0 && @sel > -1
  904.         @sel -= 1
  905.         @box -= 1
  906.         play = true
  907.       end
  908.     end
  909.     if dir == :down
  910.       if @box > 7 && @box < 12
  911.         if @sel % 4 == 0 && @sel + 4 < @inv.size ||
  912.            (@sel - 1) % 4 == 0 && @sel + 3 < @inv.size ||
  913.            (@sel - 2) % 4 == 0 && @sel + 2 < @inv.size ||
  914.            (@sel - 3) % 4 == 0 && @sel + 1 < @inv.size
  915.           num = @inv.size
  916.           num += @inv.size % 4
  917.           for j in 0...12
  918.             Graphics.update
  919.             pbSEPlay(MOVE_SOUND) if j == 4
  920.             for i in 0...num
  921.               @sprites["box#{i}"].y -= 3.66
  922.               if @inv[i]
  923.                 @sprites["dye#{i}"].y -= 3.66
  924.                 @sprites["count#{i}"].y -= 3.66
  925.               end
  926.             end
  927.           end
  928.           @sel += 4
  929.         end
  930.       elsif @sel > -1
  931.         @sel += 4
  932.         @box += 4
  933.         play = true
  934.       end
  935.     end
  936.     if dir == :up
  937.       if @sel < 0
  938.         @sprites["removedye"].bitmap = Bitmap.new("PR/Dye Selection/Resources/removeDye1")
  939.         @sprites["back"].bitmap = Bitmap.new("PR/Dye Selection/Resources/back1")
  940.         @sel = @last[0]
  941.         @box = @last[1]
  942.         @sprites["box#{@sel}"].selected = true
  943.         if @inv[@sel]
  944.           @sprites["dye#{@sel}"].bitmap = Bitmap.new("PR/dyes2")
  945.           @sprites["dye#{@sel}"].src_rect.width = @sprites["dye#{@sel}"].bitmap.height
  946.           @sprites["dye#{@sel}"].src_rect.x = @sprites["dye#{@sel}"].bitmap.height * @inv[@sel].id
  947.           @sprites["count#{@sel}"].bitmap = Bitmap.new("PR/Dye Selection/Resources/#{@inv[@sel].stock}b")
  948.           play = true
  949.         end
  950.       elsif @box > -1 && @box < 4
  951.         if @sel % 4 == 0 && @sel - 1 > -1 ||
  952.            (@sel - 1) % 4 == 0 && @sel - 2 > -1 ||
  953.            (@sel - 2) % 4 == 0 && @sel - 3 > -1 ||
  954.            (@sel - 3) % 4 == 0 && @sel - 4 > -1
  955.           num = @inv.size
  956.           num += @inv.size % 4
  957.           for j in 0...12
  958.             Graphics.update
  959.             pbSEPlay(MOVE_SOUND) if j == 4
  960.             for i in 0...num
  961.               @sprites["box#{i}"].y += 3.66
  962.               if @inv[i]
  963.                 @sprites["dye#{i}"].y += 3.66
  964.                 @sprites["count#{i}"].y += 3.66
  965.               end
  966.             end
  967.           end
  968.           @sel -= 4
  969.         end
  970.       elsif @sel > -1
  971.         @sel -= 4
  972.         @box -= 4
  973.         play = true
  974.       end
  975.     end
  976.     if dir == :bottom
  977.       if @sel > -1
  978.         pbWait(1)
  979.         @last = [@sel,@box]
  980.         @sel = -1
  981.         @box = -1
  982.         @sprites["removedye"].bitmap = Bitmap.new("PR/Dye Selection/Resources/removeDye1")
  983.         @sprites["back"].bitmap = Bitmap.new("PR/Dye Selection/Resources/back2")
  984.         play = true
  985.       end
  986.     end
  987.     if @sel > -1
  988.       @sprites["box#{@sel}"].selected = true
  989.       if @inv[@sel]
  990.         @sprites["dye#{@sel}"].bitmap = Bitmap.new("PR/dyes2")
  991.         @sprites["dye#{@sel}"].src_rect.width = @sprites["dye#{@sel}"].bitmap.height
  992.         @sprites["dye#{@sel}"].src_rect.x = @sprites["dye#{@sel}"].bitmap.height * @inv[@sel].id
  993.         @sprites["count#{@sel}"].bitmap = Bitmap.new("PR/Dye Selection/Resources/#{@inv[@sel].stock}b")
  994.       end
  995.     end
  996.     pbSEPlay(MOVE_SOUND) if play
  997.   end
  998.  
  999.   def dispose
  1000.     for i in 0...12
  1001.       Graphics.update
  1002.       @sprites["bg"].opacity -= 32 if i > 3
  1003.       @sprites["label"].y -= @sprites["label"].bitmap.height / 12
  1004.       @sprites["back"].y += 1.916
  1005.       @sprites["removedye"].y += 1.916
  1006.       if i < 9
  1007.         @sprites["bar"].x -= 27.5
  1008.         @sprites["main"].x -= 27.5
  1009.         @sprites["outfit"].opacity -= 32
  1010.         num = @inv.size
  1011.         num += @inv.size % 4
  1012.         num = 12 if num < 12
  1013.         for j in 0...num
  1014.           @sprites["box#{j}"].opacity -= 32
  1015.           if @inv[j]
  1016.             @sprites["count#{j}"].opacity -= 32
  1017.             @sprites["dye#{j}"].opacity -= 32
  1018.           end
  1019.         end
  1020.       end
  1021.     end
  1022.     pbDisposeSpriteHash(@sprites)
  1023.     @viewport.dispose
  1024.     pbWait(1) if @directly
  1025.   end
  1026. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement