Guest User

Untitled

a guest
May 16th, 2018
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 69.22 KB | None | 0 0
  1. class PokemonBox
  2.   attr_reader :pokemon
  3.   attr_accessor :name
  4.   attr_accessor :background
  5.  
  6.   def initialize(name,maxPokemon=30)
  7.     @pokemon=[]
  8.     @name=name
  9.     @background=nil
  10.     for i in 0...maxPokemon
  11.       @pokemon[i]=nil
  12.     end
  13.   end
  14.  
  15.   def full?
  16.     return (@pokemon.nitems==self.length)
  17.   end
  18.  
  19.   def nitems
  20.     return @pokemon.nitems
  21.   end
  22.  
  23.   def length
  24.     return @pokemon.length
  25.   end
  26.  
  27.   def each
  28.     @pokemon.each{|item| yield item}
  29.   end
  30.  
  31.   def []=(i,value)
  32.     @pokemon[i]=value
  33.   end
  34.  
  35.   def [](i)
  36.     return @pokemon[i]
  37.   end
  38. end
  39.  
  40.  
  41.  
  42. class PokemonStorage
  43.   attr_reader :boxes
  44.   attr_reader :party
  45.   attr_accessor :currentBox
  46.  
  47.   def maxBoxes
  48.     return @boxes.length
  49.   end
  50.  
  51.   def party
  52.     $Trainer.party
  53.   end
  54.  
  55.   def party=(value)
  56.     raise ArgumentError.new("Not supported")
  57.   end
  58.  
  59.   MARKINGCHARS=["●","■","▲","♥"]
  60.  
  61.   def initialize(maxBoxes=40,maxPokemon=30)
  62.     @boxes=[]
  63.     for i in 0...maxBoxes
  64.       ip1=i+1
  65.       @boxes[i]=PokemonBox.new(_ISPRINTF("Box {1:d}",ip1),maxPokemon)
  66.       backid=i%16
  67.       @boxes[i].background="box#{backid}"
  68.     end
  69.     @currentBox=0
  70.     @boxmode=-1
  71.   end
  72.  
  73.   def maxPokemon(box)
  74.     return 0 if box>=self.maxBoxes
  75.     return box<0 ? 6 : self[box].length
  76.   end
  77.  
  78.   def [](x,y=nil)
  79.     if y==nil
  80.       return (x==-1) ? self.party : @boxes[x]
  81.     else
  82.       for i in @boxes
  83.         raise "Box is a Pokémon, not a box" if i.is_a?(PokeBattle_Pokemon)
  84.       end
  85.       return (x==-1) ? self.party[y] : @boxes[x][y]
  86.     end
  87.   end
  88.  
  89.   def []=(x,y,value)
  90.     if x==-1
  91.       self.party[y]=value
  92.     else
  93.       @boxes[x][y]=value
  94.     end
  95.   end
  96.  
  97.   def full?
  98.     for i in 0...self.maxBoxes
  99.       return false if !@boxes[i].full?
  100.     end
  101.     return true
  102.   end
  103.  
  104.   def pbFirstFreePos(box)
  105.     if box==-1
  106.       ret=self.party.nitems
  107.       return (ret==6) ? -1 : ret
  108.     else
  109.       for i in 0...maxPokemon(box)
  110.         return i if !self[box,i]
  111.       end
  112.       return -1
  113.     end
  114.   end
  115.  
  116.   def pbCopy(boxDst,indexDst,boxSrc,indexSrc)
  117.     if indexDst<0 && boxDst<self.maxBoxes
  118.       found=false
  119.       for i in 0...maxPokemon(boxDst)
  120.         if !self[boxDst,i]
  121.           found=true
  122.           indexDst=i
  123.           break
  124.         end
  125.       end
  126.       return false if !found
  127.     end
  128.     if boxDst==-1
  129.       if self.party.nitems>=6
  130.         return false
  131.       end
  132.       self.party[self.party.length]=self[boxSrc,indexSrc]
  133.       self.party.compact!
  134.     else
  135.       if !self[boxSrc,indexSrc]
  136.         raise "Trying to copy nil to storage" # not localized
  137.       end
  138.       self[boxDst,indexDst]=self[boxSrc,indexSrc]
  139.     end
  140.     return true
  141.   end
  142.  
  143.   def pbMoveCaughtToParty(pkmn)
  144.     if self.party.nitems>=6
  145.       return false
  146.     end
  147.     self.party[self.party.length]=pkmn
  148.   end
  149.  
  150.   def pbMoveCaughtToBox(pkmn,box)
  151.     for i in 0...maxPokemon(box)
  152.       if self[box,i]==nil
  153.         self[box,i]=pkmn
  154.         return true
  155.       end
  156.     end
  157.     return false
  158.   end
  159.  
  160.   def pbStoreCaught(pkmn)
  161.     for i in 0...maxPokemon(@currentBox)
  162.       if self[@currentBox,i]==nil
  163.         self[@currentBox,i]=pkmn
  164.         return @currentBox
  165.       end
  166.     end
  167.     for j in 0...self.maxBoxes
  168.       for i in 0...maxPokemon(j)
  169.         if self[j,i]==nil
  170.           self[j,i]=pkmn
  171.           @currentBox=j
  172.           return @currentBox
  173.         end
  174.       end
  175.     end
  176.     return -1
  177.   end
  178.  
  179.   def pbDelete(box,index)
  180.     if self[box,index]
  181.       self[box,index]=nil
  182.       if box==-1
  183.         self.party.compact!
  184.       end
  185.     end
  186.   end
  187.  
  188.   def pbMove(boxDst,indexDst,boxSrc,indexSrc)
  189.     return false if !pbCopy(boxDst,indexDst,boxSrc,indexSrc)
  190.     pbDelete(boxSrc,indexSrc)
  191.     return true
  192.   end
  193. end
  194.  
  195.  
  196.  
  197. class PokemonStorageWithParty < PokemonStorage
  198.   def party
  199.     return @party
  200.   end
  201.  
  202.   def party=(value)
  203.     @party=party
  204.   end
  205.  
  206.   def initialize(maxBoxes=40,maxPokemon=30,party=nil)
  207.     super(maxBoxes,maxPokemon)
  208.     if party
  209.       @party=party
  210.     else
  211.       @party=[]
  212.     end
  213.   end
  214. end
  215.  
  216.  
  217.  
  218. class PokemonStorageScreen
  219.   attr_reader :scene
  220.   attr_reader :storage
  221.  
  222.   def initialize(scene,storage)
  223.     @scene=scene
  224.     @storage=storage
  225.     @pbHeldPokemon=nil
  226.   end
  227.  
  228.   def pbConfirm(str)
  229.     return (pbShowCommands(str,[_INTL("Yes"),_INTL("No")])==0)
  230.   end
  231.  
  232.   def pbRelease(selected,heldpoke)
  233.     box=selected[0]
  234.     index=selected[1]
  235.     pokemon=(heldpoke)?heldpoke:@storage[box,index]
  236.     return if !pokemon
  237.     if pokemon.egg?
  238.       pbDisplay(_INTL("You can't release an Egg."))
  239.       return false
  240.     elsif pokemon.mail
  241.       pbDisplay(_INTL("Please remove the mail."))
  242.       return false
  243.     end
  244.     if box==-1 && pbAbleCount<=1 && pbAble?(pokemon) && !heldpoke
  245.       pbDisplay(_INTL("That's your last Pokémon!"))
  246.       return
  247.     end
  248.     command=pbShowCommands(_INTL("Release this Pokémon?"),[_INTL("No"),_INTL("Yes")])
  249.     if command==1
  250.       pkmnname=pokemon.name
  251.       @scene.pbRelease(selected,heldpoke)
  252.       if heldpoke
  253.         @heldpkmn=nil
  254.       else
  255.         @storage.pbDelete(box,index)
  256.       end
  257.       @scene.pbRefresh
  258.       pbDisplay(_INTL("{1} was released.",pkmnname))
  259.       pbDisplay(_INTL("Bye-bye, {1}!",pkmnname))
  260.       @scene.pbRefresh
  261.     end
  262.     return
  263.   end
  264.  
  265.   def pbMark(selected,heldpoke)
  266.     @scene.pbMark(selected,heldpoke)
  267.   end
  268.  
  269.   def pbAble?(pokemon)
  270.     pokemon && !pokemon.egg? && pokemon.hp>0
  271.   end
  272.  
  273.   def pbAbleCount
  274.     count=0
  275.     for p in @storage.party
  276.       count+=1 if pbAble?(p)
  277.     end
  278.     return count
  279.   end
  280.  
  281.   def pbStore(selected,heldpoke)
  282.     box=selected[0]
  283.     index=selected[1]
  284.     if box!=-1
  285.       raise _INTL("Can't deposit from box...")
  286.     end  
  287.     if pbAbleCount<=1 && pbAble?(@storage[box,index]) && !heldpoke
  288.       pbDisplay(_INTL("That's your last Pokémon!"))
  289.     elsif @storage[box,index].mail
  290.       pbDisplay(_INTL("Please remove the Mail."))
  291.     else
  292.       loop do
  293.         destbox=@scene.pbChooseBox(_INTL("Deposit in which Box?"))
  294.         if destbox>=0
  295.           success=false
  296.           firstfree=@storage.pbFirstFreePos(destbox)
  297.           if firstfree<0
  298.             pbDisplay(_INTL("The Box is full."))
  299.             next
  300.           end
  301.           @scene.pbStore(selected,heldpoke,destbox,firstfree)
  302.           if heldpoke
  303.             @storage.pbMoveCaughtToBox(heldpoke,destbox)
  304.             @heldpkmn=nil
  305.           else
  306.             @storage.pbMove(destbox,-1,-1,index)
  307.           end
  308.         end
  309.         break
  310.       end
  311.       @scene.pbRefresh
  312.     end
  313.   end
  314.  
  315.   def pbWithdraw(selected,heldpoke)
  316.     box=selected[0]
  317.     index=selected[1]
  318.     if box==-1
  319.       raise _INTL("Can't withdraw from party...");
  320.     end
  321.     if @storage.party.nitems>=6
  322.       pbDisplay(_INTL("Your party's full!"))
  323.       return false
  324.     end
  325.     @scene.pbWithdraw(selected,heldpoke,@storage.party.length)
  326.     if heldpoke
  327.       @storage.pbMoveCaughtToParty(heldpoke)
  328.       @heldpkmn=nil
  329.     else
  330.       @storage.pbMove(-1,-1,box,index)
  331.     end
  332.     @scene.pbRefresh
  333.     return true
  334.   end
  335.  
  336.   def pbDisplay(message)
  337.     @scene.pbDisplay(message)
  338.   end
  339.  
  340.   def pbSummary(selected,heldpoke)
  341.     @scene.pbSummary(selected,heldpoke)
  342.   end
  343.  
  344.   def pbHold(selected)
  345.     box=selected[0]
  346.     index=selected[1]
  347.     if box==-1 && pbAble?(@storage[box,index]) && pbAbleCount<=1
  348.       pbDisplay(_INTL("That's your last Pokémon!"))
  349.       return
  350.     end
  351.     @scene.pbHold(selected)
  352.     @heldpkmn=@storage[box,index]
  353.     @storage.pbDelete(box,index)
  354.     @scene.pbRefresh
  355.   end
  356.  
  357.   def pbSwap(selected)
  358.     box=selected[0]
  359.     index=selected[1]
  360.     if !@storage[box,index]
  361.       raise _INTL("Position {1},{2} is empty...",box,index)
  362.     end
  363.     if box==-1 && pbAble?(@storage[box,index]) && pbAbleCount<=1 && !pbAble?(@heldpkmn)
  364.       pbDisplay(_INTL("That's your last Pokémon!"))
  365.       return false
  366.     end
  367.     if box!=-1 && @heldpkmn.mail
  368.       pbDisplay("Please remove the mail.")
  369.       return false
  370.     end
  371.     @scene.pbSwap(selected,@heldpkmn)
  372.     tmp=@storage[box,index]
  373.     @storage[box,index]=@heldpkmn
  374.     @heldpkmn=tmp
  375.     @scene.pbRefresh
  376.     return true
  377.   end
  378.  
  379.   def pbPlace(selected)
  380.     box=selected[0]
  381.     index=selected[1]
  382.     if @storage[box,index]
  383.       raise _INTL("Position {1},{2} is not empty...",box,index)
  384.     end
  385.     if box!=-1 && index>=@storage.maxPokemon(box)
  386.       pbDisplay("Can't place that there.")
  387.       return
  388.     end
  389.     if box!=-1 && @heldpkmn.mail
  390.       pbDisplay("Please remove the mail.")
  391.       return
  392.     end
  393.     @scene.pbPlace(selected,@heldpkmn)
  394.     @storage[box,index]=@heldpkmn
  395.     if box==-1
  396.       @storage.party.compact!
  397.     end
  398.     @scene.pbRefresh
  399.     @heldpkmn=nil
  400.   end
  401.  
  402.   def pbItem(selected,heldpoke)
  403.     box=selected[0]
  404.     index=selected[1]
  405.     pokemon=(heldpoke) ? heldpoke : @storage[box,index]
  406.     if pokemon.egg?
  407.       pbDisplay(_INTL("Eggs can't hold items."))
  408.       return
  409.     elsif pokemon.mail
  410.       pbDisplay(_INTL("Please remove the mail."))
  411.       return
  412.     end
  413.     if pokemon.item>0
  414.       itemname=PBItems.getName(pokemon.item)
  415.       if pbConfirm(_INTL("Take this {1}?",itemname))
  416.         if !$PokemonBag.pbStoreItem(pokemon.item)
  417.           pbDisplay(_INTL("Can't store the {1}.",itemname))
  418.         else
  419.           pbDisplay(_INTL("Took the {1}.",itemname))
  420.           pokemon.item=0
  421.         end
  422.       end
  423.     else
  424.       item=scene.pbChooseItem($PokemonBag)
  425.       if item>0
  426.         itemname=PBItems.getName(item)
  427.         pokemon.item=item
  428.         $PokemonBag.pbDeleteItem(item)
  429.         pbDisplay(_INTL("{1} is now being held.",itemname))
  430.       end
  431.     end
  432.   end
  433.  
  434.   def pbHeldPokemon
  435.     return @heldpkmn
  436.   end
  437.  
  438. =begin
  439.   commands=[
  440.      _INTL("WITHDRAW POKéMON"),
  441.      _INTL("DEPOSIT POKéMON"),
  442.      _INTL("MOVE POKéMON"),
  443.      _INTL("MOVE ITEMS"),
  444.      _INTL("SEE YA!")
  445.   ]
  446.   helptext=[
  447.      _INTL("Move Pokémon stored in boxes to your party."),
  448.      _INTL("Store Pokémon in your party in Boxes."),
  449.      _INTL("Organize the Pokémon in Boxes and in your party."),
  450.      _INTL("Move items held by any Pokémon in a Box and your party."),
  451.      _INTL("Return to the previous menu."),
  452.   ]
  453.   command=pbShowCommandsAndHelp(commands,helptext)
  454. =end
  455.  
  456.   def pbShowCommands(msg,commands)
  457.     return @scene.pbShowCommands(msg,commands)
  458.   end
  459.  
  460.   def pbBoxCommands
  461.     commands=[
  462.        _INTL("Jump"),
  463.        _INTL("Wallpaper"),
  464.        _INTL("Name"),
  465.        _INTL("Cancel"),
  466.     ]
  467.     command=pbShowCommands(
  468.        _INTL("What do you want to do?"),commands)
  469.     case command
  470.       when 0
  471.         destbox=@scene.pbChooseBox(_INTL("Jump to which Box?"))
  472.         if destbox>=0
  473.           @scene.pbJumpToBox(destbox)
  474.         end
  475.       when 1
  476.         commands=[
  477.            _INTL("Forest"),
  478.            _INTL("City"),
  479.            _INTL("Desert"),
  480.            _INTL("Savanna"),
  481.            _INTL("Crag"),
  482.            _INTL("Volcano"),
  483.            _INTL("Snow"),
  484.            _INTL("Cave"),
  485.            _INTL("Beach"),
  486.            _INTL("Seafloor"),
  487.            _INTL("River"),
  488.            _INTL("Sky"),
  489.            _INTL("Stars"),
  490.            _INTL("Poké Center"),
  491.            _INTL("Tiles"),
  492.            _INTL("Simple")
  493.         ]
  494.         wpaper=pbShowCommands(_INTL("Pick the wallpaper."),commands)
  495.         if wpaper>=0
  496.           @scene.pbChangeBackground(wpaper)
  497.         end
  498.       when 2
  499.         @scene.pbBoxName(_INTL("Box name?"),0,12)
  500.     end
  501.   end
  502.  
  503.   def pbChoosePokemon(party=nil)
  504.     @heldpkmn=nil
  505.     @scene.pbStartBox(self,2)
  506.     retval=nil
  507.     loop do
  508.       selected=@scene.pbSelectBox(@storage.party)
  509.       if selected && selected[0]==-3 # Close box
  510.         if !pbConfirm(_INTL("Exit from the Box?"))
  511.           next
  512.         else
  513.           break
  514.         end
  515.       end
  516.       if selected==nil
  517.         if pbConfirm(_INTL("Continue Box operations?"))
  518.           next
  519.         else
  520.           break
  521.         end
  522.       elsif selected[0]==-4 # Box name
  523.         pbBoxCommands
  524.       else
  525.         pokemon=@storage[selected[0],selected[1]]
  526.         commands=[
  527.            _INTL("Select"),
  528.            _INTL("Summary"),
  529.            _INTL("Withdraw"),
  530.            _INTL("Item"),
  531.            _INTL("Mark")
  532.         ]
  533.         commands.push(_INTL("Cancel"))
  534.         if selected[0]==-1
  535.           commands[2]=_INTL("Store")
  536.         else
  537.           commands[2]=_INTL("Withdraw")
  538.         end
  539.         helptext=_INTL("{1} is selected.",pokemon.name)
  540.         command=pbShowCommands(helptext,commands)
  541.         case command
  542.           when 0 # Move/Shift/Place
  543.             if pokemon
  544.               retval=selected
  545.               break
  546.             end
  547.           when 1 # Summary
  548.             pbSummary(selected,nil)
  549.           when 2 # Withdraw
  550.             if selected[0]==-1
  551.               pbStore(selected,nil)
  552.             else
  553.               pbWithdraw(selected,nil)
  554.             end
  555.           when 3 # Item
  556.             pbItem(selected,nil)
  557.           when 4 # Mark
  558.             pbMark(selected,nil)
  559.         end
  560.       end
  561.     end
  562.     @scene.pbCloseBox
  563.     return retval
  564.   end
  565.  
  566.   def pbStartScreen(command)
  567.     @heldpkmn=nil
  568.     if command==0
  569. ### WITHDRAW ###################################################################
  570.       @scene.pbStartBox(self,command)
  571.       loop do
  572.         selected=@scene.pbSelectBox(@storage.party)
  573.         if selected && selected[0]==-3 # Close box
  574.           if !pbConfirm(_INTL("Exit from the Box?"))
  575.             next
  576.           else
  577.             break
  578.           end
  579.         end
  580.         if selected && selected[0]==-2 # Party Pokémon
  581.           pbDisplay(_INTL("Which one will you take?"))
  582.           next
  583.         end
  584.         if selected && selected[0]==-4 # Box name
  585.           pbBoxCommands
  586.           next
  587.         end
  588.         if selected==nil
  589.           if pbConfirm(_INTL("Continue Box operations?"))
  590.             next
  591.           else
  592.             break
  593.           end
  594.         else
  595.           pokemon=@storage[selected[0],selected[1]]
  596.           next if !pokemon
  597.           command=pbShowCommands(
  598.              _INTL("{1} is selected.",pokemon.name),[_INTL("Withdraw"),
  599.              _INTL("Summary"),_INTL("Mark"),_INTL("Release"),_INTL("Cancel")])
  600.           case command
  601.             when 0 # Withdraw
  602.               pbWithdraw(selected,nil)
  603.             when 1 # Summary
  604.               pbSummary(selected,nil)
  605.             when 2 # Mark
  606.               pbMark(selected,nil)
  607.             when 3 # Release
  608.               pbRelease(selected,nil)
  609.           end
  610.         end
  611.       end
  612.       @scene.pbCloseBox
  613.     elsif command==1
  614. ### DEPOSIT ####################################################################
  615.       @scene.pbStartBox(self,command)
  616.       loop do
  617.         selected=@scene.pbSelectParty(@storage.party)
  618.         if selected==-3 # Close box
  619.           if !pbConfirm(_INTL("Exit from the Box?"))
  620.             next
  621.           else
  622.             break
  623.           end
  624.         end
  625.         if selected<0
  626.           if pbConfirm(_INTL("Continue Box operations?"))
  627.             next
  628.           else
  629.             break
  630.           end
  631.         else
  632.           pokemon=@storage[-1,selected]
  633.           next if !pokemon
  634.           command=pbShowCommands(
  635.              _INTL("{1} is selected.",pokemon.name),[_INTL("Store"),
  636.              _INTL("Summary"),_INTL("Mark"),_INTL("Release"),_INTL("Cancel")])
  637.           case command
  638.             when 0 # Store
  639.               pbStore([-1,selected],nil)
  640.             when 1 # Summary
  641.               pbSummary([-1,selected],nil)
  642.             when 2 # Mark
  643.               pbMark([-1,selected],nil)
  644.             when 3 # Release
  645.               pbRelease([-1,selected],nil)
  646.           end
  647.         end
  648.       end
  649.       @scene.pbCloseBox
  650.     elsif command==2
  651. ### MOVE #######################################################################
  652.       @scene.pbStartBox(self,command)
  653.       loop do
  654.         selected=@scene.pbSelectBox(@storage.party)
  655.         if selected && selected[0]==-3 # Close box
  656.           if pbHeldPokemon
  657.             pbDisplay(_INTL("You're holding a Pokémon!"))
  658.             next
  659.           end
  660.           if !pbConfirm(_INTL("Exit from the Box?"))
  661.             next
  662.           else
  663.             break
  664.           end
  665.         end
  666.         if selected==nil
  667.           if pbHeldPokemon
  668.             pbDisplay(_INTL("You're holding a Pokémon!"))
  669.             next
  670.           end
  671.           if pbConfirm(_INTL("Continue Box operations?"))
  672.             next
  673.           else
  674.             break
  675.           end
  676.         elsif selected[0]==-4 # Box name
  677.           pbBoxCommands
  678.         else
  679.           pokemon=@storage[selected[0],selected[1]]
  680.           commands=[
  681.              _INTL("Move"),
  682.              _INTL("Summary"),
  683.              _INTL("Withdraw"),
  684.              _INTL("Item"),
  685.              _INTL("Mark"),
  686.              _INTL("Release")
  687.           ]
  688.           if $DEBUG
  689.             commands.push(_INTL("Debug"))
  690.           end
  691.           commands.push(_INTL("Cancel"))
  692.           heldpoke=pbHeldPokemon
  693.           if heldpoke
  694.             helptext=_INTL("{1} is selected.",heldpoke.name)
  695.             commands[0]=pokemon ? _INTL("Shift") : _INTL("Place")
  696.           elsif pokemon
  697.             helptext=_INTL("{1} is selected.",pokemon.name)
  698.             commands[0]=_INTL("Move")
  699.           else
  700.             next
  701.           end
  702.           if selected[0]==-1
  703.             commands[2]=_INTL("Store")
  704.           else
  705.             commands[2]=_INTL("Withdraw")
  706.           end
  707.           command=pbShowCommands(helptext,commands)
  708.           case command
  709.             when 0 # Move/Shift/Place
  710.               if @heldpkmn && pokemon
  711.                 pbSwap(selected)
  712.               elsif @heldpkmn
  713.                 pbPlace(selected)
  714.               else
  715.                 pbHold(selected)
  716.               end
  717.             when 1 # Summary
  718.               pbSummary(selected,@heldpkmn)
  719.             when 2 # Withdraw
  720.               if selected[0]==-1
  721.                 pbStore(selected,@heldpkmn)
  722.               else
  723.                 pbWithdraw(selected,@heldpkmn)
  724.               end
  725.             when 3 # Item
  726.               pbItem(selected,@heldpkmn)
  727.             when 4 # Mark
  728.               pbMark(selected,@heldpkmn)
  729.             when 5 # Release
  730.               pbRelease(selected,@heldpkmn)
  731.             when 6
  732.               if $DEBUG
  733.                 pkmn=@heldpkmn ? @heldpkmn : pokemon
  734.                 command=@scene.pbShowCommands(_INTL("{1} is selected.",pkmn.name),[
  735.                    _INTL("Set Level"),
  736.                    _INTL("Set Species"),
  737.                    _INTL("Set Nature"),
  738.                    _INTL("Set Gender"),
  739.                    _INTL("Set Ability"),
  740.                    _INTL("Change Form"),
  741.                    _INTL("Teach Move"),
  742.                    _INTL("Duplicate"),
  743.                    _INTL("Delete"),
  744.                    _INTL("Show Values"),
  745.                    _INTL("Cheat Codes"),
  746.                    _INTL("Cancel")
  747.                 ])
  748.                 case command
  749.                   when 0 # Set Level
  750.                     params=ChooseNumberParams.new
  751.                     params.setRange(1,PBExperience::MAXLEVEL)
  752.                     params.setDefaultValue(pkmn.level)
  753.                     level=Kernel.pbMessageChooseNumber(
  754.                        _INTL("Set the Pokémon's level."),params)
  755.                     if level!=pkmn.level
  756.                       pkmn.level=level
  757.                       pkmn.calcStats
  758.                       pbDisplay(_INTL("{1}'s level was set to {2}.",pkmn.name,pkmn.level))
  759.                     end
  760.                     @scene.pbHardRefresh
  761.                   when 1 # Set Species
  762.                     species=pbChooseSpecies(pkmn.species)
  763.                     if species!=0
  764.                       oldspeciesname=PBSpecies.getName(pkmn.species)
  765.                       pkmn.species=species
  766.                       pkmn.calcStats
  767.                       oldname=pkmn.name
  768.                       pkmn.name=PBSpecies.getName(pkmn.species) if pkmn.name==oldspeciesname
  769.                       pbDisplay(_INTL("{1}'s species was changed to {2}.",oldname,PBSpecies.getName(pkmn.species)))
  770.                     end
  771.                     @scene.pbHardRefresh
  772.                   when 2 # Set Nature
  773.                     commands=[]
  774.                     25.times do |i|
  775.                       commands.push(PBNatures.getName(i))
  776.                     end
  777.                     command=pbShowCommands(_INTL("Choose a nature."),commands)
  778.                     if command>=0
  779.                       oldgender=pkmn.gender
  780.                       2000.times do
  781.                         pkmn.personalID&=0xFFFF0000
  782.                         pkmn.personalID|=rand(65536)
  783.                         pkmn.personalID-=pkmn.personalID%25
  784.                         pkmn.personalID+=command
  785.                         break if pkmn.gender==oldgender
  786.                       end
  787.                       pkmn.calcStats
  788.                       if pkmn.nature!=command
  789.                         pbDisplay(_INTL("The Pokémon's nature couldn't be changed."))
  790.                       else
  791.                         pbDisplay(_INTL("The Pokémon's nature was changed."))
  792.                       end
  793.                     end
  794.                     @scene.pbHardRefresh
  795.                   when 3 # Set Gender
  796.                     if pkmn.gender==2
  797.                       pbDisplay(_INTL("This Pokémon's gender can't be set."))
  798.                     elsif pkmn.gender==0
  799.                       if pbConfirm(_INTL("Make this Pokémon female?"))
  800.                         oldnature=pkmn.nature
  801.                         2000.times do
  802.                           pkmn.setGender(true)
  803.                           break if pkmn.nature==oldnature
  804.                         end
  805.                         if pkmn.gender==0
  806.                           pbDisplay(_INTL("The Pokémon's gender couldn't be changed."))
  807.                         else
  808.                           pbDisplay(_INTL("The Pokémon's gender was changed."))
  809.                         end
  810.                       end
  811.                     elsif pkmn.gender==1
  812.                       if pbConfirm(_INTL("Make this Pokémon male?"))
  813.                         oldnature=pkmn.nature
  814.                         2000.times do
  815.                           pkmn.setGender(false)
  816.                           break if pkmn.nature==oldnature
  817.                         end
  818.                         if pkmn.gender==1
  819.                           pbDisplay(_INTL("The Pokémon's gender couldn't be changed."))
  820.                         else
  821.                           pbDisplay(_INTL("The Pokémon's gender was changed."))
  822.                         end
  823.                       end
  824.                       @scene.pbHardRefresh
  825.                     end
  826.                   when 4 # Set Ability Flag
  827.                     params=ChooseNumberParams.new
  828.                     params.setRange(0,2)
  829.                     params.setDefaultValue(pkmn.abilityflag)
  830.                     f=Kernel.pbMessageChooseNumber(
  831.                        _INTL("Set the Pokémon's ability flag."),params)
  832.                     if f!=pkmn.abilityflag
  833.                       pkmn.abilityflag=f
  834.                     end
  835.                   when 5 # Change Form
  836.                     params=ChooseNumberParams.new
  837.                     params.setRange(0,18)
  838.                     params.setDefaultValue(pkmn.form)
  839.                     f=Kernel.pbMessageChooseNumber(
  840.                        _INTL("Set the Pokémon's form."),params)
  841.                     if f!=pkmn.form
  842.                       pkmn.form=f
  843.                     end
  844.                     @scene.pbHardRefresh
  845.                   when 6 # Teach Move
  846.                     move=pbChooseMoveList
  847.                     if move!=0
  848.                       pbLearnMove(pkmn,move)
  849.                     end
  850.                   when 7 # Duplicate
  851.                     clonedpkmn=pkmn.clone
  852.                     clonedpkmn.iv=pkmn.iv.clone
  853.                     clonedpkmn.ev=pkmn.ev.clone
  854.                     if @storage.pbMoveCaughtToParty(clonedpkmn)
  855.                       if selected[0]!=-1
  856.                         pbDisplay(_INTL("The duplicated Pokémon was moved to your party."))
  857.                       end
  858.                     else
  859.                       oldbox=@storage.currentBox
  860.                       newbox=@storage.pbStoreCaught(clonedpkmn)
  861.                       if newbox<0
  862.                         pbDisplay(_INTL("All boxes are full."))
  863.                       elsif newbox!=oldbox
  864.                         pbDisplay(_INTL("The duplicated Pokémon was moved to box \"{1}.\"",
  865.                            @storage[newbox].name))
  866.                         @storage.currentBox=oldbox
  867.                       end
  868.                     end
  869.                     @scene.pbHardRefresh
  870.                   when 8 # Delete
  871.                     if pbConfirm(_INTL("Are you sure you want to delete this Pokémon?"))
  872.                       @scene.pbRelease(selected,heldpoke)
  873.                       if heldpoke
  874.                         @heldpkmn=nil
  875.                       else
  876.                         @storage.pbDelete(selected[0],selected[1])
  877.                       end
  878.                       @scene.pbRefresh
  879.                       pbDisplay(_INTL("The Pokémon was deleted."))
  880.                     end
  881.                   when 9 # Show Values
  882.                     pbDisplay(_INTL("Individual Values (Sp.Def last):\r\n{1}, {2}, {3}, {4}, {5}, {6}",
  883.                        pkmn.iv[0],pkmn.iv[1],pkmn.iv[2],pkmn.iv[3],pkmn.iv[4],pkmn.iv[5]))
  884.                     pbDisplay(_INTL("Effort Values (Sp.Def last):\r\n{1}, {2}, {3}, {4}, {5}, {6}",
  885.                        pkmn.ev[0],pkmn.ev[1],pkmn.ev[2],pkmn.ev[3],pkmn.ev[4],pkmn.ev[5]))
  886.                     persid=sprintf("0x%08X",pkmn.personalID)
  887.                     pbDisplay(_INTL("Personal ID: {1}\r\nHappiness: {2}",persid,pkmn.happiness))
  888.                   when 10 # Cheat Codes
  889.                     pbGenCodes(pkmn,"codes.txt")
  890.                     pbDisplay(_INTL("Codes for this Pokémon were saved in codes.txt."))
  891.                 end
  892.               else
  893.                 break
  894.               end
  895.           end
  896.         end
  897.       end
  898.       @scene.pbCloseBox
  899.     elsif command==3
  900.       @scene.pbStartBox(self,command)
  901.       @scene.pbCloseBox
  902.     end
  903.   end
  904.  
  905.   def selectPokemon(index)
  906.     pokemon=@storage[@currentbox,index]
  907.     if !pokemon
  908.       return nil
  909.     end
  910.   end
  911. end
  912.  
  913.  
  914.  
  915. class Interpolator
  916.   ZOOM_X=1
  917.   ZOOM_Y=2
  918.   X=3
  919.   Y=4
  920.   OPACITY=5
  921.   COLOR=6
  922.   WAIT=7
  923.  
  924.   def initialize
  925.     @tweening=false
  926.     @tweensteps=[]
  927.     @sprite=nil
  928.     @frames=0
  929.     @step=0
  930.   end
  931.  
  932.   def tweening?
  933.     return @tweening
  934.   end
  935.  
  936.   def tween(sprite,items,frames)
  937.     @tweensteps=[]
  938.     if sprite && !sprite.disposed? && frames>0
  939.       @frames=frames
  940.       @step=0
  941.       @sprite=sprite
  942.       for item in items
  943.         case item[0]
  944.           when ZOOM_X
  945.             @tweensteps[item[0]]=[sprite.zoom_x,item[1]-sprite.zoom_x]
  946.           when ZOOM_Y
  947.             @tweensteps[item[0]]=[sprite.zoom_y,item[1]-sprite.zoom_y]
  948.           when X
  949.             @tweensteps[item[0]]=[sprite.x,item[1]-sprite.x]
  950.           when Y
  951.             @tweensteps[item[0]]=[sprite.y,item[1]-sprite.y]
  952.           when OPACITY
  953.             @tweensteps[item[0]]=[sprite.opacity,item[1]-sprite.opacity]
  954.           when COLOR
  955.             @tweensteps[item[0]]=[sprite.color.clone,Color.new(
  956.                item[1].red-sprite.color.red,
  957.                item[1].green-sprite.color.green,
  958.                item[1].blue-sprite.color.blue,
  959.                item[1].alpha-sprite.color.alpha
  960.             )]
  961.         end
  962.       end
  963.       @tweening=true
  964.     end
  965.   end
  966.  
  967.   def update
  968.     if @tweening
  969.       t=(@step*1.0)/@frames
  970.       for i in 0...@tweensteps.length
  971.         item=@tweensteps[i]
  972.         next if !item
  973.         case i
  974.           when ZOOM_X
  975.             @sprite.zoom_x=item[0]+item[1]*t
  976.           when ZOOM_Y
  977.             @sprite.zoom_y=item[0]+item[1]*t
  978.           when X
  979.             @sprite.x=item[0]+item[1]*t
  980.           when Y
  981.             @sprite.y=item[0]+item[1]*t
  982.           when OPACITY
  983.             @sprite.opacity=item[0]+item[1]*t
  984.           when COLOR
  985.             @sprite.color=Color.new(
  986.                item[0].red+item[1].red*t,
  987.                item[0].green+item[1].green*t,
  988.                item[0].blue+item[1].blue*t,
  989.                item[0].alpha+item[1].alpha*t
  990.             )
  991.         end
  992.       end
  993.       @step+=1
  994.       if @step==@frames
  995.         @step=0
  996.         @frames=0
  997.         @tweening=false
  998.       end
  999.     end
  1000.   end
  1001. end
  1002.  
  1003.  
  1004.  
  1005. class PokemonBoxIcon < IconSprite
  1006.   def initialize(pokemon,viewport=nil)
  1007.     super(0,0,viewport)
  1008.     @release=Interpolator.new
  1009.     @startRelease=false
  1010.     @pokemon=pokemon
  1011.     if pokemon
  1012.       self.setBitmap(pbPokemonIconFile(pokemon))
  1013.     end
  1014.     self.src_rect=Rect.new(0,0,64,64)
  1015.   end
  1016.  
  1017.   def release
  1018.     self.ox=32
  1019.     self.oy=32
  1020.     self.x+=32
  1021.     self.y+=32
  1022.     @release.tween(self,[
  1023.        [Interpolator::ZOOM_X,0],
  1024.        [Interpolator::ZOOM_Y,0],
  1025.        [Interpolator::OPACITY,0]
  1026.     ],100)
  1027.     @startRelease=true
  1028.   end
  1029.  
  1030.   def releasing?
  1031.     return @release.tweening?
  1032.   end
  1033.  
  1034.   def update
  1035.     super
  1036.     @release.update
  1037.     if (@pokemon.isShadow? rescue false)
  1038.       self.color=Color.new(192,0,255,128)
  1039.     else
  1040.       self.color=Color.new(0,0,0,0)
  1041.     end
  1042.     dispose if @startRelease && !releasing?
  1043.   end
  1044. end
  1045.  
  1046.  
  1047.  
  1048. class PokemonBoxArrow < SpriteWrapper
  1049.   def initialize(viewport=nil)
  1050.     super(viewport)
  1051.     @frame=0
  1052.     @holding=false
  1053.     @updating=false
  1054.     @grabbingState=0
  1055.     @placingState=0
  1056.     @heldpkmn=nil
  1057.     @swapsprite=nil
  1058.     @fist=AnimatedBitmap.new("Graphics/Pictures/boxfist")
  1059.     @point1=AnimatedBitmap.new("Graphics/Pictures/boxpoint1")
  1060.     @point2=AnimatedBitmap.new("Graphics/Pictures/boxpoint2")
  1061.     @grab=AnimatedBitmap.new("Graphics/Pictures/boxgrab")
  1062.     @currentBitmap=@fist
  1063.     @spriteX=self.x
  1064.     @spriteY=self.y
  1065.     self.bitmap=@currentBitmap.bitmap
  1066.   end
  1067.  
  1068.   def heldPokemon
  1069.     @heldpkmn=nil if @heldpkmn && @heldpkmn.disposed?
  1070.     @holding=false if !@heldpkmn
  1071.     return @heldpkmn
  1072.   end
  1073.  
  1074.   def visible=(value)
  1075.     super
  1076.     sprite=heldPokemon
  1077.     sprite.visible=value if sprite
  1078.   end
  1079.  
  1080.   def color=(value)
  1081.     super
  1082.     sprite=heldPokemon
  1083.     sprite.color=value if sprite
  1084.   end
  1085.  
  1086.   def dispose
  1087.     @fist.dispose
  1088.     @point1.dispose
  1089.     @point2.dispose
  1090.     @grab.dispose
  1091.     @heldpkmn.dispose if @heldpkmn
  1092.     super
  1093.   end
  1094.  
  1095.   def holding?
  1096.     return self.heldPokemon && @holding
  1097.   end
  1098.  
  1099.   def grabbing?
  1100.     return @grabbingState>0
  1101.   end
  1102.  
  1103.   def placing?
  1104.     return @placingState>0
  1105.   end
  1106.  
  1107.   def x=(value)
  1108.     super
  1109.     @spriteX=x if !@updating
  1110.     heldPokemon.x=self.x if holding?
  1111.   end
  1112.  
  1113.   def y=(value)
  1114.     super
  1115.     @spriteY=y if !@updating
  1116.     heldPokemon.y=self.y+8 if holding?
  1117.   end
  1118.  
  1119.   def setSprite(sprite)
  1120.     if holding?
  1121.       @heldpkmn=sprite
  1122.       @heldpkmn.viewport=self.viewport if @heldpkmn
  1123.       @heldpkmn.z=1 if @heldpkmn
  1124.       @holding=false if !@heldpkmn
  1125.       self.z=2
  1126.     end
  1127.   end
  1128.  
  1129.   def deleteSprite
  1130.     @holding=false
  1131.     if @heldpkmn
  1132.       @heldpkmn.dispose
  1133.       @heldpkmn=nil
  1134.     end
  1135.   end
  1136.  
  1137.   def grab(sprite)
  1138.     @grabbingState=1
  1139.     @heldpkmn=sprite
  1140.     @heldpkmn.viewport=self.viewport
  1141.     @heldpkmn.z=1
  1142.     self.z=2
  1143.   end
  1144.  
  1145.   def place
  1146.     @placingState=1
  1147.   end
  1148.  
  1149.   def release
  1150.     if @heldpkmn
  1151.       @heldpkmn.release
  1152.     end
  1153.   end
  1154.  
  1155.   def update
  1156.     @updating=true
  1157.     super
  1158.     heldpkmn=heldPokemon
  1159.     heldpkmn.update if heldpkmn
  1160.     @fist.update
  1161.     @point2.update
  1162.     @point1.update
  1163.     @grab.update
  1164.     self.bitmap=@currentBitmap.bitmap
  1165.     @holding=false if !heldpkmn
  1166.     if @grabbingState>0
  1167.       if @grabbingState<=8
  1168.         @currentBitmap=@grab
  1169.         self.bitmap=@currentBitmap.bitmap
  1170.         self.y=@spriteY+(@grabbingState)*2
  1171.         @grabbingState+=1
  1172.       elsif @grabbingState<=16
  1173.         @holding=true
  1174.         @currentBitmap=@fist
  1175.         self.bitmap=@currentBitmap.bitmap
  1176.         self.y=@spriteY+(16-@grabbingState)*2
  1177.         @grabbingState+=1
  1178.       else
  1179.         @grabbingState=0
  1180.       end
  1181.     elsif @placingState>0
  1182.       if @placingState<=8
  1183.         @currentBitmap=@fist
  1184.         self.bitmap=@currentBitmap.bitmap
  1185.         self.y=@spriteY+(@placingState)*2
  1186.         @placingState+=1
  1187.       elsif @placingState<=16
  1188.         @holding=false
  1189.         @heldpkmn=nil
  1190.         @currentBitmap=@grab
  1191.         self.bitmap=@currentBitmap.bitmap
  1192.         self.y=@spriteY+(16-@placingState)*2
  1193.         @placingState+=1
  1194.       else
  1195.         @placingState=0
  1196.       end
  1197.     elsif holding?
  1198.       @currentBitmap=@fist
  1199.       self.bitmap=@currentBitmap.bitmap
  1200.     else
  1201.       self.x=@spriteX
  1202.       self.y=@spriteY
  1203.       if (@frame/20)==1
  1204.         @currentBitmap=@point2
  1205.         self.bitmap=@currentBitmap.bitmap
  1206.       else
  1207.         @currentBitmap=@point1
  1208.         self.bitmap=@currentBitmap.bitmap
  1209.       end
  1210.     end
  1211.     @frame+=1
  1212.     @frame=0 if @frame==40
  1213.     @updating=false
  1214.   end
  1215. end
  1216.  
  1217.  
  1218.  
  1219. class PokemonBoxPartySprite < SpriteWrapper
  1220.   def deletePokemon(index)
  1221.     @pokemonsprites[index].dispose
  1222.     @pokemonsprites[index]=nil
  1223.     @pokemonsprites.compact!
  1224.     refresh
  1225.   end
  1226.  
  1227.   def getPokemon(index)
  1228.     return @pokemonsprites[index]
  1229.   end
  1230.  
  1231.   def setPokemon(index,sprite)
  1232.     @pokemonsprites[index]=sprite
  1233.     @pokemonsprites.compact!
  1234.     refresh
  1235.   end
  1236.  
  1237.   def grabPokemon(index,arrow)
  1238.     sprite=@pokemonsprites[index]
  1239.     if sprite
  1240.       arrow.grab(sprite)
  1241.       @pokemonsprites[index]=nil
  1242.       @pokemonsprites.compact!
  1243.       refresh
  1244.     end
  1245.   end
  1246.  
  1247.   def x=(value)
  1248.     super
  1249.     refresh
  1250.   end
  1251.  
  1252.   def y=(value)
  1253.     super
  1254.     refresh
  1255.   end
  1256.  
  1257.   def color=(value)
  1258.     super
  1259.     for i in 0...6
  1260.       if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1261.         @pokemonsprites[i].color=pbSrcOver(@pokemonsprites[i].color,value)
  1262.       end
  1263.     end
  1264.     refresh
  1265.   end
  1266.  
  1267.   def visible=(value)
  1268.     super
  1269.     for i in 0...6
  1270.       if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1271.         @pokemonsprites[i].visible=value
  1272.       end
  1273.     end
  1274.     refresh
  1275.   end
  1276.  
  1277.   def initialize(party,viewport=nil)
  1278.     super(viewport)
  1279.     @boxspace=AnimatedBitmap.new("Graphics/Pictures/boxparty")
  1280.     @boxbitmap=AnimatedBitmap.new("Graphics/Pictures/boxpartytab")
  1281.     @pokemonsprites=[]
  1282.     @party=party
  1283.     for i in 0...6
  1284.       @pokemonsprites[i]=nil
  1285.       pokemon=@party[i]
  1286.       if pokemon
  1287.         @pokemonsprites[i]=PokemonBoxIcon.new(pokemon,viewport)
  1288.       end
  1289.     end
  1290.     @contents=BitmapWrapper.new(192,352)
  1291.     self.bitmap=@contents
  1292.     self.x=160
  1293.     self.y=0
  1294.     refresh
  1295.   end
  1296.  
  1297.   def dispose
  1298.     for i in 0...6
  1299.       @pokemonsprites[i].dispose if @pokemonsprites[i]
  1300.     end
  1301.     @contents.dispose
  1302.     @boxbitmap.dispose
  1303.     super
  1304.   end
  1305.  
  1306.   def refresh
  1307.     @contents.blt(0,0,@boxbitmap.bitmap,Rect.new(0,0,192,352))
  1308.     xvalues=[88*2,136*2,136*2,136*2,136*2,136*2]
  1309.     yvalues=[48*2,0,48,96,144,192]
  1310.     for j in 0...6
  1311.       @pokemonsprites[j]=nil if @pokemonsprites[j] && @pokemonsprites[j].disposed?
  1312.     end
  1313.     @pokemonsprites.compact!
  1314.     for j in 0...6
  1315.       sprite=@pokemonsprites[j]
  1316.       if sprite && !sprite.disposed?
  1317.         sprite.viewport=self.viewport
  1318.         sprite.z=0
  1319.         sprite.x=self.x+xvalues[j]-160
  1320.         sprite.y=self.y+yvalues[j]
  1321.       end
  1322.       if @party[j]
  1323.         @contents.blt(xvalues[j]-158,yvalues[j]+16,
  1324.            @boxspace.bitmap,Rect.new(0,0,@boxspace.width,@boxspace.height))
  1325.       end
  1326.     end
  1327.   end
  1328.  
  1329.   def update
  1330.     super
  1331.     for i in 0...6
  1332.       if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1333.         @pokemonsprites[i].update
  1334.       end
  1335.     end
  1336.   end
  1337. end
  1338.  
  1339.  
  1340.  
  1341. class MosaicPokemonSprite < PokemonSprite
  1342.   def initialize(*args)
  1343.     super(*args)
  1344.     @mosaic=0
  1345.     @inrefresh=false
  1346.     @mosaicbitmap=nil
  1347.     @mosaicbitmap2=nil
  1348.     @oldbitmap=self.bitmap
  1349.   end
  1350.  
  1351.   attr_reader :mosaic
  1352.  
  1353.   def mosaic=(value)
  1354.     @mosaic=value
  1355.     @mosaic=0 if @mosaic<0
  1356.     mosaicRefresh(@oldbitmap)
  1357.   end
  1358.  
  1359.   def dispose
  1360.     super
  1361.     @mosaicbitmap.dispose if @mosaicbitmap
  1362.     @mosaicbitmap=nil
  1363.     @mosaicbitmap2.dispose if @mosaicbitmap2
  1364.     @mosaicbitmap2=nil
  1365.   end
  1366.  
  1367.   def bitmap=(value)
  1368.     super
  1369.     mosaicRefresh(value)
  1370.   end
  1371.  
  1372.   def mosaicRefresh(bitmap)
  1373.     return if @inrefresh
  1374.     @inrefresh=true
  1375.     @oldbitmap=bitmap
  1376.     if @mosaic<=0 || !@oldbitmap
  1377.       @mosaicbitmap.dispose if @mosaicbitmap
  1378.       @mosaicbitmap=nil
  1379.       @mosaicbitmap2.dispose if @mosaicbitmap2
  1380.       @mosaicbitmap2=nil
  1381.       self.bitmap=@oldbitmap
  1382.     else
  1383.       newWidth=[(@oldbitmap.width/@mosaic),1].max
  1384.       newHeight=[(@oldbitmap.height/@mosaic),1].max
  1385.       @mosaicbitmap2.dispose if @mosaicbitmap2
  1386.       @mosaicbitmap=pbDoEnsureBitmap(@mosaicbitmap,newWidth,newHeight)
  1387.       @mosaicbitmap.clear
  1388.       @mosaicbitmap2=pbDoEnsureBitmap(@mosaicbitmap2,
  1389.          @oldbitmap.width,@oldbitmap.height)
  1390.       @mosaicbitmap2.clear
  1391.       @mosaicbitmap.stretch_blt(Rect.new(0,0,newWidth,newHeight),
  1392.          @oldbitmap,@oldbitmap.rect)
  1393.       @mosaicbitmap2.stretch_blt(
  1394.          Rect.new(-@mosaic/2+1,-@mosaic/2+1,
  1395.          @mosaicbitmap2.width,@mosaicbitmap2.height),
  1396.          @mosaicbitmap,Rect.new(0,0,newWidth,newHeight))
  1397.       self.bitmap=@mosaicbitmap2
  1398.     end
  1399.     @inrefresh=false
  1400.   end
  1401. end
  1402.  
  1403.  
  1404.  
  1405. class AutoMosaicPokemonSprite < MosaicPokemonSprite
  1406.   def update
  1407.     super
  1408.     self.mosaic-=1
  1409.   end
  1410. end
  1411.  
  1412.  
  1413.  
  1414. class PokemonBoxSprite < SpriteWrapper
  1415.   attr_accessor :refreshBox
  1416.   attr_accessor :refreshSprites
  1417.  
  1418.   def deletePokemon(index)
  1419.     @pokemonsprites[index].dispose
  1420.     @pokemonsprites[index]=nil
  1421.     refresh
  1422.   end
  1423.  
  1424.   def getPokemon(index)
  1425.     return @pokemonsprites[index]
  1426.   end
  1427.  
  1428.   def setPokemon(index,sprite)
  1429.     @pokemonsprites[index]=sprite
  1430.     refresh
  1431.   end
  1432.  
  1433.   def grabPokemon(index,arrow)
  1434.     sprite=@pokemonsprites[index]
  1435.     if sprite
  1436.       arrow.grab(sprite)
  1437.       @pokemonsprites[index]=nil
  1438.       refresh
  1439.     end
  1440.   end
  1441.  
  1442.   def x=(value)
  1443.     super
  1444.     refresh
  1445.   end
  1446.  
  1447.   def y=(value)
  1448.     super
  1449.     refresh
  1450.   end
  1451.  
  1452.   def color=(value)
  1453.     super
  1454.     if @refreshSprites
  1455.       for i in 0...30
  1456.         if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1457.           @pokemonsprites[i].color=value
  1458.         end
  1459.       end
  1460.     end
  1461.     refresh
  1462.   end
  1463.  
  1464.   def visible=(value)
  1465.     super
  1466.     for i in 0...30
  1467.       if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1468.         @pokemonsprites[i].visible=value
  1469.       end
  1470.     end
  1471.     refresh
  1472.   end
  1473.  
  1474.   def getBoxBitmap
  1475.     if !@bg || @bg!=@storage[@boxnumber].background
  1476.       curbg=@storage[@boxnumber].background
  1477.       if !curbg || curbg.length==0
  1478.         boxid=@boxnumber%16
  1479.         @bg="box#{boxid}"
  1480.       else
  1481.         @bg="#{curbg}"
  1482.       end
  1483.       @boxbitmap.dispose if @boxbitmap
  1484.       @boxbitmap=AnimatedBitmap.new("Graphics/Pictures/#{@bg}")
  1485.     end
  1486.   end
  1487.  
  1488.   def initialize(storage,boxnumber,viewport=nil)
  1489.     super(viewport)
  1490.     @storage=storage
  1491.     @boxnumber=boxnumber
  1492.     @refreshBox=true
  1493.     @refreshSprites=true
  1494.     @bg=nil
  1495.     @boxbitmap=nil
  1496.     getBoxBitmap
  1497.     @pokemonsprites=[]
  1498.     @shadow=AnimatedBitmap.new("Graphics/Pictures/boxshadow")
  1499.     for i in 0...30
  1500.       @pokemonsprites[i]=nil
  1501.       pokemon=@storage[boxnumber,i]
  1502.       if pokemon
  1503.         @pokemonsprites[i]=PokemonBoxIcon.new(pokemon,viewport)
  1504.       else
  1505.         @pokemonsprites[i]=PokemonBoxIcon.new(nil,viewport)
  1506.       end
  1507.     end
  1508.     @contents=BitmapWrapper.new(160*2,144*2)
  1509.     self.bitmap=@contents
  1510.     self.x=160
  1511.     self.y=32
  1512.     refresh
  1513.   end
  1514.  
  1515.   def dispose
  1516.     if !disposed?
  1517.       for i in 0...30
  1518.         @pokemonsprites[i].dispose if @pokemonsprites[i]
  1519.         @pokemonsprites[i]=nil
  1520.       end
  1521.       @contents.dispose
  1522.       @boxbitmap.dispose
  1523.       @shadow.dispose
  1524.       super
  1525.     end
  1526.   end
  1527.  
  1528.   def refresh
  1529.     if @refreshBox
  1530.       boxname=@storage[@boxnumber].name
  1531.       getBoxBitmap
  1532.       @contents.blt(0,0,@boxbitmap.bitmap,Rect.new(0,0,160*2,144*2))
  1533.       pbSetSystemFont(@contents)
  1534.       widthval=@contents.text_size(boxname).width
  1535.       xval=160-(widthval/2)
  1536.       pbDrawShadowText(@contents,xval,10,widthval,32,boxname,
  1537.          Color.new(31*8,31*8,31*8),Color.new(7*8,7*8,7*8))
  1538.       @refreshBox=false
  1539.     end
  1540.     yval=self.y+24
  1541.     for j in 0...5
  1542.       xval=self.x+8
  1543.       for k in 0...6
  1544.         sprite=@pokemonsprites[j*6+k]
  1545.         if sprite && !sprite.disposed?
  1546.           sprite.viewport=self.viewport
  1547.           sprite.z=0
  1548.           sprite.x=xval
  1549.           sprite.y=yval
  1550.         end
  1551.         xval+=48
  1552.       end
  1553.       yval+=48
  1554.     end
  1555.   end
  1556.  
  1557.   def update
  1558.     super
  1559.     for i in 0...30
  1560.       if @pokemonsprites[i] && !@pokemonsprites[i].disposed?
  1561.         @pokemonsprites[i].update
  1562.       end
  1563.     end
  1564.   end
  1565. end
  1566.  
  1567.  
  1568.  
  1569. class PokemonStorageScene
  1570.   def initialize
  1571.     @command=0
  1572.   end
  1573.  
  1574.   class PokemonBoxPlane < AnimatedPlane
  1575.     def update
  1576.       super
  1577.       self.ox+=2
  1578.       self.oy-=2
  1579.       self.ox=0 if self.ox==64
  1580.       self.oy=0 if self.oy==-64
  1581.     end
  1582.   end
  1583.  
  1584.   def pbStartBox(screen,command)
  1585.     @screen=screen
  1586.     @storage=screen.storage
  1587.     @bgviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1588.     @bgviewport.z=99999
  1589.     @boxviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1590.     @boxviewport.z=99999
  1591.     @boxsidesviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1592.     @boxsidesviewport.z=99999
  1593.     @arrowviewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1594.     @arrowviewport.z=99999
  1595.     @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1596.     @viewport.z=99999
  1597.     @selection=0
  1598.     @sprites={}
  1599.     @choseFromParty=false
  1600.     @command=command
  1601.     @sprites["boxbg"]=PokemonBoxPlane.new(@bgviewport)
  1602.     @sprites["boxbg"].setBitmap("Graphics/Pictures/boxbg")
  1603.     @sprites["box"]=PokemonBoxSprite.new(@storage,@storage.currentBox,@boxviewport)
  1604.     @sprites["boxsides"]=IconSprite.new(0,0,@boxsidesviewport)
  1605.     @sprites["boxsides"].setBitmap("Graphics/Pictures/boxsides")
  1606.     @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@boxsidesviewport)
  1607.     @sprites["pokemon"]=AutoMosaicPokemonSprite.new(@boxsidesviewport)
  1608.     pbSetSystemFont(@sprites["overlay"].bitmap)
  1609.     @sprites["boxparty"]=PokemonBoxPartySprite.new(@storage.party,@boxsidesviewport)
  1610.     if command!=1 # Drop down tab only on Deposit
  1611.       @sprites["boxparty"].x=160
  1612.       @sprites["boxparty"].y=-320
  1613.     end
  1614.     @sprites["arrow"]=PokemonBoxArrow.new(@arrowviewport)
  1615.     @sprites["arrow"].z+=1
  1616.     if command!=1
  1617.       pbSetArrow(@sprites["arrow"],@selection)
  1618.       pbUpdateOverlay(@selection)
  1619.       pbSetMosaic(@selection)
  1620.     else
  1621.       pbPartySetArrow(@sprites["arrow"],@selection)
  1622.       pbUpdateOverlay(@selection,@storage.party)
  1623.       pbSetMosaic(@selection)
  1624.     end
  1625.     pbFadeInAndShow(@sprites)
  1626.   end
  1627.  
  1628.   def pbCloseBox
  1629.     pbFadeOutAndHide(@sprites)  
  1630.     pbDisposeSpriteHash(@sprites)
  1631.     @boxviewport.dispose
  1632.     @boxsidesviewport.dispose
  1633.     @arrowviewport.dispose
  1634.   end
  1635.  
  1636.   def pbSetArrow(arrow,selection)
  1637.     case selection
  1638.       when -1, -4, -5 # Box name, move left, move right
  1639.         arrow.angle=0
  1640.         arrow.ox=0
  1641.         arrow.oy=0
  1642.         arrow.mirror=false
  1643.         arrow.y=-8
  1644.         arrow.x=146*2
  1645.       when -2 # Party Pokémon
  1646.         arrow.angle=180
  1647.         arrow.ox=64
  1648.         arrow.oy=64
  1649.         arrow.mirror=true
  1650.         arrow.y=-4
  1651.         arrow.x=104*2
  1652.       when -3 # Close Box
  1653.         arrow.angle=180
  1654.         arrow.ox=64
  1655.         arrow.oy=64
  1656.         arrow.mirror=true
  1657.         arrow.y=-4
  1658.         arrow.x=192*2
  1659.       else
  1660.         arrow.angle=0
  1661.         arrow.ox=0
  1662.         arrow.oy=0
  1663.         arrow.mirror=false
  1664.         arrow.x = (84+24*(selection%6) ) * 2
  1665.         arrow.y = (16+24*(selection/6) ) * 2
  1666.     end
  1667.   end
  1668.  
  1669.   def pbChangeSelection(key,selection)
  1670.     case key
  1671.       when Input::UP
  1672.         if selection==-1 # Box name
  1673.           selection=-2
  1674.         elsif selection==-2 # Party
  1675.           selection=24
  1676.         elsif selection==-3 # Close Box
  1677.           selection=29
  1678.         else
  1679.           selection-=6
  1680.           selection=-1 if selection<0
  1681.         end
  1682.       when Input::DOWN
  1683.         if selection==-1 # Box name
  1684.           selection=2
  1685.         elsif selection==-2 # Party
  1686.           selection=-1
  1687.         elsif selection==-3 # Close Box
  1688.           selection=-1
  1689.         else
  1690.           selection+=6
  1691.           selection=-2 if selection==30||selection==31||selection==32
  1692.           selection=-3 if selection==33||selection==34||selection==35
  1693.         end
  1694.       when Input::RIGHT
  1695.         if selection==-1 # Box name
  1696.           selection=-5 # Move to next box
  1697.         elsif selection==-2
  1698.           selection=-3
  1699.         elsif selection==-3
  1700.           selection=-2
  1701.         else
  1702.           selection+=1
  1703.           selection-=6 if selection%6==0
  1704.         end
  1705.       when Input::LEFT
  1706.         if selection==-1 # Box name
  1707.           selection=-4 # Move to previous box
  1708.         elsif selection==-2
  1709.           selection=-3
  1710.         elsif selection==-3
  1711.           selection=-2
  1712.         else
  1713.           selection-=1
  1714.           selection+=6 if selection==-1||selection%6==5
  1715.         end
  1716.     end
  1717.     return selection
  1718.   end
  1719.  
  1720.   def pbPartySetArrow(arrow,selection)
  1721.     if selection>=0
  1722.       xvalues=[88,136,136,136,136,136,136]
  1723.       yvalues=[36,-12,12,36,60,84,116]
  1724.       arrow.angle=0
  1725.       arrow.mirror=false
  1726.       arrow.ox=0
  1727.       arrow.oy=0
  1728.       arrow.x=xvalues[selection]*2
  1729.       arrow.y=yvalues[selection]*2
  1730.     end
  1731.   end
  1732.  
  1733.   def pbPartyChangeSelection(key,selection)
  1734.     case key
  1735.       when Input::LEFT
  1736.         return 0
  1737.       when Input::RIGHT
  1738.         if selection==0
  1739.           return -2 # Choose last selection from right row
  1740.         else
  1741.           return -1 # Close party tab
  1742.         end
  1743.       when Input::UP
  1744.         selection-=1
  1745.         selection=6 if selection<1
  1746.       when Input::DOWN
  1747.         selection+=1
  1748.         selection=0 if selection>6
  1749.     end
  1750.     return selection
  1751.   end
  1752.  
  1753.   def pbSelectPartyInternal(party,depositing)
  1754.     selection=@selection
  1755.     pbPartySetArrow(@sprites["arrow"],selection)
  1756.     pbUpdateOverlay(selection,party)
  1757.     pbSetMosaic(selection)
  1758.     lastsel=1
  1759.     loop do
  1760.       Graphics.update
  1761.       Input.update
  1762.       key=-1
  1763.       key=Input::DOWN if Input.repeat?(Input::DOWN)
  1764.       key=Input::RIGHT if Input.repeat?(Input::RIGHT)
  1765.       key=Input::LEFT if Input.repeat?(Input::LEFT)
  1766.       key=Input::UP if Input.repeat?(Input::UP)
  1767.       if key>=0
  1768.         pbPlayCursorSE()
  1769.         newselection=pbPartyChangeSelection(key,selection)
  1770.         if newselection==-1
  1771.           return -1 if !depositing
  1772.         elsif newselection==-2
  1773.           selection=lastsel
  1774.         else
  1775.           selection=newselection
  1776.         end
  1777.         pbPartySetArrow(@sprites["arrow"],selection)
  1778.         lastsel=selection if selection>0
  1779.         pbUpdateOverlay(selection,party)
  1780.         pbSetMosaic(selection)
  1781.       end
  1782.       pbUpdateSpriteHash(@sprites)
  1783.       if Input.trigger?(Input::C)
  1784.         if selection>=0 && selection<6
  1785.           @selection=selection
  1786.           return selection
  1787.         elsif selection==6 # Close Box
  1788.           @selection=selection
  1789.           return (depositing) ? -3 : -1
  1790.         end
  1791.       end
  1792.       if Input.trigger?(Input::B)
  1793.         @selection=selection
  1794.         return -1
  1795.       end
  1796.     end
  1797.   end
  1798.  
  1799.   def pbSelectParty(party)
  1800.     return pbSelectPartyInternal(party,true)
  1801.   end
  1802.  
  1803.   def pbChangeBackground(wp)
  1804.     @sprites["box"].refreshSprites=false
  1805.     alpha=0
  1806.     Graphics.update
  1807.     pbUpdateSpriteHash(@sprites)
  1808.     16.times do
  1809.       alpha+=16
  1810.       Graphics.update
  1811.       Input.update
  1812.       @sprites["box"].color=Color.new(248,248,248,alpha)
  1813.       pbUpdateSpriteHash(@sprites)
  1814.     end
  1815.     @sprites["box"].refreshBox=true
  1816.     @storage[@storage.currentBox].background="box#{wp}"
  1817.     4.times do
  1818.       Graphics.update
  1819.       Input.update
  1820.       pbUpdateSpriteHash(@sprites)
  1821.     end
  1822.     16.times do
  1823.       alpha-=16
  1824.       Graphics.update
  1825.       Input.update
  1826.       @sprites["box"].color=Color.new(248,248,248,alpha)
  1827.       pbUpdateSpriteHash(@sprites)
  1828.     end
  1829.     @sprites["box"].refreshSprites=true
  1830.   end
  1831.  
  1832.   def pbSwitchBoxToRight(newbox)
  1833.     newbox=PokemonBoxSprite.new(@storage,newbox,@boxviewport)
  1834.     newbox.x=544
  1835.     Graphics.frame_reset
  1836.     begin
  1837.       Graphics.update
  1838.       Input.update
  1839.       @sprites["box"].x-=16
  1840.       newbox.x-=16
  1841.       pbUpdateSpriteHash(@sprites)
  1842.     end until newbox.x<=160
  1843.     @sprites["box"].dispose
  1844.     @sprites["box"]=newbox
  1845.   end
  1846.  
  1847.   def pbSwitchBoxToLeft(newbox)
  1848.     newbox=PokemonBoxSprite.new(@storage,newbox,@boxviewport)
  1849.     newbox.x=-224
  1850.     Graphics.frame_reset
  1851.     begin
  1852.       Graphics.update
  1853.       Input.update
  1854.       @sprites["box"].x+=16
  1855.       newbox.x+=16
  1856.       pbUpdateSpriteHash(@sprites)
  1857.     end until newbox.x>=160
  1858.     @sprites["box"].dispose
  1859.     @sprites["box"]=newbox
  1860.   end
  1861.  
  1862.   def pbJumpToBox(newbox)
  1863.     if @storage.currentBox!=newbox
  1864.       if newbox>@storage.currentBox
  1865.         pbSwitchBoxToRight(newbox)
  1866.       else
  1867.         pbSwitchBoxToLeft(newbox)
  1868.       end
  1869.       @storage.currentBox=newbox
  1870.     end
  1871.   end
  1872.  
  1873.   def pbBoxName(helptext,minchars,maxchars)
  1874.     oldsprites=pbFadeOutAndHide(@sprites)
  1875.     ret=pbEnterText(helptext,minchars,maxchars)
  1876.     if ret.length>0
  1877.       @storage[@storage.currentBox].name=ret
  1878.     end
  1879.     @sprites["box"].refreshBox=true
  1880.     pbRefresh
  1881.     pbFadeInAndShow(@sprites,oldsprites)
  1882.   end
  1883.  
  1884.   def pbUpdateOverlay(selection,party=nil)
  1885.     overlay=@sprites["overlay"].bitmap
  1886.     overlay.clear
  1887.     pokemon=nil
  1888.     if @screen.pbHeldPokemon
  1889.       pokemon=@screen.pbHeldPokemon
  1890.     elsif selection>=0
  1891.       pokemon=(party) ? party[selection] : @storage[@storage.currentBox,selection]
  1892.     end
  1893.     if !pokemon
  1894.       @sprites["pokemon"].visible=false
  1895.       return
  1896.     end
  1897.     @sprites["pokemon"].visible=true
  1898.     speciesname=PBSpecies.getName(pokemon.species)
  1899.     itemname=""
  1900.     if pokemon.item>0
  1901.       itemname=PBItems.getName(pokemon.item)
  1902.     end
  1903.     base=Color.new(248,248,248)
  1904.     shadow=Color.new(0,0,0)
  1905.     textstrings=[
  1906.        [pokemon.name,12,178,false,base,shadow]
  1907.     ]
  1908.     if !pokemon.egg?
  1909.       textstrings.push([_INTL("/{1}",speciesname),12,210,false,base,shadow])
  1910.       textstrings.push([_INTL("Lv{1}",pokemon.level),44,242,false,base,shadow])
  1911.       if pokemon.gender==0
  1912.         textstrings.push([_INTL("♂"),20,242,false,Color.new(120,184,248),Color.new(0,120,248)])
  1913.       elsif pokemon.gender==1
  1914.         textstrings.push([_INTL("♀"),20,242,false,Color.new(248,128,128),Color.new(168,24,24)])
  1915.       end
  1916.     end
  1917.     pbSetSystemFont(overlay)
  1918.     pbDrawTextPositions(overlay,textstrings)
  1919.     textstrings.clear
  1920.     if !pokemon.egg?
  1921.       textstrings.push([_INTL("{1}",itemname),12,270,false,base,shadow])
  1922.     end
  1923.     pbSetSmallFont(overlay)
  1924.     pbDrawTextPositions(overlay,textstrings)
  1925.     drawMarkings(overlay,12,294,128,20,pokemon.markings)
  1926.     @sprites["pokemon"].setPokemonBitmap(pokemon)
  1927.     pbPositionPokemonSprite(@sprites["pokemon"],16,32)
  1928.   end
  1929.  
  1930.   def pbDropDownPartyTab
  1931.     begin
  1932.       Graphics.update
  1933.       Input.update
  1934.       @sprites["boxparty"].y+=16
  1935.       pbUpdateSpriteHash(@sprites)
  1936.     end until @sprites["boxparty"].y>=0
  1937.   end
  1938.  
  1939.   def pbHidePartyTab
  1940.     begin
  1941.       Graphics.update
  1942.       Input.update
  1943.       @sprites["boxparty"].y-=16
  1944.       pbUpdateSpriteHash(@sprites)
  1945.     end until @sprites["boxparty"].y<=-320
  1946.   end
  1947.  
  1948.   def pbSetMosaic(selection)
  1949.     if !@screen.pbHeldPokemon
  1950.       if @boxForMosaic!=@storage.currentBox || @selectionForMosaic!=selection
  1951.         @sprites["pokemon"].mosaic=10
  1952.         @boxForMosaic=@storage.currentBox
  1953.         @selectionForMosaic=selection
  1954.       end
  1955.     end
  1956.   end
  1957.  
  1958.   def pbSelectBoxInternal(party)
  1959.     selection=@selection
  1960.     pbSetArrow(@sprites["arrow"],selection)
  1961.     pbUpdateOverlay(selection)
  1962.     pbSetMosaic(selection)
  1963.     loop do
  1964.       Graphics.update
  1965.       Input.update
  1966.       key=-1
  1967.       key=Input::DOWN if Input.repeat?(Input::DOWN)
  1968.       key=Input::RIGHT if Input.repeat?(Input::RIGHT)
  1969.       key=Input::LEFT if Input.repeat?(Input::LEFT)
  1970.       key=Input::UP if Input.repeat?(Input::UP)
  1971.       if key>=0
  1972.         pbPlayCursorSE()
  1973.         selection=pbChangeSelection(key,selection)
  1974.         pbSetArrow(@sprites["arrow"],selection)
  1975.         nextbox=-1
  1976.         if selection==-4
  1977.           nextbox=(@storage.currentBox==0) ? @storage.maxBoxes-1 : @storage.currentBox-1
  1978.           pbSwitchBoxToLeft(nextbox)
  1979.           @storage.currentBox=nextbox
  1980.           selection=-1
  1981.         elsif selection==-5
  1982.           nextbox=(@storage.currentBox==@storage.maxBoxes-1) ? 0 : @storage.currentBox+1
  1983.           pbSwitchBoxToRight(nextbox)
  1984.           @storage.currentBox=nextbox
  1985.           selection=-1
  1986.         end
  1987.         selection=-1 if selection==-4||selection==-5
  1988.         pbUpdateOverlay(selection)
  1989.         pbSetMosaic(selection)
  1990.       end
  1991.       pbUpdateSpriteHash(@sprites)
  1992.       if Input.trigger?(Input::C)
  1993.         if selection>=0
  1994.           @selection=selection
  1995.           return [@storage.currentBox,selection]
  1996.         elsif selection==-1 # Box name
  1997.           @selection=selection
  1998.           return [-4,-1]
  1999.         elsif selection==-2 # Party Pokémon
  2000.           @selection=selection
  2001.           return [-2,-1]
  2002.         elsif selection==-3 # Close Box
  2003.           @selection=selection
  2004.           return [-3,-1]
  2005.         end
  2006.       end
  2007.       if Input.trigger?(Input::B)
  2008.         @selection=selection
  2009.         return nil
  2010.       end
  2011.     end
  2012.   end
  2013.  
  2014.   def pbSelectBox(party)
  2015.     if @command==0 # Withdraw
  2016.       return pbSelectBoxInternal(party)
  2017.     else
  2018.       ret=nil
  2019.       loop do
  2020.         if !@choseFromParty
  2021.           ret=pbSelectBoxInternal(party)
  2022.         end
  2023.         if @choseFromParty || (ret && ret[0]==-2) # Party Pokémon
  2024.           if !@choseFromParty
  2025.             pbDropDownPartyTab
  2026.             @selection=0
  2027.           end
  2028.           ret=pbSelectPartyInternal(party,false)
  2029.           if ret<0
  2030.             pbHidePartyTab
  2031.             @selection=0
  2032.             @choseFromParty=false
  2033.           else
  2034.             @choseFromParty=true
  2035.             return [-1,ret]
  2036.           end
  2037.         else
  2038.           @choseFromParty=false
  2039.           return ret
  2040.         end
  2041.       end
  2042.     end
  2043.   end
  2044.  
  2045.   def pbHold(selected)
  2046.     if selected[0]==-1
  2047.       @sprites["boxparty"].grabPokemon(selected[1],@sprites["arrow"])
  2048.     else
  2049.       @sprites["box"].grabPokemon(selected[1],@sprites["arrow"])
  2050.     end
  2051.     while @sprites["arrow"].grabbing?
  2052.       Graphics.update
  2053.       Input.update
  2054.       pbUpdateSpriteHash(@sprites)
  2055.     end
  2056.   end
  2057.  
  2058.   def pbSwap(selected,heldpoke)
  2059.     heldpokesprite=@sprites["arrow"].heldPokemon
  2060.     boxpokesprite=nil
  2061.     if selected[0]==-1
  2062.       boxpokesprite=@sprites["boxparty"].getPokemon(selected[1])
  2063.     else
  2064.       boxpokesprite=@sprites["box"].getPokemon(selected[1])
  2065.     end
  2066.     if selected[0]==-1
  2067.       @sprites["boxparty"].setPokemon(selected[1],heldpokesprite)
  2068.     else
  2069.       @sprites["box"].setPokemon(selected[1],heldpokesprite)
  2070.     end
  2071.     @sprites["arrow"].setSprite(boxpokesprite)
  2072.   end
  2073.  
  2074.   def pbPlace(selected,heldpoke)
  2075.     heldpokesprite=@sprites["arrow"].heldPokemon
  2076.     @sprites["arrow"].place
  2077.     while @sprites["arrow"].placing?
  2078.       Graphics.update
  2079.       Input.update
  2080.       pbUpdateSpriteHash(@sprites)
  2081.     end
  2082.     if selected[0]==-1
  2083.       @sprites["boxparty"].setPokemon(selected[1],heldpokesprite)
  2084.     else
  2085.       @sprites["box"].setPokemon(selected[1],heldpokesprite)
  2086.     end
  2087.   end
  2088.  
  2089.   def pbChooseItem(bag)
  2090.     oldsprites=pbFadeOutAndHide(@sprites)
  2091.     scene=PokemonBag_Scene.new
  2092.     screen=PokemonBagScreen.new(scene,bag)
  2093.     ret=screen.pbGiveItemScreen
  2094.     pbFadeInAndShow(@sprites,oldsprites)
  2095.     return ret
  2096.   end
  2097.  
  2098.   def pbWithdraw(selected,heldpoke,partyindex)
  2099.     if !heldpoke
  2100.       pbHold(selected)
  2101.     end
  2102.     pbDropDownPartyTab
  2103.     pbPartySetArrow(@sprites["arrow"],partyindex)
  2104.     pbPlace([-1,partyindex],heldpoke)
  2105.     pbHidePartyTab
  2106.   end
  2107.  
  2108.   def pbSummary(selected,heldpoke)
  2109.     oldsprites=pbFadeOutAndHide(@sprites)
  2110.     scene=PokemonSummaryScene.new
  2111.     screen=PokemonSummary.new(scene)
  2112.     if heldpoke
  2113.       screen.pbStartScreen([heldpoke],0)
  2114.     elsif selected[0]==-1
  2115.       @selection=screen.pbStartScreen(@storage.party,selected[1])
  2116.       pbPartySetArrow(@sprites["arrow"],@selection)
  2117.       pbUpdateOverlay(@selection,@storage.party)
  2118.     else
  2119.       @selection=screen.pbStartScreen(@storage.boxes[selected[0]],selected[1])
  2120.       pbSetArrow(@sprites["arrow"],@selection)
  2121.       pbUpdateOverlay(@selection)
  2122.     end
  2123.     pbFadeInAndShow(@sprites,oldsprites)
  2124.   end
  2125.  
  2126.   def pbStore(selected,heldpoke,destbox,firstfree)
  2127.     if heldpoke
  2128.       if destbox==@storage.currentBox
  2129.         heldpokesprite=@sprites["arrow"].heldPokemon
  2130.         @sprites["box"].setPokemon(firstfree,heldpokesprite)
  2131.         @sprites["arrow"].setSprite(nil)
  2132.       else
  2133.         @sprites["arrow"].deleteSprite
  2134.       end
  2135.     else
  2136.       sprite=@sprites["boxparty"].getPokemon(selected[1])
  2137.       if destbox==@storage.currentBox
  2138.         @sprites["box"].setPokemon(firstfree,sprite)
  2139.         @sprites["boxparty"].setPokemon(selected[1],nil)
  2140.       else
  2141.         @sprites["boxparty"].deletePokemon(selected[1])
  2142.       end
  2143.     end
  2144.   end
  2145.  
  2146.   def drawMarkings(bitmap,x,y,width,height,markings)
  2147.     totaltext=""
  2148.     oldfontname=bitmap.font.name
  2149.     oldfontsize=bitmap.font.size
  2150.     oldfontcolor=bitmap.font.color
  2151.     bitmap.font.size=24
  2152.     bitmap.font.name="Arial"
  2153.     PokemonStorage::MARKINGCHARS.each{|item| totaltext+=item }
  2154.     totalsize=bitmap.text_size(totaltext)
  2155.     realX=x+(width/2)-(totalsize.width/2)
  2156.     realY=y+(height/2)-(totalsize.height/2)
  2157.     i=0
  2158.     PokemonStorage::MARKINGCHARS.each{|item|
  2159.        marked=(markings&(1<<i))!=0
  2160.        bitmap.font.color=(marked) ? Color.new(248,248,248) : Color.new(11*8,11*8,18*8)
  2161.        itemwidth=bitmap.text_size(item).width
  2162.        bitmap.draw_text(realX,realY,itemwidth+2,totalsize.height,item)
  2163.        realX+=itemwidth
  2164.        i+=1
  2165.     }
  2166.     bitmap.font.name=oldfontname
  2167.     bitmap.font.size=oldfontsize
  2168.     bitmap.font.color=oldfontcolor
  2169.   end
  2170.  
  2171.   def getMarkingCommands(markings)
  2172.     selectedtag="<c=000000>"
  2173.     deselectedtag="<c=c0c0c0>"
  2174.     commands=[]
  2175.     for i in 0...PokemonStorage::MARKINGCHARS.length
  2176.       commands.push( ((markings&(1<<i))==0 ? deselectedtag : selectedtag)+"<ac><fn=Arial>"+PokemonStorage::MARKINGCHARS[i])
  2177.     end
  2178.     commands.push(_INTL("OK"))
  2179.     commands.push(_INTL("CANCEL"))  
  2180.     return commands
  2181.   end
  2182.  
  2183.   def pbMark(selected,heldpoke)
  2184.     ret=0
  2185.     msgwindow=Window_UnformattedTextPokemon.newWithSize("",160,0,Graphics.width-160,32)
  2186.     msgwindow.viewport=@viewport
  2187.     msgwindow.visible=true
  2188.     msgwindow.letterbyletter=false
  2189.     msgwindow.resizeHeightToFit(_INTL("Mark your Pokemon."),Graphics.width-160)
  2190.     msgwindow.text=_INTL("Mark your Pokemon.")
  2191.     pokemon=heldpoke
  2192.     if heldpoke
  2193.       pokemon=heldpoke
  2194.     elsif selected[0]==-1
  2195.       pokemon=@storage.party[selected[1]]
  2196.     else
  2197.       pokemon=@storage.boxes[selected[0]][selected[1]]
  2198.     end
  2199.     pbBottomRight(msgwindow)
  2200.     selectedtag="<c=000000>"
  2201.     deselectedtag="<c=c0c0c0>"
  2202.     commands=getMarkingCommands(pokemon.markings)
  2203.     cmdwindow=Window_AdvancedCommandPokemon.new(commands)
  2204.     cmdwindow.viewport=@viewport
  2205.     cmdwindow.visible=true
  2206.     cmdwindow.resizeToFit(cmdwindow.commands)
  2207.     cmdwindow.height=Graphics.height-msgwindow.height if cmdwindow.height>Graphics.height-msgwindow.height
  2208.     cmdwindow.update
  2209.     pbBottomRight(cmdwindow)
  2210.     markings=pokemon.markings
  2211.     cmdwindow.y-=msgwindow.height
  2212.     loop do
  2213.       Graphics.update
  2214.       Input.update
  2215.       if Input.trigger?(Input::B)
  2216.         break # cancel
  2217.       end
  2218.       if Input.trigger?(Input::C)
  2219.         if cmdwindow.index==commands.length-1
  2220.           break # cancel
  2221.         elsif cmdwindow.index==commands.length-2
  2222.           pokemon.markings=markings # OK
  2223.           break
  2224.         elsif cmdwindow.index>=0
  2225.           mask=(1<<cmdwindow.index)
  2226.           if (markings&mask)==0
  2227.             markings|=mask
  2228.           else
  2229.             markings&=~mask
  2230.           end
  2231.           commands=getMarkingCommands(markings)
  2232.           cmdwindow.commands=commands
  2233.         end
  2234.       end
  2235.       pbUpdateSpriteHash(@sprites)
  2236.       msgwindow.update
  2237.       cmdwindow.update
  2238.     end
  2239.     msgwindow.dispose
  2240.     cmdwindow.dispose
  2241.     Input.update
  2242.   end
  2243.  
  2244.   def pbRefresh
  2245.     @sprites["box"].refresh
  2246.     @sprites["boxparty"].refresh
  2247.   end
  2248.  
  2249.   def pbHardRefresh
  2250.     oldPartyY=@sprites["boxparty"].y
  2251.     @sprites["box"].dispose
  2252.     @sprites["boxparty"].dispose
  2253.     @sprites["box"]=PokemonBoxSprite.new(@storage,@storage.currentBox,@boxviewport)
  2254.     @sprites["boxparty"]=PokemonBoxPartySprite.new(@storage.party,@boxsidesviewport)
  2255.     @sprites["boxparty"].y=oldPartyY
  2256.   end
  2257.  
  2258.   def pbRelease(selected,heldpoke)
  2259.     box=selected[0]
  2260.     index=selected[1]
  2261.     if heldpoke
  2262.       sprite=@sprites["arrow"].heldPokemon
  2263.     elsif box==-1
  2264.       sprite=@sprites["boxparty"].getPokemon(index)
  2265.     else
  2266.       sprite=@sprites["box"].getPokemon(index)
  2267.     end
  2268.     if sprite
  2269.       sprite.release
  2270.       while sprite.releasing?
  2271.         Graphics.update
  2272.         sprite.update
  2273.         pbUpdateSpriteHash(@sprites)
  2274.       end
  2275.     end
  2276.   end
  2277.  
  2278.   def pbChooseBox(msg)
  2279.     commands=[]
  2280.     for i in 0...@storage.maxBoxes
  2281.       box=@storage[i]
  2282.       if box
  2283.         commands.push(_INTL("{1} ({2}/{3})",box.name,box.nitems,box.length))
  2284.       end
  2285.     end
  2286.     return pbShowCommands(msg,commands,@storage.currentBox)
  2287.   end
  2288.  
  2289.   def pbShowCommands(message,commands,index=0)
  2290.     ret=0
  2291.     msgwindow=Window_UnformattedTextPokemon.newWithSize("",160,0,Graphics.width-160,32)
  2292.     msgwindow.viewport=@viewport
  2293.     msgwindow.visible=true
  2294.     msgwindow.letterbyletter=false
  2295.     msgwindow.resizeHeightToFit(message,Graphics.width-160)
  2296.     msgwindow.text=message
  2297.     pbBottomRight(msgwindow)
  2298.     cmdwindow=Window_CommandPokemon.new(commands)
  2299.     cmdwindow.viewport=@viewport
  2300.     cmdwindow.visible=true
  2301.     cmdwindow.resizeToFit(cmdwindow.commands)
  2302.     cmdwindow.height=Graphics.height-msgwindow.height if cmdwindow.height>Graphics.height-msgwindow.height
  2303.     cmdwindow.update
  2304.     cmdwindow.index=index
  2305.     pbBottomRight(cmdwindow)
  2306.     cmdwindow.y-=msgwindow.height
  2307.     loop do
  2308.       Graphics.update
  2309.       Input.update
  2310.       if Input.trigger?(Input::B)
  2311.         ret=-1
  2312.         break
  2313.       end
  2314.       if Input.trigger?(Input::C)
  2315.         ret=cmdwindow.index
  2316.         break
  2317.       end
  2318.       pbUpdateSpriteHash(@sprites)
  2319.       msgwindow.update
  2320.       cmdwindow.update
  2321.     end
  2322.     msgwindow.dispose
  2323.     cmdwindow.dispose
  2324.     Input.update
  2325.     return ret
  2326.   end
  2327.  
  2328.   def pbDisplay(message)
  2329.     msgwindow=Window_UnformattedTextPokemon.newWithSize("",160,0,Graphics.width-160,32)
  2330.     msgwindow.viewport=@viewport
  2331.     msgwindow.visible=true
  2332.     msgwindow.letterbyletter=false
  2333.     msgwindow.resizeHeightToFit(message,Graphics.width-160)
  2334.     msgwindow.text=message
  2335.     pbBottomRight(msgwindow)
  2336.     loop do
  2337.       Graphics.update
  2338.       Input.update
  2339.       if Input.trigger?(Input::B)
  2340.         break
  2341.       end
  2342.       if Input.trigger?(Input::C)
  2343.         break
  2344.       end
  2345.       msgwindow.update
  2346.       pbUpdateSpriteHash(@sprites)
  2347.     end
  2348.     msgwindow.dispose
  2349.     Input.update
  2350.   end
  2351. end
  2352.  
  2353.  
  2354.  
  2355. def pbGetStorageCreator
  2356.   creator=pbGetMessage(MessageTypes::StorageCreator,0)
  2357.   if !creator || creator==""
  2358.     creator=_INTL("Bill")
  2359.   end
  2360.   return creator
  2361. end
  2362.  
  2363. def pbPCItemStorage
  2364.   loop do
  2365.     command=Kernel.pbShowCommandsWithHelp(nil,
  2366.        [_INTL("Withdraw item"),
  2367.        _INTL("Deposit item"),
  2368.        _INTL("Toss item"),
  2369.        _INTL("Exit")],
  2370.        [_INTL("Take out items from the PC."),
  2371.        _INTL("Store items in the PC."),
  2372.        _INTL("Throw away items stored in the PC."),
  2373.        _INTL("Go back to the previous menu.")],-1
  2374.     )
  2375.     if command==0 # Withdraw Item
  2376.       if !$PokemonGlobal.pcItemStorage
  2377.         $PokemonGlobal.pcItemStorage=PCItemStorage.new
  2378.       end
  2379.       if $PokemonGlobal.pcItemStorage.empty?
  2380.         Kernel.pbMessage(_INTL("There are no items."))
  2381.       else
  2382.         pbFadeOutIn(99999){
  2383.            scene=WithdrawItemScene.new
  2384.            screen=PokemonBagScreen.new(scene,$PokemonBag)
  2385.            ret=screen.pbWithdrawItemScreen
  2386.         }
  2387.       end
  2388.     elsif command==1 # Deposit Item
  2389.       pbFadeOutIn(99999){
  2390.          scene=PokemonBag_Scene.new
  2391.          screen=PokemonBagScreen.new(scene,$PokemonBag)
  2392.          ret=screen.pbDepositItemScreen
  2393.       }
  2394.     elsif command==2 # Toss Item
  2395.       if !$PokemonGlobal.pcItemStorage
  2396.         $PokemonGlobal.pcItemStorage=PCItemStorage.new
  2397.       end
  2398.       if $PokemonGlobal.pcItemStorage.empty?
  2399.         Kernel.pbMessage(_INTL("There are no items."))
  2400.       else
  2401.         pbFadeOutIn(99999){
  2402.            scene=TossItemScene.new
  2403.            screen=PokemonBagScreen.new(scene,$PokemonBag)
  2404.            ret=screen.pbTossItemScreen
  2405.         }
  2406.       end
  2407.     else
  2408.       break
  2409.     end
  2410.   end
  2411. end
  2412.  
  2413. def pbPCMailbox
  2414.   if !$PokemonGlobal.mailbox || $PokemonGlobal.mailbox.length==0
  2415.     Kernel.pbMessage(_INTL("There's no Mail here."))
  2416.   else
  2417.     loop do
  2418.       commands=[]
  2419.       for mail in $PokemonGlobal.mailbox
  2420.         commands.push(mail.sender)
  2421.       end
  2422.       commands.push(_INTL("Cancel"))
  2423.       command=Kernel.pbShowCommands(nil,commands,-1)
  2424.       if command>=0 && command<$PokemonGlobal.mailbox.length
  2425.         mailIndex=command
  2426.         command=Kernel.pbMessage(_INTL("What do you want to do with {1}'s Mail?",
  2427.            $PokemonGlobal.mailbox[mailIndex].sender),[
  2428.            _INTL("Read"),
  2429.            _INTL("Move to Bag"),
  2430.            _INTL("Give"),
  2431.            _INTL("Cancel")
  2432.            ],-1)
  2433.         if command==0 # Read
  2434.           pbFadeOutIn(99999){
  2435.              pbDisplayMail($PokemonGlobal.mailbox[mailIndex])
  2436.           }
  2437.         elsif command==1 # Move to Bag
  2438.           if Kernel.pbConfirmMessage(_INTL("The message will be lost.  Is that OK?"))
  2439.             if $PokemonBag.pbStoreItem($PokemonGlobal.mailbox[mailIndex].item)
  2440.               Kernel.pbMessage(_INTL("The Mail was returned to the Bag with its message erased."))
  2441.               $PokemonGlobal.mailbox.delete_at(mailIndex)
  2442.             else
  2443.               Kernel.pbMessage(_INTL("The Bag is full."))
  2444.             end
  2445.           end
  2446.         elsif command==2 # Give
  2447.           pbFadeOutIn(99999){
  2448.              sscene=PokemonScreen_Scene.new
  2449.              sscreen=PokemonScreen.new(sscene,$Trainer.party)
  2450.              sscreen.pbPokemonGiveMailScreen(mailIndex)
  2451.           }
  2452.         end
  2453.       else
  2454.         break
  2455.       end
  2456.     end
  2457.   end
  2458. end
  2459.  
  2460. def pbTrainerPCMenu
  2461.   loop do
  2462.     command=Kernel.pbMessage(_INTL("What do you want to do?"),[
  2463.        _INTL("Item Storage"),
  2464.        _INTL("Mailbox"),
  2465.        _INTL("Turn Off")
  2466.        ],-1)
  2467.     if command==0
  2468.       pbPCItemStorage
  2469.     elsif command==1
  2470.       pbPCMailbox
  2471.     else
  2472.       break
  2473.     end
  2474.   end
  2475. end
  2476.  
  2477.  
  2478.  
  2479. module PokemonPCList
  2480.   @@pclist=[]
  2481.  
  2482.   def self.registerPC(pc)
  2483.     @@pclist.push(pc)
  2484.   end
  2485.  
  2486.   def self.getCommandList()
  2487.     commands=[]
  2488.     for pc in @@pclist
  2489.       if pc.shouldShow?
  2490.         commands.push(pc.name)
  2491.       end
  2492.     end
  2493.     commands.push(_INTL("Log Off"))
  2494.     return commands
  2495.   end
  2496.  
  2497.   def self.callCommand(cmd)
  2498.     if cmd<0 || cmd>=@@pclist.length
  2499.       return false
  2500.     end
  2501.     i=0
  2502.     for pc in @@pclist
  2503.       if pc.shouldShow?
  2504.         if i==cmd
  2505.            pc.access()
  2506.            return true
  2507.         end
  2508.         i+=1
  2509.       end
  2510.     end
  2511.     return false
  2512.   end
  2513. end
  2514.  
  2515.  
  2516.  
  2517. def pbTrainerPC
  2518.   Kernel.pbMessage(_INTL("\\se[computeropen]{1} booted up the PC.",$Trainer.name))
  2519.   pbTrainerPCMenu
  2520.   pbSEPlay("computerclose")
  2521. end
  2522.  
  2523.  
  2524.  
  2525. class TrainerPC
  2526.   def shouldShow?
  2527.     return true
  2528.   end
  2529.  
  2530.   def name
  2531.     return _INTL("{1}'s PC",$Trainer.name)
  2532.   end
  2533.  
  2534.   def access
  2535.     Kernel.pbMessage(_INTL("\\se[accesspc]Accessed {1}'s PC.",$Trainer.name))
  2536.     pbTrainerPCMenu
  2537.   end
  2538. end
  2539.  
  2540.  
  2541.  
  2542. class StorageSystemPC
  2543.   def shouldShow?
  2544.     return true
  2545.   end
  2546.  
  2547.   def name
  2548.     if $PokemonGlobal.seenStorageCreator
  2549.       return _INTL("{1}'s PC",pbGetStorageCreator)
  2550.     else
  2551.       return _INTL("Someone's PC")
  2552.     end
  2553.   end
  2554.  
  2555.   def access
  2556.     Kernel.pbMessage(_INTL("\\se[accesspc]The Pokémon Storage System was opened."))
  2557.     loop do
  2558.       command=Kernel.pbShowCommandsWithHelp(nil,
  2559.          [_INTL("Withdraw Pokémon"),
  2560.          _INTL("Deposit Pokémon"),
  2561.          _INTL("Move Pokémon"),
  2562.          _INTL("See ya!")],
  2563.          [_INTL("Move Pokémon stored in Boxes to your party."),
  2564.          _INTL("Store Pokémon in your party in Boxes."),
  2565.          _INTL("Organize the Pokémon in Boxes and in your party."),
  2566.          _INTL("Return to the previous menu.")],-1
  2567.       )
  2568.       if command>=0 && command<3
  2569.         if command==0 && $PokemonStorage.party.length>=6
  2570.           Kernel.pbMessage(_INTL("Your party is full!"))
  2571.           next
  2572.         end
  2573.         count=0
  2574.         for p in $PokemonStorage.party
  2575.           count+=1 if p && !p.egg? && p.hp>0
  2576.         end
  2577.         if command==1 && count<=1
  2578.           Kernel.pbMessage(_INTL("Can't deposit the last Pokémon!"))
  2579.           next
  2580.         end
  2581.         pbFadeOutIn(99999){
  2582.            scene=PokemonStorageScene.new
  2583.            screen=PokemonStorageScreen.new(scene,$PokemonStorage)
  2584.            screen.pbStartScreen(command)
  2585.         }
  2586.       else
  2587.         break
  2588.       end
  2589.     end
  2590.   end
  2591. end
  2592.  
  2593.  
  2594.  
  2595. def pbPokeCenterPC
  2596.   Kernel.pbMessage(_INTL("\\se[computeropen]{1} booted up the PC.",$Trainer.name))
  2597.   loop do
  2598.     commands=PokemonPCList.getCommandList()
  2599.     command=Kernel.pbMessage(_INTL("Which PC should be accessed?"),
  2600.        commands,commands.length)
  2601.     if !PokemonPCList.callCommand(command)
  2602.       break
  2603.     end
  2604.   end
  2605.   pbSEPlay("computerclose")
  2606. end
  2607.  
  2608. PokemonPCList.registerPC(StorageSystemPC.new)
  2609. PokemonPCList.registerPC(TrainerPC.new)
Add Comment
Please, Sign In to add comment