Advertisement
Guest User

Grid Inventory Script

a guest
Sep 22nd, 2014
4,258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 60.80 KB | None | 0 0
  1. #===============================================================================#
  2. #                          Grid Inventory Script v1.1                           #
  3. #-------------------------------------------------------------------------------#
  4. #     Made by DarkSchneider (original script) and Gus (edit and bug fixes)      #
  5. #                                     ~~~                                       #
  6. #         Special credits to Schwarz for draw_line and Blizzard for the         #
  7. #                     Diablo 1 graphics used in this demo                       #
  8. #-------------------------------------------------------------------------------#
  9. #                         Description and instructions                          #
  10. #  This script changes the inventory, making it grid-based, inspired on games   #
  11. #  like Diablo, Resident Evil and Deus Ex. before installing it on your game,   #
  12. #  MAKE SURE YOU HAVE ADAPTED YOUR DATABASE. All the items should start their   #
  13. #  names with the format [#x#], being the first number the item width and the   #
  14. #  second number the item height. See the demo's database for more info. Also   #
  15. #  if you have any questions or problems with this script you can email me at   #
  16. #             scripts.gus@gmail.com and I'll try to help you out.               #
  17. #===============================================================================#
  18.  
  19. #===============================================================================#
  20. # Customization variables and some info about them
  21. #===============================================================================#
  22. module Grid_Variables
  23.     # Width of the grid, in number of tiles
  24.     GRID_WIDTH = 19
  25.     # Height of the grid, in number of tiles
  26.     GRID_HEIGHT = 12
  27.    
  28.     # Color for items' backgrounds. (Red, Green, Blue, Opacity)
  29.     COLOR_ITEMS = Color.new(0,0,200,50)
  30.     COLOR_WEAPONS = Color.new(200,0,0,50)
  31.     COLOR_ARMORS = Color.new(0,200,0,50)
  32.    
  33.     # Important items are items with a price of 0. They can't be sold, and, if
  34.     # this variable is false, they won't be able to be discarded too.
  35.     CAN_DROP_IMPORTANT_ITEMS = false
  36.    
  37.     # Big icons need to be exactly the size the item takes on the script, multi-
  38.     # plied by 32. Take a look at the icons folder for clarification
  39.     USE_BIG_ICONS = true
  40.    
  41.     # The big icons need to use exactly the same name as their item's icon, with
  42.     # something in front of the name for identification. Default is "grid.".
  43.     # IMPORTANT: Set this to "" if you're not using the big icons.
  44.     BIG_ICONS_PREFIX = "grid."
  45.    
  46.     # The mini help window is the little window that shows the item name. If your
  47.     # grid does not takes the entire window, you can set this to true.
  48.     MINIHELP_CAN_BE_OUTSIDE_GRID = false
  49.    
  50.     # This preferably has to be a 640x480 (or whatever window size you're using)
  51.     # picture, since it will allow you to change the dimensions without having to
  52.     # edit the picture.
  53.     GRID_BG_LOCATION = RPG::Cache.picture("gridbg")
  54.    
  55.     # When you replace an item, and then press esc, it will either do nothing
  56.     # (play buzzer se) or draw it anywhere. If you want the second, set this
  57.     # constant to false
  58.     ALLOW_ESC_REPLACING = false
  59. end
  60.  
  61. #===============================================================================#
  62. # Main class, replaces the original Scene_Item
  63. #===============================================================================#
  64. class Scene_Item
  65.     # The original script tried to use one inventory for each actor, but RPG Maker
  66.     # doesn't supports that, so this is a workaround, easier than editing a lot of
  67.     # code
  68.     def initialize(actor_index = 0)
  69.         @actor_index = actor_index
  70.     end
  71.    
  72.     def main
  73.         s1 = "Use"
  74.         s2 = "Move"
  75.         s3 = "Drop"
  76.         @command_window = Window_Command.new(96, [s1, s2 , s3])
  77.         @command_window.active = false
  78.         @command_window.visible = false
  79.         @command_window.z = 120 # So the icons don't overlap the window
  80.         @help_window = Window_Help.new
  81.         @grid = Window_Grid.new(@actor_index)
  82.         @grid.active = true
  83.         @grid.set = 0
  84.         @grid.mode = nil
  85.         # Associate help window
  86.         @grid.help_window = @help_window
  87.         # Make target window (set to invisible / inactive)
  88.         @target_window = Window_Target.new
  89.         @target_window.visible = false
  90.         @target_window.active = false
  91.         # Make target window for equiping items on the grid
  92.         @target_equip = Window_Target_Equip.new
  93.         @target_equip.visible = false
  94.         @target_equip.active = false
  95.         # To avoid problems when moving items
  96.         @moving_item = false
  97.         @call_methods = ""
  98.        
  99.         # Execute transition
  100.         Graphics.transition
  101.         # Main loop
  102.         loop do
  103.             # Update game screen
  104.             Graphics.update
  105.             # Update input information
  106.             Input.update
  107.             # Frame update
  108.             update
  109.             # Abort loop if screen is changed
  110.             if $scene != self
  111.                 break
  112.             end
  113.         end
  114.         # Prepare for transition
  115.         Graphics.freeze
  116.         @cursor_icon.dispose if @cursor_icon != nil
  117.         # Dispose of windows
  118.         @command_window.dispose
  119.         @help_window.dispose
  120.         @target_window.dispose
  121.         @target_equip.dispose
  122.         @grid.dispose
  123.     end
  124.     #--------------------------------------------------------------------------
  125.     # * Frame Update
  126.     #--------------------------------------------------------------------------
  127.     def update
  128.         # Update windows
  129.         @command_window.update
  130.         @help_window.update
  131.         @target_window.update
  132.         @target_equip.update
  133.         @grid.update
  134.         @grid.movingItemUpdate(@moving_item)
  135.         if @command_window.active
  136.             # Disabling drop option if item price is 0
  137.             if !Grid_Variables::CAN_DROP_IMPORTANT_ITEMS
  138.                 if @grid.item.price == 0
  139.                     @command_window.disable_item(2)
  140.                 else
  141.                     @command_window.enable_item(2)
  142.                 end
  143.             end
  144.            
  145.             # Disabling use option if item isn't usable
  146.             if !$game_party.item_can_use?(@grid.item.id) && @grid.item.is_a?(RPG::Item)
  147.                 @command_window.disable_item(0)
  148.             else
  149.                 @command_window.enable_item(0)
  150.             end
  151.            
  152.             update_command
  153.             return
  154.         end
  155.        
  156.         @command_window.x = @grid.x + (@grid.cursor_rect.x + 16) + (@grid.cursor_rect.width)
  157.         @command_window.y = @grid.y + (@grid.cursor_rect.y + 16) - (@command_window.height/ 2) + (@grid.cursor_rect.height / 2)
  158.         @command_window.x = @grid.x + @grid.cursor_rect.x - @command_window.width + 16 if @grid.cursor_rect.x + @grid.cursor_rect.height >= ((Grid_Variables::GRID_WIDTH - 2)* 32)
  159.        
  160.         if @grid.active
  161.             if Input.trigger?(Input::C) && @grid.item != nil && !@moving_item
  162.                 # Play decision SE
  163.                 $game_system.se_play($data_system.decision_se)
  164.                 @command_window.active = true
  165.                 @command_window.visible = true
  166.                 @grid.active = false
  167.             end
  168.            
  169.             # If B button was pressed
  170.             if Input.trigger?(Input::B) && !@moving_item
  171.                 # Play cancel SE
  172.                 $game_system.se_play($data_system.cancel_se)
  173.                 # Switch to menu screen
  174.                 $scene = Scene_Menu.new(0)
  175.                 return
  176.             end
  177.            
  178.             # Some methods have to be called here on the update, so this does the job
  179.             case @call_methods
  180.             when "use"
  181.                 use_item
  182.             when "cancel moving"
  183.                 @cursor_icon = Cursor_Icon.new if @cursor_icon == nil
  184.                 @cursor_icon.visible = false
  185.             when "move2"
  186.                 @cursor_icon.update
  187.                 update_move2
  188.             end        
  189.         end
  190.         if @target_window.active
  191.             update_target
  192.             return
  193.         elsif @target_equip.active
  194.             update_target_equip
  195.             return
  196.         end
  197.     end
  198.    
  199.     #--------------------------------------------------------------------------
  200.     # * Command Window Update
  201.     #--------------------------------------------------------------------------
  202.     def update_command
  203.         if Input.trigger?(Input::B)
  204.             @command_window.active = false
  205.             @command_window.visible = false
  206.             @grid.active = true
  207.             return
  208.         end
  209.         if Input.trigger?(Input::C)
  210.             # Branch by command window cursor position
  211.             case @command_window.index
  212.             when 0 # use
  213.                 # Play decision SE
  214.                 $game_system.se_play($data_system.decision_se)
  215.                 @call_methods = "use"
  216.             when 1 # move
  217.                 # Play equip SE
  218.                 $game_system.se_play($data_system.equip_se)
  219.                 @cursor_icon = Cursor_Icon.new if @cursor_icon == nil
  220.                 @cursor_icon.visible = false
  221.                 move_item
  222.             when 2 # drop
  223.                 if @grid.item != nil
  224.                     if !Grid_Variables::CAN_DROP_IMPORTANT_ITEMS
  225.                         if @grid.item.price != 0
  226.                             # Play cancel SE
  227.                             $game_system.se_play($data_system.cancel_se)
  228.                             @grid.delete_item(true)
  229.                         else
  230.                             # Play buzzer SE
  231.                             $game_system.se_play($data_system.buzzer_se)
  232.                         end
  233.                     else
  234.                         @grid.delete_item(true)
  235.                     end
  236.                 end
  237.             end
  238.             @command_window.active = false
  239.             @command_window.visible = false
  240.             @grid.active = true
  241.             return
  242.         end
  243.     end
  244.    
  245.     #--------------------------------------------------------------------------
  246.     # * Frame Update (when item window is active)
  247.     #--------------------------------------------------------------------------
  248.     def use_item
  249.         # Get currently selected data on the item window
  250.         @item = @grid.item
  251.         # If it's a weapon or armor
  252.         if !@item.is_a?(RPG::Item)
  253.             @grid.active = false
  254.             @target_equip.x = @grid.x + @grid.cursor_rect.x + (@grid.cursor_rect.width / 2) >= 320 ? 0 : 304
  255.             @target_equip.visible = true
  256.             @target_equip.active = true    
  257.             @target_equip.index = 0
  258.            
  259.             for i in 0...$game_party.actors.size
  260.                 if $game_party.actors[i].equippable?(@item)
  261.                     @target_equip.enable_actor(i)
  262.                 else
  263.                     @target_equip.disable_actor(i)
  264.                 end
  265.             end
  266.            
  267.             @target_equip.refresh
  268.         else
  269.             # If it can't be used
  270.             unless $game_party.item_can_use?(@item.id)
  271.                 # Play buzzer SE
  272.                 $game_system.se_play($data_system.buzzer_se)
  273.                 @call_methods = ""
  274.                 return
  275.             end
  276.            
  277.             # If effect scope is an ally
  278.             if @item.scope >= 3
  279.                 # Activate target window
  280.                 @grid.active = false
  281.                 @target_window.x = @grid.x + @grid.cursor_rect.x + (@grid.cursor_rect.width / 2) >= 320 ? 0 : 304
  282.                 @target_window.visible = true
  283.                 @target_window.active = true
  284.                 # Set cursor position to effect scope (single / all)
  285.                 if @item.scope == 4 || @item.scope == 6
  286.                     @target_window.index = -1
  287.                 else
  288.                     @target_window.index = 0
  289.                 end
  290.                 # If effect scope is other than an ally
  291.             else
  292.                 # If command event ID is valid
  293.                 if @item.common_event_id > 0
  294.                     # Command event call reservation
  295.                     $game_temp.common_event_id = @item.common_event_id
  296.                     # Play item use SE
  297.                     $game_system.se_play(@item.menu_se)
  298.                     # If consumable
  299.                     if @item.consumable
  300.                         # Decrease used items by 1
  301.                         $game_party.eraseDat(@item.id, "i", 1)
  302.                         # Draw item window item
  303.                         @grid.delete_item
  304.                     end
  305.                     # Switch to map screen
  306.                     $scene = Scene_Map.new
  307.                     return
  308.                 end
  309.             end
  310.         end
  311.         @call_methods = ""
  312.         return
  313.     end
  314.     #--------------------------------------------------------------------------
  315.     # * Frame Update (when target window is active)
  316.     #--------------------------------------------------------------------------
  317.     def update_target
  318.         # If B button was pressed
  319.         if Input.trigger?(Input::B)
  320.             # Play cancel SE
  321.             $game_system.se_play($data_system.cancel_se)
  322.             # If unable to use because items ran out
  323.             unless $game_party.item_can_use?(@item.id)
  324.                 # Remake item window contents
  325.                 @grid.refresh
  326.             end
  327.             # Erase target window
  328.             @grid.active = true
  329.             @target_window.visible = false
  330.             @target_window.active = false
  331.             return
  332.         end
  333.         # If C button was pressed
  334.         if Input.trigger?(Input::C)
  335.             # If items are used up
  336.             if @grid.item_del?
  337.                 # Play buzzer SE
  338.                 $game_system.se_play($data_system.buzzer_se)
  339.                 return
  340.             end
  341.             # If target is all
  342.             if @target_window.index == -1
  343.                 # Apply item effects to entire party
  344.                 used = false
  345.                 for i in $game_party.actors
  346.                     used |= i.item_effect(@item)
  347.                 end
  348.             end
  349.             # If single target
  350.             if @target_window.index >= 0
  351.                 # Apply item use effects to target actor
  352.                 target = $game_party.actors[@target_window.index]
  353.                 used = target.item_effect(@item)
  354.             end
  355.             # If an item was used
  356.             if used
  357.                 # Play item use SE
  358.                 $game_system.se_play(@item.menu_se)
  359.                 # If consumable
  360.                 if @item.consumable
  361.                     @grid.delete_item(true)
  362.                 end
  363.                 # Remake target window contents
  364.                 @target_window.refresh
  365.                 # If all party members are dead
  366.                 if $game_party.all_dead?
  367.                     # Switch to game over screen
  368.                     $scene = Scene_Gameover.new
  369.                     return
  370.                 end
  371.                 # If common event ID is valid
  372.                 if @item.common_event_id > 0
  373.                     # Common event call reservation
  374.                     $game_temp.common_event_id = @item.common_event_id
  375.                     # Switch to map screen
  376.                     $scene = Scene_Map.new
  377.                     return
  378.                 end
  379.                
  380.                 if Input.trigger?(Input::B)
  381.                     # Erase target window
  382.                     @grid.active = true
  383.                     @target_window.visible = false
  384.                     @target_window.active = false
  385.                     return
  386.                 end
  387.                
  388.             end
  389.             # If item wasn't used
  390.             unless used
  391.                 # Play buzzer SE
  392.                 $game_system.se_play($data_system.buzzer_se)
  393.             end
  394.             return
  395.         end
  396.     end
  397.    
  398.     #--------------------------------------------------------------------------
  399.     # * Frame Update (when target equip window is active)
  400.     #--------------------------------------------------------------------------
  401.     def update_target_equip
  402.         # If B button was pressed
  403.         if Input.trigger?(Input::B)
  404.             # Play cancel SE
  405.             $game_system.se_play($data_system.cancel_se)
  406.             # If unable to use because items ran out
  407.             unless $game_party.item_can_use?(@item.id)
  408.                 # Remake item window contents
  409.                 @grid.refresh
  410.             end
  411.             # Erase target window
  412.             @grid.active = true
  413.             @target_equip.visible = false
  414.             @target_equip.active = false
  415.             return
  416.         end
  417.        
  418.         # If C button was pressed
  419.         if Input.trigger?(Input::C)
  420.             actor = @target_equip.index
  421.             if @target_equip.disabled?(actor)
  422.                 # Play buzzer SE
  423.                 $game_system.se_play($data_system.buzzer_se)
  424.                 return
  425.             end
  426.            
  427.             if @item.is_a?(RPG::Weapon)
  428.                 equipped = $data_weapons[$game_party.actors[actor].weapon_id]
  429.                 type = "w"
  430.                 itemKind = 0
  431.             elsif @item.is_a?(RPG::Armor)
  432.                 type = "a"
  433.                 itemKind = $data_armors[@item.id].kind + 1 # +1 because weapons are already at index 0
  434.                 case $data_armors[@item.id].kind
  435.                 when 0
  436.                     equipped = $data_armors[$game_party.actors[actor].armor1_id]
  437.                 when 1
  438.                     equipped = $data_armors[$game_party.actors[actor].armor2_id]
  439.                 when 2
  440.                     equipped = $data_armors[$game_party.actors[actor].armor3_id]
  441.                 when 3
  442.                     equipped = $data_armors[$game_party.actors[actor].armor4_id]
  443.                 end
  444.             else
  445.                 equipped = nil
  446.             end
  447.            
  448.             # Check to see if the equipped item and the select item are the same, if
  449.             # so pretend to switch
  450.             if equipped.id == @item.id
  451.                 # Play equip SE
  452.                 $game_system.se_play($data_system.equip_se)
  453.                 @grid.active = true
  454.                 @target_equip.visible = false
  455.                 @target_equip.active = false
  456.                 @call_methods = ""
  457.                 return
  458.             end
  459.            
  460.             # if actor has an item equipped, we need a grid space verification
  461.             if equipped != nil
  462.                 gridFull = @grid.checkWithoutDeleting(@item.id, type, equipped.id)
  463.             end
  464.            
  465.             if !gridFull || equipped == nil
  466.                 # Play equip SE
  467.                 $game_system.se_play($data_system.equip_se)
  468.                 @grid.delete_item
  469.                 $game_party.actors[actor].grid_equip(itemKind, @item == nil ? 0 : @item.id)
  470.                 $game_party.eraseData(type, @item.id, 1)
  471.                 @grid.refresh
  472.                 @grid.active = true
  473.                 @target_equip.visible = false
  474.                 @target_equip.active = false
  475.                 @call_methods = ""
  476.                 return
  477.             else
  478.                 # Play buzzer SE
  479.                 $game_system.se_play($data_system.buzzer_se)
  480.             end
  481.            
  482.             if Input.trigger?(Input::B)
  483.                 # Play cancel SE
  484.                 $game_system.se_play($data_system.cancel_se)
  485.                 @call_methods = ""
  486.                 return
  487.             end
  488.             return
  489.         end
  490.     end
  491.    
  492.     #--------------------------------------------------------------------------
  493.     # * Frame Update (when moving item)
  494.     #--------------------------------------------------------------------------
  495.     def move_item
  496.         if @grid.item != nil
  497.             @grid.get_item
  498.             # Setting the bitmaps for the Cursor_Icon
  499.             if Grid_Variables::USE_BIG_ICONS
  500.                 bitmap = Bitmap.new(@grid.itemWidth * 32, @grid.itemHeight * 32)
  501.                 x, y = 0, 0
  502.             else
  503.                 bitmap = Bitmap.new(32,32)
  504.                 x, y = 4 + ((@grid.itemWidth * 32) / 2) - 16, 4 + ((@grid.itemHeight * 32) / 2) - 16
  505.             end
  506.            
  507.            
  508.             bitmap.blt(0,0,@grid.contents,Rect.new(@grid.cursor_rect.x + x,
  509.                     @grid.cursor_rect.y + y,@grid.cursor_rect.width,@grid.cursor_rect.height))
  510.            
  511.             @cursor_icon.refresh(bitmap, @grid.itemWidth, @grid.itemHeight)
  512.             @grid.cursor_rect.width = @cursor_icon.bitmap.width
  513.             @grid.cursor_rect.height = @cursor_icon.bitmap.height
  514.             @cursor_icon.x = @grid.cursor_rect.x + @grid.x + 16
  515.             @cursor_icon.y = @grid.cursor_rect.y + @grid.y + 16
  516.             @cursor_icon.visible = true
  517.             @grid.delete_item
  518.             @moving_item = true
  519.             @call_methods = "move2"
  520.         end
  521.         return
  522.     end
  523.    
  524.     #--------------------------------------------------------------------------
  525.     # * Frame Update (when replacing item)
  526.     #--------------------------------------------------------------------------
  527.     def replace_item
  528.         @grid.updateItemSize
  529.         @grid.get_item2
  530.         @grid.delete_item_replace
  531.         @grid.redraw_item("replace")
  532.         @grid.transfer_get
  533.        
  534.         @grid.updateItemSizeFirstDraw(@grid.item_saved[0], @grid.item_saved[1])
  535.         if @grid.item_saved[1] == "i" || @grid.item_saved[1] == "w" || @grid.item_saved[1] == "a"
  536.             bitmap = RPG::Cache.icon(Grid_Variables::BIG_ICONS_PREFIX + @grid.item(@grid.item_saved[1], @grid.item_saved[0]).icon_name)
  537.         else
  538.             bitmap = Bitmap.new(@grid.itemWidth * 32, @grid.itemHeight * 32)
  539.         end
  540.        
  541.         if Grid_Variables::USE_BIG_ICONS
  542.             x, y = 0, 0
  543.         else
  544.             x, y = 4 + ((@grid.itemWidth * 32) / 2) - 16, 4 + ((@grid.itemHeight * 32) / 2) - 16
  545.         end
  546.        
  547.         bitmap.blt(0,0,Bitmap.new(@grid.itemWidth * 32, @grid.itemHeight * 32),Rect.new(@grid.item_saved[2] + x,
  548.                 @grid.item_saved[3] + y,@grid.cursor_rect.width,@grid.cursor_rect.height))
  549.        
  550.         @cursor_icon.refresh(bitmap, @grid.itemWidth, @grid.itemHeight)
  551.         @grid.cursor_rect.width = @cursor_icon.bitmap.width
  552.         @grid.cursor_rect.height = @cursor_icon.bitmap.height
  553.         @cursor_icon.x = @grid.cursor_rect.x + @grid.x + 16
  554.         @cursor_icon.y = @grid.cursor_rect.y + @grid.y + 16
  555.         @cursor_icon.visible = true
  556.         @moving_item2 = true
  557.         @call_methods = "move2"
  558.     end
  559.    
  560.     #--------------------------------------------------------------------------
  561.     # * Managing the Cursor_Icon and waiting for input
  562.     #--------------------------------------------------------------------------
  563.     def update_move2
  564.         if Input.trigger?(Input::B)
  565.             if !@moving_item2 # blocks esc if moving a replaced item
  566.                 # Play cancel SE
  567.                 $game_system.se_play($data_system.cancel_se)
  568.                 # Switch to menu screen
  569.                 @grid.redraw_item(false)
  570.                 #@grid.mode = 1
  571.                 @call_methods = "cancel moving"
  572.                 @moving_item = false
  573.                 return
  574.             elsif @moving_item2 && !Grid_Variables::ALLOW_ESC_REPLACING
  575.                 $game_system.se_play($data_system.cancel_se)
  576.                 if !$game_party.isGridFull?(@grid.item_saved[0], @grid.item_saved[1])
  577.                     pos = $game_party.set_item(@grid.item_saved[0], @grid.item_saved[1], true)
  578.                     @grid.draw_item(@grid.item_saved[0], @grid.item_saved[1], pos[0] , pos[1])
  579.                 else
  580.                     $game_party.eraseData(@grid.item_saved[1], @grid.item_saved[0], 1)
  581.                 end
  582.                 @call_methods = "cancel moving"
  583.                 @moving_item = false
  584.                 @moving_item2 = false
  585.             else
  586.                 $game_system.se_play($data_system.buzzer_se)
  587.             end
  588.         end
  589.        
  590.         @grid.cursor_rect.width = @cursor_icon.bitmap.width
  591.         @grid.cursor_rect.height = @cursor_icon.bitmap.height
  592.         @cursor_icon.x = @grid.cursor_rect.x + @grid.x + 16
  593.         @cursor_icon.y = @grid.cursor_rect.y + @grid.y + 16
  594.        
  595.         if @grid.empty?
  596.             @cursor_icon.blink_on
  597.             @cursor_icon.tone.set(155,0,0,0)
  598.         else
  599.             @cursor_icon.blink_off
  600.             @cursor_icon.tone.set(155,0,0,255)
  601.         end
  602.        
  603.         if Input.trigger?(Input::C)
  604.             empty = @grid.empty?           
  605.             if empty == true
  606.                 @grid.redraw_item
  607.                 @cursor_icon.visible = false
  608.                
  609.                 # Play equip SE
  610.                 $game_system.se_play($data_system.equip_se)
  611.                
  612.                 @call_methods = ""
  613.                 @moving_item = false
  614.                 @moving_item2 = false
  615.             elsif empty == "replace"
  616.                 # Play equip SE
  617.                 $game_system.se_play($data_system.equip_se)
  618.                 @call_methods = ""
  619.                 replace_item
  620.             else
  621.                 $game_system.se_play($data_system.buzzer_se)
  622.             end
  623.             return
  624.         end
  625.     end
  626. end
  627.  
  628. #===============================================================================#
  629. # This edit removes the [#x#] from the item name, and passes it to $data_grid
  630. #===============================================================================#
  631. class Scene_Title
  632.     alias old_main main
  633.     def main
  634.         old_main
  635.        
  636.         $data_grid = [], [], [] # index 0: items, 1: weapons, 2: armors
  637.        
  638.         # Looping three times, each time for a different item type
  639.         for i in 0..2
  640.             case i
  641.             when 0
  642.                 type = $data_items
  643.             when 1
  644.                 type = $data_weapons
  645.             when 2
  646.                 type = $data_armors
  647.             end
  648.            
  649.             # Editing the item name and adding the item size to the grid
  650.             for j in 0..type.length - 1
  651.                 if type[j] != nil && type[j].name[0,1] == "["
  652.                     $data_grid[i][j] = type[j].name.match(/\[(.*)\]/)[1]
  653.                     type[j].name = type[j].name.gsub(/\[(.*)\]/, "").lstrip
  654.                 end
  655.             end
  656.         end
  657.     end
  658. end
  659.  
  660. #===============================================================================#
  661. # This edit is to avoid losing money when buying more itens than you can carry.
  662. # You will only be able to buy a number of items until your inventory is full,
  663. # and you will only be charged for those items.
  664. #===============================================================================#
  665. class Scene_Shop
  666.     #--------------------------------------------------------------------------
  667.     # * Frame Update
  668.     #--------------------------------------------------------------------------
  669.     def buy_item(item, number)
  670.         if !$game_party.isGridFull?(item.id, "", item)
  671.            
  672.             case item
  673.             when RPG::Item
  674.                 amountBought = $game_party.gain_item(item.id, number)
  675.             when RPG::Weapon
  676.                 amountBought = $game_party.gain_weapon(item.id, number)
  677.             when RPG::Armor
  678.                 amountBought = $game_party.gain_armor(item.id, number)
  679.             end
  680.            
  681.             if amountBought != nil
  682.                 number = amountBought - 1
  683.             end
  684.            
  685.             $game_party.lose_gold(number * @item.price)
  686.             $game_system.se_play($data_system.shop_se)
  687.         else
  688.             $game_system.se_play($data_system.buzzer_se)
  689.             @buy_window.gridFull
  690.         end
  691.     end
  692.    
  693.     # Edit to use buy_item instead of the default way
  694.     def update_number
  695.         if Input.trigger?(Input::B)
  696.             $game_system.se_play($data_system.cancel_se)
  697.             @number_window.active = false
  698.             @number_window.visible = false
  699.             case @command_window.index
  700.             when 0  # Buy
  701.                 @buy_window.active = true
  702.                 @buy_window.visible = true
  703.             when 1  # Sell
  704.                 @sell_window.active = true
  705.                 @sell_window.visible = true
  706.                 @status_window.visible = false
  707.             end
  708.             return
  709.         end
  710.         if Input.trigger?(Input::C)
  711.             @number_window.active = false
  712.             @number_window.visible = false
  713.             case @command_window.index
  714.             when 0  # Buy
  715.                 buy_item(@item, @number_window.number)
  716.                 @gold_window.refresh
  717.                 @status_window.refresh
  718.                 @buy_window.active = true
  719.                 @buy_window.visible = true
  720.             when 1  # Sell
  721.                 $game_system.se_play($data_system.shop_se)
  722.                 $game_party.gain_gold(@number_window.number * (@item.price / 2))
  723.                 case @item
  724.                 when RPG::Item
  725.                     $game_party.lose_item(@item.id, @number_window.number)
  726.                 when RPG::Weapon
  727.                     $game_party.lose_weapon(@item.id, @number_window.number)
  728.                 when RPG::Armor
  729.                     $game_party.lose_armor(@item.id, @number_window.number)
  730.                 end
  731.                 @gold_window.refresh
  732.                 @sell_window.refresh
  733.                 @status_window.refresh
  734.                 @sell_window.active = true
  735.                 @sell_window.visible = true
  736.                 @status_window.visible = false
  737.             end
  738.             return
  739.         end
  740.     end
  741. end
  742.  
  743. #===============================================================================#
  744. # This edit is to show "Inventory is full!" on the shop help window
  745. #===============================================================================#
  746. class Window_ShopBuy < Window_Selectable
  747.     def update_help
  748.         # Removing the message if player presses up or down
  749.         if @gridIsFull
  750.             if Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN)
  751.                 @gridIsFull = false
  752.             end
  753.         end
  754.        
  755.         @help_window.set_text(self.item == nil ? "" : self.item.description)
  756.         @help_window.set_text("Inventory is full!") if @gridIsFull
  757.     end
  758.    
  759.     # Setting this for remote access later
  760.     def gridFull
  761.         @gridIsFull = true
  762.     end
  763. end
  764.  
  765. #===============================================================================#
  766. # This edit is to show "Inventory is full!" on the equip help window
  767. #===============================================================================#
  768. class Scene_Equip
  769.     def update_item
  770.         # Se o botão B for pressionado
  771.         if Input.trigger?(Input::B)
  772.             # Reproduzir SE de cancelamento
  773.             $game_system.se_play($data_system.cancel_se)
  774.             # Ativar janela da direita
  775.             @right_window.active = true
  776.             @item_window.active = false
  777.             @item_window.index = -1
  778.             return
  779.         end
  780.         # Se o botão C for pressionado
  781.         if Input.trigger?(Input::C)
  782.             # Reproduzir SE de Equipamento
  783.             $game_system.se_play($data_system.equip_se)
  784.             # Selecionar dados escolhidos na janela de Item
  785.             item = @item_window.item
  786.             # Mudar Equipamento
  787.             equip = @actor.equip(@right_window.index, item == nil ? 0 : item.id)
  788.             @right_window.gridFull if equip == nil
  789.             # Ativar janela da direita
  790.             @right_window.active = true
  791.             @item_window.active = false
  792.             @item_window.index = -1
  793.             # Recriar os conteúdos da janela de Itens e da direita
  794.             @right_window.refresh
  795.             @item_window.refresh
  796.             return
  797.         end
  798.     end
  799. end
  800.  
  801. #===============================================================================#
  802. # Same as above
  803. #===============================================================================#
  804. class Window_EquipRight < Window_Selectable
  805.     def update_help
  806.         if @gridIsFull
  807.             if Input.trigger?(Input::UP) || Input.trigger?(Input::DOWN)
  808.                 @gridIsFull = false
  809.             end
  810.         end
  811.         @help_window.set_text(self.item == nil ? "" : self.item.description)
  812.         @help_window.set_text("Inventory is full!") if @gridIsFull
  813.     end
  814.    
  815.     def gridFull
  816.         @gridIsFull = true
  817.     end
  818. end
  819.  
  820. #===============================================================================#
  821. # This is an edit to enable a command window item after it has been disabled. As
  822. # far as I know there is no default way to do this.
  823. #===============================================================================#
  824. class Window_Command < Window_Selectable
  825.     def enable_item(index)
  826.         draw_item(index, normal_color)
  827.     end
  828. end
  829.  
  830. #===============================================================================#
  831. # This edit changes the behavior of Window_Selectable if the grid is active
  832. #===============================================================================#
  833. class Window_Selectable < Window_Base
  834.     alias old_initialize initialize
  835.     def initialize(x, y, width, height)
  836.         old_initialize(x, y, width, height)
  837.         if self.is_a?(Window_Grid)
  838.             @x = 0
  839.             @y = 0
  840.         end
  841.     end
  842.    
  843.     alias old_update update
  844.     def update
  845.         if !self.is_a?(Window_Grid)
  846.             old_update
  847.             return
  848.         end
  849.         super
  850.        
  851.         item = $game_party.actors[@actor_index].item_grid
  852.        
  853.         # If cursor is movable
  854.         if self.active and @x >= 0 
  855.             # Using special directional commands if the user is moving an item. Without
  856.             # this sometimes you might get crashes when moving items, since the script
  857.             # can "teleport" your cursor to a coordinate that doesn't exists.
  858.             if self.movingItem?
  859.                 if Input.repeat?(Input::DOWN)
  860.                     if @y == item.size - @itemHeight
  861.                         @y = 0
  862.                     else
  863.                         @y += 1
  864.                     end
  865.                    
  866.                     $game_system.se_play($data_system.cursor_se)
  867.                 end
  868.                 if Input.repeat?(Input::UP)
  869.                     if @y == 0
  870.                         @y = item.size - @itemHeight
  871.                     else
  872.                         @y -= 1
  873.                     end
  874.                    
  875.                     $game_system.se_play($data_system.cursor_se)
  876.                 end
  877.                 if Input.repeat?(Input::RIGHT)
  878.                     if @x == item[@y].size - @itemWidth
  879.                         @x = 0
  880.                     else
  881.                         @x += 1
  882.                     end
  883.                     $game_system.se_play($data_system.cursor_se)
  884.                 end
  885.                 if Input.repeat?(Input::LEFT)
  886.                     if @x == 0
  887.                         @x = item[@y].size - @itemWidth
  888.                     else
  889.                         @x -= 1
  890.                     end
  891.                    
  892.                     $game_system.se_play($data_system.cursor_se)
  893.                 end
  894.             else
  895.                 # This makes the cursor select the entire item, no matter which slot it
  896.                 # is in
  897.                 if item[@y][@x][1][0,1] == "["
  898.                     itemSplit = item[@y][@x][1].gsub(/[\[\]]/, "").split('x')
  899.                     iH = itemSplit[0].to_i
  900.                     iW = itemSplit[1].to_i
  901.                     @x -= iW
  902.                     @y -= iH
  903.                 end
  904.                
  905.                 if Input.repeat?(Input::DOWN)
  906.                     # if @y is at the last tile or above an item that is covering the last
  907.                     # tile (and this item exists)
  908.                     if @y == item.size - 1 || (@y == item.size - @itemHeight && item[@y][@x][1] != "")
  909.                         @y = 0
  910.                     else
  911.                         @y += item[@y][@x][1] != "" ? @itemHeight : 1 #if the current slot is an item, add the item height, else add 1
  912.                     end
  913.                    
  914.                     $game_system.se_play($data_system.cursor_se)
  915.                 end
  916.                
  917.                 if Input.repeat?(Input::UP)
  918.                     # since whenever the item is selected the @y goes to the top tile,
  919.                     # there's no need for special checks
  920.                     if @y == 0
  921.                         @y = item.size - 1
  922.                     else
  923.                         @y -= 1
  924.                     end
  925.                    
  926.                     $game_system.se_play($data_system.cursor_se)
  927.                 end
  928.                
  929.                 if Input.repeat?(Input::RIGHT)
  930.                     # if @x is at the last tile or above an item that is covering the last
  931.                     # tile (and this item exists)
  932.                     if @x == item[@y].size - 1 || (@x == item[@y].size - @itemWidth && item[@y][@x][1] != "")
  933.                         @x = 0
  934.                     else
  935.                         @x += item[@y][@x][1] != "" ? @itemWidth : 1 #if the current slot is an item, add the item height, else add 1
  936.                     end
  937.                    
  938.                     $game_system.se_play($data_system.cursor_se)
  939.                 end
  940.                
  941.                 if Input.repeat?(Input::LEFT)
  942.                     # since whenever the item is selected the @x goes to the top-left tile,
  943.                     # there's no need for special checks
  944.                     if @x == 0
  945.                         @x = item[@y].size - 1
  946.                     else
  947.                         @x -= 1
  948.                     end
  949.                    
  950.                     $game_system.se_play($data_system.cursor_se)
  951.                 end
  952.             end
  953.         end
  954.         # Update help text (update_help is defined by the subclasses)
  955.         if self.active and @help_window != nil
  956.             update_help
  957.         end
  958.         # Update cursor rectangle
  959.         update_cursor_rect
  960.     end
  961.    
  962.     def hide_cursor
  963.         self.cursor_rect.empty
  964.     end
  965. end
  966.  
  967. #===============================================================================#
  968. # The main grid window
  969. #===============================================================================#
  970. class Window_Grid < Window_Selectable
  971.    
  972.     attr_accessor :mode
  973.     attr_reader :itemWidth
  974.     attr_reader :itemHeight
  975.     attr_reader :item_saved
  976.     attr_reader :item_saved2
  977.    
  978.     def initialize(actor_index)
  979.         # This will center the grid. Feel free to edit it if you don't want that
  980.         super((640/2)-(((Grid_Variables::GRID_WIDTH * 32) + 32) / 2), # x
  981.             32 + (480 / 2) - (((Grid_Variables::GRID_HEIGHT * 32) + 32) / 2), # y
  982.             (Grid_Variables::GRID_WIDTH * 32)+33, # width
  983.             (Grid_Variables::GRID_HEIGHT * 32)+33) # height
  984.        
  985.         self.contents = Bitmap.new(width - 32, height - 32)
  986.         self.opacity = 0
  987.         # This window does nothing, it's there just to replace the otherwise black
  988.         # background.
  989.         @dummy_window = Window_Base.new(0, 64, 640, 480 - 64)
  990.         @dummy_window.z = 0
  991.         @window = Window_Base.new(x , y , width, height)
  992.         @window.contents = Bitmap.new(width - 32, height - 32)
  993.         @window.z = self.z - 4
  994.         @window.opacity = 0
  995.         @grid_color = Sprite.new
  996.         @grid_color.bitmap = Bitmap.new(width - 32, height - 32)
  997.         @grid_color.x = self.x + 16
  998.         @grid_color.y = self.y + 16
  999.         @grid_color.z = @window.z + 2
  1000.         @actor_index = actor_index
  1001.         @mode = 0
  1002.         @mini_help = Mini_Help.new
  1003.         self.set = -1
  1004.         n = self.contents.width / 32
  1005.         m = self.contents.height / 32
  1006.         @column_max = n
  1007.         draw_grid
  1008.         @itemWidth = 1
  1009.         @itemHeight = 1
  1010.         @movingItem = false
  1011.         refresh
  1012.     end
  1013.    
  1014.     def draw_grid
  1015.         gridHeight = Grid_Variables::GRID_HEIGHT * 32
  1016.         gridWidth = Grid_Variables::GRID_WIDTH * 32
  1017.         # Creates the window bg
  1018.         @window.contents.blt(0, 0, Grid_Variables::GRID_BG_LOCATION, Rect.new(0, 0, gridWidth, gridHeight))
  1019.         i = 0
  1020.         color = Color.new(150,150,150)
  1021.         while i <= gridHeight
  1022.             draw_line(-1, i, gridWidth + 1, i, color)
  1023.             i += 32
  1024.         end
  1025.         i = 0
  1026.         while i <= gridWidth
  1027.             draw_line(i, 0, i, gridHeight, color)
  1028.             i += 32
  1029.         end
  1030.     end
  1031.    
  1032.     def draw_line(sx, sy, ex, ey, color)
  1033.         rad = Math.atan2(ey-sy, ex-sx)
  1034.         dx = Math.cos(rad)
  1035.         dy = Math.sin(rad)
  1036.         while (sx - ex).abs > 1 || (sy - ey).abs > 1
  1037.             sx += dx
  1038.             sy += dy
  1039.             @window.contents.set_pixel(sx, sy, color)
  1040.         end
  1041.     end
  1042.    
  1043.     def refresh
  1044.         @item_max = 0
  1045.         item = $game_party.actors[@actor_index].item_grid
  1046.         for i in 0..item.size - 1
  1047.             for j in 0..item[i].size - 1
  1048.                 if item[i][j][0] == 0 and (item[i][j][1] == "i" or item[i][j][1] == "w" or item[i][j][1] == "a")
  1049.                     @item_max += 1
  1050.                 end
  1051.             end
  1052.         end
  1053.        
  1054.         for i in 0..item.size - 1
  1055.             for j in 0..item[i].size - 1
  1056.                 draw_item(item[i][j][0], item[i][j][1], i , j)
  1057.             end
  1058.         end
  1059.     end
  1060.    
  1061.     # Updates the @movingItem variable. Mostly used on remote access
  1062.     def movingItemUpdate(moving_item)
  1063.         @movingItem = moving_item
  1064.     end
  1065.    
  1066.     # Returns true or false, depending on @movingItem. Mostly used on remote access
  1067.     def movingItem?
  1068.         movingItemUpdate(@movingItem)
  1069.         return @movingItem
  1070.     end
  1071.    
  1072.    
  1073.     def update_cursor_rect
  1074.         # @x is the cursor's x
  1075.         if @x < 0
  1076.             self.cursor_rect.empty
  1077.             return
  1078.         end
  1079.        
  1080.         # Assign the parameters in the item's name to the cursor
  1081.         if item != nil
  1082.             updateItemSize if !@movingItem
  1083.             cursor_width = @itemWidth * 32
  1084.             cursor_height = @itemHeight * 32
  1085.         else
  1086.             # Default values in case the item name has no parameters
  1087.             case $game_party.actors[@actor_index].item_grid[@y][@x][1]
  1088.             when "i" # Item, uses 1x1
  1089.                 cursor_width = 32
  1090.                 cursor_height = 32
  1091.             when "w" # Weapon, uses 1x3
  1092.                 cursor_width = 32
  1093.                 cursor_height = 96
  1094.             when "a" # Armor, uses 2x3
  1095.                 cursor_width = 64
  1096.                 cursor_height = 96
  1097.             else
  1098.                 cursor_width = 32
  1099.                 cursor_height = 32
  1100.             end
  1101.         end
  1102.        
  1103.        
  1104.         # Calculate cursor coordinates
  1105.         x = @x * 32
  1106.         y = @y * 32
  1107.        
  1108.         # Update cursor rectangle
  1109.         self.cursor_rect.set(x, y, cursor_width, cursor_height)
  1110.     end
  1111.    
  1112.     # Deletes the item from the grid. If removeData is true, also removes the item
  1113.     # from inventory.
  1114.     def delete_item(removeData = false)
  1115.         type = $game_party.actors[@actor_index].item_grid[@y][@x][1]
  1116.         item_id = $game_party.actors[@actor_index].item_grid[@y][@x][0]
  1117.         if type != ""   || type[0,1] != "["
  1118.             iH, iW = 0, 0
  1119.             @grid_color.bitmap.fill_rect(@x*32+1, @y*32+1, (@itemWidth * 32) - 1, (@itemHeight * 32) - 1, Color.new(0,0,0,0))
  1120.             self.contents.fill_rect(@x*32, @y*32, @itemWidth*32, @itemHeight*32, Color.new(0,0,0,0))
  1121.            
  1122.             for iH in 0...@itemHeight.to_i
  1123.                 for iW in 0...@itemWidth.to_i
  1124.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = 0
  1125.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = ""
  1126.                     #iW = 0
  1127.                 end
  1128.             end
  1129.         end
  1130.        
  1131.         if removeData
  1132.             $game_party.eraseData(type, item_id, 1)
  1133.         end
  1134.     end
  1135.    
  1136.     # This is a special delete_item, using the @item_saved array as parameters
  1137.     def delete_item_replace
  1138.         item_id = @item_saved2[0]
  1139.         type = @item_saved2[1]
  1140.         itemX = @item_saved2[2]
  1141.         itemY = @item_saved2[3]
  1142.         if type != ""                  
  1143.             updateItemSizeFirstDraw(item_id, type)
  1144.             @grid_color.bitmap.fill_rect((itemX)*32+1, (itemY)*32+1, (@itemWidth * 32) - 1, (@itemHeight * 32) - 1, Color.new(0,0,0,0))
  1145.             self.contents.fill_rect((itemX)*32, (itemY)*32, @itemWidth*32, @itemHeight*32, Color.new(0,0,0,0))
  1146.            
  1147.             for iH in 0...@itemHeight.to_i
  1148.                 for iW in 0...@itemWidth.to_i
  1149.                     $game_party.actors[@actor_index].item_grid[itemY + iH][itemX + iW][0] = 0
  1150.                     $game_party.actors[@actor_index].item_grid[itemY + iH][itemX + iW][1] = ""
  1151.                 end
  1152.             end
  1153.         end
  1154.     end
  1155.    
  1156.     # This iis a method for the grid equip feature. It "pretends" to delete the
  1157.     # item to see if there is enough space to unequip the equipped item.
  1158.     def checkWithoutDeleting(item_id, type, equip_id)
  1159.         for iH in 0...@itemHeight.to_i
  1160.             for iW in 0...@itemWidth.to_i
  1161.                 $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = 0
  1162.                 $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = ""
  1163.             end
  1164.         end
  1165.        
  1166.         flag = $game_party.isGridFull?(equip_id, type)
  1167.        
  1168.         for iH in 0...@itemHeight.to_i
  1169.             for iW in 0...@itemWidth.to_i
  1170.                 if iH == 0 && iW == 0
  1171.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = item_id
  1172.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = type
  1173.                 else
  1174.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = item_id
  1175.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = "[#{iH}x#{iW}]"  
  1176.                 end
  1177.             end
  1178.         end
  1179.         return flag
  1180.     end
  1181.    
  1182.     # Updating the @itemWidth and @itemHeight variables
  1183.     def updateItemSize
  1184.         if item != nil && itemSize != nil
  1185.             gridValues = itemSize.split('x')
  1186.             @itemWidth = gridValues[0].to_i
  1187.             @itemHeight = gridValues[1].to_i
  1188.         else
  1189.             @itemWidth = 0
  1190.             @itemHeight = 0
  1191.         end
  1192.     end
  1193.    
  1194.     # Manually updating the @itemWidth and @itemHeight variables.
  1195.     def updateItemSizeFirstDraw(item_id, type)
  1196.         item = itemSize(item_id, type)
  1197.        
  1198.         if item != nil
  1199.             gridValues = item.split('x')
  1200.             @itemWidth = gridValues[0].to_i
  1201.             @itemHeight = gridValues[1].to_i
  1202.         end
  1203.     end
  1204.    
  1205.     # Checking the item type and returning the correct $data
  1206.     def item(type = nil, id = nil)
  1207.         if type == nil && id == nil
  1208.             id = $game_party.actors[@actor_index].item_grid[@y][@x][0]
  1209.             type = $game_party.actors[@actor_index].item_grid[@y][@x][1]
  1210.         end
  1211.        
  1212.         case type
  1213.         when "i"
  1214.             return $data_items[id]
  1215.         when "w"
  1216.             return $data_weapons[id]
  1217.         when "a"
  1218.             return $data_armors[id]
  1219.         else
  1220.             return nil
  1221.         end
  1222.     end
  1223.    
  1224.     # Returns the item size from the $data_grid variables
  1225.     def itemSize(id = nil, type = nil)
  1226.         if type == nil && id == nil
  1227.             id = $game_party.actors[@actor_index].item_grid[@y][@x][0]
  1228.             type = $game_party.actors[@actor_index].item_grid[@y][@x][1]
  1229.         end
  1230.        
  1231.         case type
  1232.         when "i"
  1233.             return $data_grid[0][id]
  1234.         when "w"
  1235.             return $data_grid[1][id]
  1236.         when "a"
  1237.             return $data_grid[2][id]
  1238.         else return nil
  1239.         end
  1240.     end
  1241.    
  1242.     # Checking if the item is unusable or not, I guess. This was here on the
  1243.     # original script
  1244.     def item_del?
  1245.         if $game_party.actors[@actor_index].item_grid[@y][@x][0] == 0
  1246.             # Unusable
  1247.             return true
  1248.         else
  1249.             return false
  1250.         end
  1251.     end
  1252.    
  1253.     def dispose
  1254.         super
  1255.         @window.dispose
  1256.         @dummy_window.dispose
  1257.         @grid_color.dispose
  1258.         @mini_help.dispose
  1259.     end
  1260.    
  1261.     # Updating the help window (with item description) and the mini_help (with
  1262.     # item name)
  1263.     def update_help
  1264.         @mini_help.contents.font.color = (($game_party.item_can_use?(item.id) || !item.is_a?(RPG::Item))? normal_color : disabled_color)
  1265.         @help_window.set_text((item == nil || movingItem? == true) ? "" : item.description)
  1266.         @mini_help.set_text(item == nil ? "" : item.name)
  1267.         @mini_help.visible = false if item == nil || movingItem?
  1268.        
  1269.         @mini_help.x = self.x + (self.cursor_rect.x + 16) - (@mini_help.width / 2) + (self.cursor_rect.width / 2)
  1270.         @mini_help.y = self.y + (self.cursor_rect.y + 16) + (self.cursor_rect.height)
  1271.        
  1272.         if !Grid_Variables::MINIHELP_CAN_BE_OUTSIDE_GRID
  1273.             @mini_help.x += (@mini_help.x - self.x - 16) * -1 if @mini_help.x < self.x + 16 # -16 to make it look good even if you hide the windowskin
  1274.             @mini_help.x -= (@mini_help.x + @mini_help.width) - (self.x + self.width - 16) if @mini_help.x + @mini_help.width >= self.x + self.width - 16
  1275.             @mini_help.y -= self.cursor_rect.height + @mini_help.height - 1 if @mini_help.y + @mini_help.height >= self.y + self.height - 16
  1276.         end
  1277.     end
  1278.    
  1279.     # Stores the item data on an array, and keeps them safe while moving the item.
  1280.     def get_item
  1281.         @item_saved = [$game_party.actors[@actor_index].item_grid[@y][@x][0],
  1282.             $game_party.actors[@actor_index].item_grid[@y][@x][1], @x, @y]
  1283.     end
  1284.    
  1285.     # Same thing as above, but with some added precautions to make sure it gets
  1286.     # the   right @x and @y. Used for the replace item method.
  1287.     def get_item2
  1288.         updateItemSizeFirstDraw(@item_saved[0], @item_saved[1])
  1289.        
  1290.         iH, iW = 0, 0
  1291.         if $game_party.actors[@actor_index].item_grid[@y][@x][0] == 0
  1292.             for iW in 0...@itemWidth.to_i
  1293.                 for iH in 0...@itemHeight.to_i
  1294.                     if $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] != 0
  1295.                         break
  1296.                     end
  1297.                 end
  1298.                 break if $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] != 0
  1299.             end
  1300.         end
  1301.        
  1302.         if $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1][0,1] == "["
  1303.             itemSplit = $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1].gsub(/[\[\]]/, "").split('x')
  1304.             minusH = itemSplit[0].to_i
  1305.             minusW = itemSplit[1].to_i
  1306.         else
  1307.             minusH = 0
  1308.             minusW = 0
  1309.         end
  1310.        
  1311.         item_id = $game_party.actors[@actor_index].item_grid[@y + iH - minusH][@x + iW - minusW][0]
  1312.         type = $game_party.actors[@actor_index].item_grid[@y + iH - minusH][@x + iW - minusW][1]
  1313.         @item_saved2 = [item_id, type, @x + iW - minusW, @y + iH - minusH]
  1314.     end
  1315.    
  1316.     # Clears the @item_saved and transfers the data on @item_saved2 to it  
  1317.     def transfer_get
  1318.         @item_saved = []
  1319.         @item_saved2.each{|i| @item_saved.push(i)}
  1320.     end
  1321.    
  1322.     # Redrawing used for moving items. Using @item_saved parameters if moving was
  1323.     # canceled (f = false)
  1324.     def redraw_item(f = true)
  1325.         if f
  1326.             x = 4 + (@x * 32)
  1327.             y = @y * 32
  1328.         else # the moving has been canceled
  1329.             x = 4 + (@item_saved[2] * 32)
  1330.             y = @item_saved[3] * 32
  1331.             tx = @x
  1332.             ty = @y
  1333.             @x = @item_saved[2]
  1334.             @y = @item_saved[3]
  1335.         end
  1336.        
  1337.         draw_item(@item_saved[0], @item_saved[1], @y, @x)
  1338.         for iH in 0...@itemHeight.to_i
  1339.             for iW in 0...@itemWidth.to_i
  1340.                 if iH == 0 && iW == 0
  1341.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = @item_saved[0]
  1342.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = @item_saved[1]
  1343.                 else
  1344.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0] = @item_saved[0]
  1345.                     $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1] = "[#{iH}x#{iW}]"  
  1346.                 end
  1347.             end
  1348.         end
  1349.        
  1350.         # Making the cursor go to the replaced item
  1351.         if f == "replace"
  1352.             @x = @item_saved2[2]
  1353.             @y = @item_saved2[3]
  1354.         end
  1355.        
  1356.         # Uncomment these lines if you don't want the cursor to go back with the
  1357.         # item when the player cancels moving.
  1358.         #@x = tx if @x != tx and tx != nil
  1359.         #@y = ty if @y != ty and ty != nil
  1360.     end
  1361.    
  1362.     # Checks if the cursor area is empty, and if there is more than one item on it
  1363.     def empty?
  1364.         n = 0
  1365.         arr = []
  1366.         for iH in 0...@itemHeight.to_i
  1367.             for iW in 0...@itemWidth.to_i
  1368.                 type = $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][1]
  1369.                 id = $game_party.actors[@actor_index].item_grid[@y + iH][@x + iW][0]   
  1370.                 cond = (type == "")
  1371.                 replaceable = true if !cond
  1372.                
  1373.                 if !cond && (type == "i" || type == "w" || type == "a") && arr[n-1] != "#{@y + iH},#{@x + iW}"
  1374.                     n += 1
  1375.                     arr.push("#{@y + iH},#{@x + iW}")
  1376.                 end
  1377.                 if type[0,1] == "["
  1378.                     itemSplit = type.gsub(/[\[\]]/, "").split('x')
  1379.                     minusH = itemSplit[0].to_i
  1380.                     minusW = itemSplit[1].to_i
  1381.                    
  1382.                     if arr[n-1] != "#{@y + iH - minusH},#{@x + iW - minusW}"
  1383.                         n += 1
  1384.                         arr.push("#{@y + iH - minusH},#{@x + iW - minusW}")
  1385.                     end
  1386.                 end
  1387.                 break if n >= 2
  1388.             end
  1389.             break if n >= 2
  1390.         end
  1391.         return "replace" if replaceable && n < 2
  1392.         return (n < 2 && !replaceable)
  1393.     end
  1394.    
  1395.     def set=(set)
  1396.         @x = set
  1397.         @y = set
  1398.         @mini_help.visible = (set == 0 ? true : false)
  1399.     end
  1400.    
  1401.     # Draws item graphics
  1402.     def draw_item(item_id, type, i , j)
  1403.         #~ if type == "i" and
  1404.         #~ $game_party.item_can_use?($data_items[item_id].id)
  1405.         opacity = 255
  1406.         #~ else
  1407.         #~ opacity = 128
  1408.         #~ end
  1409.        
  1410.         if item_id != 0
  1411.             x = 4 + (j * 32)
  1412.             y = i * 32
  1413.             itemWeaponArmor = item(type, item_id)
  1414.            
  1415.             case type
  1416.             when "i"
  1417.                 color = Grid_Variables::COLOR_ITEMS
  1418.             when "w"
  1419.                 color = Grid_Variables::COLOR_WEAPONS
  1420.             when "a"
  1421.                 color = Grid_Variables::COLOR_ARMORS
  1422.             end
  1423.            
  1424.             if type != "" && type[0,1] != "["
  1425.                 x = j * 32
  1426.                 y = i * 32
  1427.                 updateItemSizeFirstDraw(item_id, type)
  1428.                 bitmap = RPG::Cache.icon(Grid_Variables::BIG_ICONS_PREFIX + itemWeaponArmor.icon_name)
  1429.                
  1430.                 if Grid_Variables::USE_BIG_ICONS && (bitmap.width != 24 && bitmap.height != 24)
  1431.                     self.contents.blt(x, y, bitmap, Rect.new(0, 0, @itemWidth * 32, @itemHeight * 32), opacity)
  1432.                 else
  1433.                     x += ((@itemWidth * 32) / 2) - 16
  1434.                     y += ((@itemHeight * 32) / 2) - 16
  1435.                     self.contents.blt(x + 4, y + 4, bitmap, Rect.new(0, 0, 48, 24), opacity)
  1436.                 end
  1437.                
  1438.                 @grid_color.bitmap.fill_rect(j*32+1, i*32+1, (@itemWidth * 32) - 1, (@itemHeight * 32) - 1, color)
  1439.             end
  1440.         end
  1441.     end
  1442. end
  1443.  
  1444. #==============================================================================
  1445. # This is Window_Target, edited to darken actors that can't equip the item.
  1446. # Since there is no way to change the normal color on Window_Base, I had to
  1447. # rewrite most draw functions here.
  1448. #==============================================================================
  1449. class Window_Target_Equip < Window_Selectable
  1450.    
  1451.     def initialize
  1452.         super(0, 0, 336, 480)
  1453.         self.contents = Bitmap.new(width - 32, height - 32)
  1454.         self.contents.font.name = $fontface
  1455.         self.contents.font.size = $fontsize
  1456.         self.z += 10
  1457.         @item_max = $game_party.actors.size
  1458.         @disabled_actor = []
  1459.         refresh
  1460.     end
  1461.    
  1462.     def refresh
  1463.         self.contents.clear
  1464.         for i in 0...$game_party.actors.size
  1465.             disabled = @disabled_actor[i]
  1466.             if disabled
  1467.                 self.contents.font.color = disabled_color
  1468.             else
  1469.                 self.contents.font.color = normal_color
  1470.             end
  1471.            
  1472.             x = 4
  1473.             y = i * 116
  1474.             actor = $game_party.actors[i]
  1475.            
  1476.             # actor name
  1477.             self.contents.draw_text(x, y, 120, 32, actor.name)
  1478.            
  1479.             # actor class
  1480.             self.contents.draw_text(x + 144, y, 236, 32, actor.class_name)
  1481.            
  1482.             # actor level
  1483.             self.contents.font.color = system_color if !disabled
  1484.             self.contents.draw_text(x + 8, y + 32, 32, 32, "Lv")   
  1485.             self.contents.font.color = normal_color if !disabled
  1486.             self.contents.draw_text(x + 8 + 32, y + 32, 24, 32, actor.level.to_s, 2)
  1487.            
  1488.             # actor state
  1489.             text = make_battler_state_text(actor, width, true)
  1490.             self.contents.font.color = knockout_color if actor.hp == 0 && !disabled
  1491.             self.contents.draw_text(x + 8, y + 64, width, 32, text)
  1492.             self.contents.font.color = normal_color if actor.hp == 0 && !disabled
  1493.            
  1494.             # actor hp
  1495.             self.contents.font.color = system_color if !disabled
  1496.             self.contents.draw_text(x + 152, y + 32, 32, 32, $data_system.words.hp)
  1497.             # Checking if there is enough space for max HP
  1498.             if 144 - 32 >= 108
  1499.                 hp_x = x + 152 + 144 - 108
  1500.                 flag = true
  1501.             elsif 144 - 32 >= 48
  1502.                 hp_x = x + 152 + 144 - 48
  1503.                 flag = false
  1504.             end
  1505.             # Draw HP
  1506.             if !disabled
  1507.                 if actor.hp == 0
  1508.                     self.contents.font.color = knockout_color
  1509.                 elsif actor.hp <= actor.maxhp / 4
  1510.                     self.contents.font.color = crisis_color
  1511.                 else
  1512.                     self.contents.font.color = normal_color
  1513.                 end
  1514.             end
  1515.             self.contents.draw_text(hp_x, y + 32, 48, 32, actor.hp.to_s, 2)
  1516.             # Draw max HP
  1517.             if flag
  1518.                 self.contents.font.color = normal_color if !disabled
  1519.                 self.contents.draw_text(hp_x + 48, y + 32, 12, 32, "/", 1)
  1520.                 self.contents.draw_text(hp_x + 60, y + 32, 48, 32, actor.maxhp.to_s)
  1521.             end
  1522.            
  1523.             # actor sp
  1524.             self.contents.font.color = system_color if !disabled
  1525.             self.contents.draw_text(x + 152, y + 64, 32, 32, $data_system.words.sp)
  1526.             # Check if there is enough space for max SP
  1527.             if 144 - 32 >= 108
  1528.                 sp_x = x + 152+ 144 - 108
  1529.                 flag = true
  1530.             elsif 144 - 32 >= 48
  1531.                 sp_x = x + 152+ 144 - 48
  1532.                 flag = false
  1533.             end
  1534.             # Draw SP
  1535.             if !disabled
  1536.                 if actor.sp == 0
  1537.                     self.contents.font.color = knockout_color
  1538.                 elsif actor.sp <= actor.maxsp / 4
  1539.                     self.contents.font.color = crisis_color
  1540.                 else
  1541.                     self.contents.font.color = normal_color
  1542.                 end
  1543.             end
  1544.             self.contents.draw_text(sp_x, y + 64, 48, 32, actor.sp.to_s, 2)
  1545.             # Draw max SP
  1546.             if flag
  1547.                 self.contents.font.color = normal_color if !disabled
  1548.                 self.contents.draw_text(sp_x + 48, y + 64, 12, 32, "/", 1)
  1549.                 self.contents.draw_text(sp_x + 60, y + 64, 48, 32, actor.maxsp.to_s)
  1550.             end
  1551.         end
  1552.     end
  1553.    
  1554.     def update_cursor_rect
  1555.         # Se define a posição atual -1
  1556.         if @index < 0
  1557.             self.cursor_rect.set(0, 0, self.width - 32, @item_max * 116 - 20)
  1558.         else
  1559.             self.cursor_rect.set(0, @index * 116, self.width - 32, 96)
  1560.         end
  1561.     end
  1562.    
  1563.     def disable_actor(actor_id)
  1564.         @disabled_actor[actor_id] = true
  1565.     end
  1566.    
  1567.     def enable_actor(actor_id)
  1568.         @disabled_actor[actor_id] = false
  1569.     end
  1570.    
  1571.     def disabled?(id)
  1572.         return @disabled_actor[id]
  1573.     end
  1574. end
  1575.  
  1576. #==============================================================================
  1577. # The mini help window shows the item name below the selection cursor
  1578. #==============================================================================
  1579. class Mini_Help < Window_Base
  1580.     alias old_initialize initialize
  1581.     def initialize
  1582.         super(0, 0, 180, 43)
  1583.         self.contents = Bitmap.new(width - 32, height - 32)
  1584.         self.contents.font.size = 14
  1585.         self.back_opacity = 170
  1586.         self.z = 102
  1587.         self.visible = false
  1588.     end
  1589.    
  1590.     def set_text(text, align = 1)
  1591.         # If at least one part of text and alignment differ from last time
  1592.         if text != @text or align != @align
  1593.             # Redraw text
  1594.             self.contents.clear
  1595.             #self.contents.font.color = normal_color
  1596.             self.contents.draw_text(4, -12, self.width - 40, 32, text, align)
  1597.             #self.width = self.contents.text_size(text).width
  1598.             @text = text
  1599.             @align = align
  1600.             @actor = nil
  1601.         end
  1602.         self.visible = true
  1603.     end
  1604. end
  1605.  
  1606. #==============================================================================
  1607. # Changes the way the game handles item creation
  1608. #==============================================================================
  1609. class Game_Actor < Game_Battler
  1610.     attr_accessor :item_grid
  1611.     alias old_initialize initialize
  1612.     def initialize(actor_id)
  1613.         old_initialize(actor_id)
  1614.         @item_grid = Array.new(Grid_Variables::GRID_HEIGHT)
  1615.         for i in 0..@item_grid.size - 1
  1616.             @item_grid[i] = Array.new(Grid_Variables::GRID_WIDTH)
  1617.             for k in 0..@item_grid[i].size - 1
  1618.                 @item_grid[i][k] = Array.new(2)
  1619.                 @item_grid[i][k][0] = 0
  1620.                 @item_grid[i][k][1] = ""
  1621.             end
  1622.         end
  1623.     end
  1624.    
  1625.     # This edit is to avoid losing the item if your inventory is already full.
  1626.     def equip(equip_type, id)
  1627.         case equip_type
  1628.         when 0  # Weapons
  1629.             if id == 0 or $game_party.weapon_number(id) > 0
  1630.                 $game_party.lose_weapon(id, 1)
  1631.                 if !$game_party.isGridFull?(@weapon_id, "w") || @weapon_id == 0
  1632.                     $game_party.gain_weapon(@weapon_id, 1)
  1633.                     @weapon_id = id
  1634.                 else
  1635.                     $game_party.gain_weapon(id, 1)
  1636.                     $game_system.se_play($data_system.buzzer_se)
  1637.                     return nil
  1638.                 end
  1639.             end
  1640.         when 1  # Shield
  1641.             if id == 0 or $game_party.armor_number(id) > 0
  1642.                 $game_party.lose_armor(id, 1)
  1643.                 if !$game_party.isGridFull?(@armor1_id, "a") || @armor1_id == 0
  1644.                     update_auto_state($data_armors[@armor1_id], $data_armors[id])
  1645.                     $game_party.gain_armor(@armor1_id, 1)
  1646.                     @armor1_id = id
  1647.                 else
  1648.                     $game_party.gain_armor(id, 1)
  1649.                     return nil
  1650.                 end
  1651.             end
  1652.         when 2  # Headgear
  1653.             if id == 0 or $game_party.armor_number(id) > 0
  1654.                 $game_party.lose_armor(id, 1)
  1655.                 if !$game_party.isGridFull?(@armor2_id, "a") || @armor2_id == 0
  1656.                     update_auto_state($data_armors[@armor2_id], $data_armors[id])
  1657.                     $game_party.gain_armor(@armor2_id, 1)
  1658.                     @armor2_id = id
  1659.                 else
  1660.                     $game_party.gain_armor(id, 1)
  1661.                     return nil
  1662.                 end
  1663.             end
  1664.         when 3  # Armor
  1665.             if id == 0 or $game_party.armor_number(id) > 0
  1666.                 $game_party.lose_armor(id, 1)
  1667.                 if !$game_party.isGridFull?(@armor3_id, "a") || @armor3_id == 0
  1668.                     update_auto_state($data_armors[@armor3_id], $data_armors[id])
  1669.                     $game_party.gain_armor(@armor3_id, 1)
  1670.                     @armor3_id = id
  1671.                 else
  1672.                     $game_party.gain_armor(id, 1)
  1673.                     return nil
  1674.                 end
  1675.             end
  1676.         when 4  # Accessory
  1677.             if id == 0 or $game_party.armor_number(id) > 0
  1678.                 $game_party.lose_armor(id, 1)
  1679.                 if !$game_party.isGridFull?(@armor4_id, "a") || @armor4_id == 0
  1680.                     update_auto_state($data_armors[@armor4_id], $data_armors[id])
  1681.                     $game_party.gain_armor(@armor4_id, 1)
  1682.                     @armor4_id = id
  1683.                 else
  1684.                     $game_party.gain_armor(id, 1)
  1685.                     return nil
  1686.                 end
  1687.             end
  1688.         end
  1689.     end
  1690.    
  1691.     # Same as above, but without deleting item. This one is used for the grid equip
  1692.     def grid_equip(equip_type, id)
  1693.         case equip_type
  1694.         when 0  # Armas
  1695.             if id == 0 or $game_party.weapon_number(id) > 0
  1696.                 $game_party.gain_weapon(@weapon_id, 1)
  1697.                 @weapon_id = id
  1698.             end
  1699.         when 1  # Escudo
  1700.             if id == 0 or $game_party.armor_number(id) > 0
  1701.                 update_auto_state($data_armors[@armor1_id], $data_armors[id])
  1702.                 $game_party.gain_armor(@armor1_id, 1)
  1703.                 @armor1_id = id
  1704.             end
  1705.         when 2  # Elmo
  1706.             if id == 0 or $game_party.armor_number(id) > 0
  1707.                 update_auto_state($data_armors[@armor2_id], $data_armors[id])
  1708.                 $game_party.gain_armor(@armor2_id, 1)
  1709.                 @armor2_id = id
  1710.             end
  1711.         when 3  # Armadura
  1712.             if id == 0 or $game_party.armor_number(id) > 0
  1713.                 update_auto_state($data_armors[@armor3_id], $data_armors[id])
  1714.                 $game_party.gain_armor(@armor3_id, 1)
  1715.                 @armor3_id = id
  1716.             end
  1717.         when 4  # Acessório
  1718.             if id == 0 or $game_party.armor_number(id) > 0
  1719.                 update_auto_state($data_armors[@armor4_id], $data_armors[id])
  1720.                 $game_party.gain_armor(@armor4_id, 1)
  1721.                 @armor4_id = id
  1722.             end
  1723.         end
  1724.     end
  1725. end
  1726.  
  1727. #==============================================================================
  1728. # Handles most of the grid inventory functions
  1729. #==============================================================================
  1730. class Game_Party
  1731.     # These have been edited for the Scene_Shop. If it returns something, that
  1732.     # means the grid is full and it couldn't add more items, so we use that number
  1733.     # to charge for the items bought
  1734.    
  1735.     def gain_item(item_id, n)
  1736.         if item_id > 0
  1737.             if n.abs == n # if the number is a positive value, add the items
  1738.                 for k in 1..n
  1739.                     break if set_item(item_id, "i") == nil
  1740.                 end
  1741.                 return k unless k == n
  1742.             else # if the number is a negative value, remove the items
  1743.                 lose_item(item_id, n.abs)
  1744.             end
  1745.         end
  1746.     end
  1747.    
  1748.     def gain_weapon(weapon_id, n)
  1749.         if weapon_id > 0
  1750.             if n.abs == n # if the number is a positive value, add the items
  1751.                 for k in 1..n
  1752.                     break if set_item(weapon_id, "w") == nil
  1753.                 end
  1754.                 return k unless k == n
  1755.             else # if the number is a negative value, remove the items
  1756.                 lose_weapon(weapon_id, n.abs)
  1757.             end
  1758.         end
  1759.     end
  1760.    
  1761.     def gain_armor(armor_id, n)
  1762.         if armor_id > 0
  1763.             if n.abs == n # if the number is a positive value, add the items
  1764.                 for k in 1..n
  1765.                     break if set_item(armor_id, "a") == nil
  1766.                 end
  1767.                 return k unless k == n
  1768.             else # if the number is a negative value, remove the items
  1769.                 lose_armor(armor_id, n.abs)
  1770.             end
  1771.         end
  1772.     end
  1773.    
  1774.     def lose_item(item_id, n)
  1775.         if item_id > 0
  1776.             for k in 1..n
  1777.                 del_item(item_id, "i")
  1778.             end
  1779.         end
  1780.         @items[item_id] = [[item_number(item_id) + -n, 0].max, 99].min
  1781.     end
  1782.    
  1783.     def lose_weapon(weapon_id, n)
  1784.         if weapon_id > 0
  1785.             for k in 1..n
  1786.                 del_item(weapon_id, "w")
  1787.             end
  1788.         end
  1789.         @weapons[weapon_id] = [[weapon_number(weapon_id) + -n, 0].max, 99].min
  1790.     end
  1791.    
  1792.     def lose_armor(armor_id, n)
  1793.         if armor_id > 0
  1794.             for k in 1..n
  1795.                 del_item(armor_id, "a")
  1796.             end
  1797.         end
  1798.         @armors[armor_id] = [[armor_number(armor_id) + -n, 0].max, 99].min
  1799.     end
  1800.    
  1801.     # Mostly used for the delete_item method. This removes the item from the inventory.
  1802.     def eraseData(type, item_id, n)
  1803.         case type
  1804.         when "i"
  1805.             @items[item_id] = [[item_number(item_id) + -n, 0].max, 99].min
  1806.         when "w"
  1807.             @weapons[item_id] = [[weapon_number(item_id) + -n, 0].max, 99].min
  1808.         when "a"
  1809.             @armors[item_id] = [[armor_number(item_id) + -n, 0].max, 99].min
  1810.         end
  1811.     end
  1812.    
  1813.     # Update item properties
  1814.     def updateItemProp(type, item_id)
  1815.         case type
  1816.         when "i"
  1817.             name = $data_grid[0][item_id]
  1818.         when "w"
  1819.             name = $data_grid[1][item_id]
  1820.         when "a"
  1821.             name = $data_grid[2][item_id]
  1822.         else
  1823.             name = nil
  1824.         end
  1825.        
  1826.         if name != nil
  1827.             gridValues = name.split('x')
  1828.             @itemWidth = gridValues[0].to_i
  1829.             @itemHeight = gridValues[1].to_i
  1830.         end
  1831.     end
  1832.    
  1833.     # Checks if x and y are empty
  1834.     def isEmpty?(x, y)
  1835.         for iH in 0...@itemHeight.to_i
  1836.             for iW in 0...@itemWidth.to_i
  1837.                 cond = (self.actors[0].item_grid[x + iH][y + iW][0] == 0)
  1838.                 break if !cond
  1839.             end
  1840.             break if !cond
  1841.         end
  1842.         return cond
  1843.     end
  1844.    
  1845.     # Checking if there is enough space for the item on the grid
  1846.     def isGridFull?(item_id, type, item = false)
  1847.         if type == "" && item != false
  1848.             case item
  1849.             when RPG::Item
  1850.                 type = "i"
  1851.             when RPG::Weapon
  1852.                 type = "w"
  1853.             when RPG::Armor
  1854.                 type = "a"
  1855.             end
  1856.         end
  1857.        
  1858.         if item == false
  1859.             updateItemProp(type, item_id)
  1860.         else
  1861.             case type
  1862.             when "i"
  1863.                 name = $data_grid[0][item_id]
  1864.             when "w"
  1865.                 name = $data_grid[1][item_id]
  1866.             when "a"
  1867.                 name = $data_grid[2][item_id]
  1868.             else
  1869.                 name = nil
  1870.             end
  1871.            
  1872.             if name != nil
  1873.                 gridValues = name.split('x')
  1874.                 @itemWidth = gridValues[0].to_i
  1875.                 @itemHeight = gridValues[1].to_i
  1876.             end
  1877.         end
  1878.        
  1879.        
  1880.         for a in 0..self.actors[0].item_grid.size - 1
  1881.             for b in 0..self.actors[0].item_grid[a].size - 1
  1882.                 if b < self.actors[0].item_grid[a].size - (@itemWidth.to_i - 1) and a < self.actors[0].item_grid.size - (@itemHeight.to_i - 1)
  1883.                     cond = isEmpty?(a, b)
  1884.                     break if cond
  1885.                 end
  1886.             end
  1887.             break if cond
  1888.         end
  1889.         return !cond #!cond to make it return true if the grid is really full, just to avoid confusion with the method name
  1890.     end
  1891.    
  1892.     # Checking if the grid is full for multiple items
  1893.     def isGridFullMultipleItems?(arrayOfIds, types)
  1894.         # Just a little precaution, in case the user forgets the square brackets
  1895.         arrayOfIds = [arrayOfIds] if !arrayOfIds.kind_of?(Array)
  1896.        
  1897.         for i in 0..arrayOfIds.length - 1
  1898.             item_id = arrayOfIds[i]
  1899.             if types.length == 1
  1900.                 type = types
  1901.             else
  1902.                 type = types[i]
  1903.             end
  1904.            
  1905.             case type
  1906.             when "i"
  1907.                 name = $data_grid[0][item_id]
  1908.             when "w"
  1909.                 name = $data_grid[1][item_id]
  1910.             when "a"
  1911.                 name = $data_grid[2][item_id]
  1912.             else
  1913.                 name = nil
  1914.             end
  1915.            
  1916.             if name != nil
  1917.                 gridValues = name.split('x')
  1918.                 @itemWidth = gridValues[0].to_i
  1919.                 @itemHeight = gridValues[1].to_i
  1920.             end
  1921.            
  1922.             for a in 0..self.actors[0].item_grid.size - 1
  1923.                 for b in 0..self.actors[0].item_grid[a].size - 1
  1924.                     if b < self.actors[0].item_grid[a].size - (@itemWidth.to_i - 1) and a < self.actors[0].item_grid.size - (@itemHeight.to_i - 1)
  1925.                         cond = isEmpty?(a, b)
  1926.                         break if cond
  1927.                     end
  1928.                 end
  1929.                 break if cond
  1930.             end
  1931.             break if !cond
  1932.         end
  1933.         return !cond
  1934.     end
  1935.    
  1936.     # Adds the item values to the grid
  1937.     def set_item(item_id, type, returnPos = false)
  1938.         for a in 0..self.actors[0].item_grid.size - 1
  1939.             for b in 0..self.actors[0].item_grid[a].size - 1
  1940.                 updateItemProp(type, item_id)          
  1941.                 iW = 0; iH = 0
  1942.                 if b < self.actors[0].item_grid[a].size - (@itemWidth.to_i - 1) and a < self.actors[0].item_grid.size - (@itemHeight.to_i - 1)
  1943.                     if isEmpty?(a, b)
  1944.                         for iH in 0...@itemHeight.to_i
  1945.                             for iW in 0...@itemWidth.to_i
  1946.                                 if iH == 0 && iW == 0
  1947.                                     self.actors[0].item_grid[a][b][0] = item_id
  1948.                                     self.actors[0].item_grid[a][b][1] = type
  1949.                                 else
  1950.                                     self.actors[0].item_grid[a + iH][b + iW][0] = item_id
  1951.                                     self.actors[0].item_grid[a + iH][b + iW][1] = "[#{iH}x#{iW}]"  
  1952.                                 end
  1953.                             end
  1954.                         end
  1955.                         whatToReturn = ""
  1956.                         case type
  1957.                         when "i"
  1958.                             @items[item_id] = [[item_number(item_id) + 1, 0].max, 99].min
  1959.                         when "w"
  1960.                             @weapons[item_id] = [[weapon_number(item_id) + 1, 0].max, 99].min
  1961.                         when "a"
  1962.                             @armors[item_id] = [[armor_number(item_id) + 1, 0].max, 99].min
  1963.                         end
  1964.                         break
  1965.                     else
  1966.                         whatToReturn = nil
  1967.                     end
  1968.                 end
  1969.             end
  1970.             break if whatToReturn != nil
  1971.         end
  1972.        
  1973.         return [a, b] if returnPos
  1974.         return whatToReturn
  1975.     end
  1976.    
  1977.     # Deletes the item values from the grid
  1978.     def del_item(item_id, type)
  1979.         updateItemProp(type, item_id)
  1980.         for a in 0..self.actors[0].item_grid.size - 1
  1981.             for b in 0..self.actors[0].item_grid[a].size - 1
  1982.                 if self.actors[0].item_grid[a][b][0] == item_id and self.actors[0].item_grid[a][b][1] == type
  1983.                     for iH in 0...@itemHeight.to_i
  1984.                         for iW in 0...@itemWidth.to_i
  1985.                             self.actors[0].item_grid[a + iH][b + iW][0] = 0
  1986.                             self.actors[0].item_grid[a + iH][b + iW][1] = ""
  1987.                         end
  1988.                     end
  1989.                     return
  1990.                 end
  1991.             end
  1992.         end
  1993.     end
  1994. end
  1995.  
  1996. #==============================================================================
  1997. # This is the cursor used when moving the item.
  1998. #==============================================================================
  1999. class Cursor_Icon < RPG::Sprite
  2000.     def initialize
  2001.         super
  2002.         @color = Color.new(255,255,0,50)
  2003.         @rect = Rect.new(0, 0, 24, 24)
  2004.     end
  2005.    
  2006.     def refresh(bitmap, iW, iH)
  2007.         if Grid_Variables::USE_BIG_ICONS
  2008.             x = 0
  2009.             y = 0
  2010.             @rect = Rect.new(0, 0, iW*32, iH*32)   
  2011.         else
  2012.             x = 4 + ((iW * 32) / 2) - 16
  2013.             y = 4 + ((iH * 32) / 2) - 16
  2014.         end
  2015.        
  2016.         width = iW * 32
  2017.         height = iH * 32
  2018.        
  2019.         if self.bitmap == nil or (self.bitmap.width != width or self.bitmap.height != height)
  2020.             self.bitmap = Bitmap.new(width, height)
  2021.         else
  2022.             self.bitmap.clear
  2023.         end
  2024.         self.bitmap.fill_rect(0,0,width,height, @color)
  2025.         self.bitmap.blt(x, y, bitmap, @rect)
  2026.         self.z = 9999
  2027.     end
  2028. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement