Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

I've got a problem with the "diablo starter kit" inventory script

kire

Member

Hi!
I already posted this to the maker and he doesen't know how to resolve it too.
When i try to move the mace or the bow up in the inventory it gives me an error in line 680. NoMethodError. undentified method ´[]' for nil:NilClass
when "w"
      if $game_party.actors[@actor_index].item_grid[@y][@x][1] == "" and
        $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] == "" and
        $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] == ""
 

kire

Member

Here's the code

Code:
#==============================================================================
#  Item System Diablo Style
#------------------------------------------------------------------------------
#  By DarkSchneider 
#  www.rpg2s.net
#------------------------------------------------------------------------------
#  Credit to Schwarz for draw_line
#==============================================================================

class Scene_Item2
  def initialize(actor_index = 0)
    @actor_index = actor_index
  end
  
  def main
    # Make help window, item window
    s1 = "Use"
    s2 = "Move"
    s3 = "Drop"
    @command_window = Window_Command.new(193, [s1, s2 , s3])
    @command_window.y = 64
    @help_window = Window_Help.new
    @grid = Window_Grid.new(@actor_index)
    @grid.active = false
    # Associate help window
    @grid.help_window = @help_window
    # Make target window (set to invisible / inactive)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false
    @window_pc = Window_Base.new(0,192,193,287)
    @window_pc.contents = Bitmap.new(161,255)
    @window_pc.draw_actor_name($game_party.actors[@actor_index], 10, 0)
    @window_pc.draw_actor_picture($game_party.actors[@actor_index], 80, 250)
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    @cursor_icon.dispose if @cursor_icon != nil
    # Dispose of windows
    @command_window.dispose
    @help_window.dispose
    #@item_window.dispose
    @target_window.dispose
    @grid.dispose
    @window_pc.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @command_window.update
    @help_window.update
    @target_window.update
    @grid.update
    if @command_window.active
      update_command
      return
    end
    # If item window is active: call update_item
    if @grid.active
      case @grid.mode
      when 0
        update_usa
      when 1
        @cursor_icon = Cursor_Icon.new if @cursor_icon == nil
        @cursor_icon.visible = false
        update_muovi
      when 2
        update_lascia
      when 3
        @cursor_icon.update
        update_muovi2
      end
      return
    end
    # If target window is active: call update_target
    if @target_window.active
      update_target
      return
    end
  end
  
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      $scene = Scene_Menu.new(0)
    return
  end
    if Input.trigger?(Input::C)
      # Branch by command window cursor position
      case @command_window.index
      when 0  # use
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @grid.active = true
        @grid.set = 0
        @grid.mode = @command_window.index
      when 1  # move
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @grid.active = true
        @grid.set = 0
        @grid.mode = @command_window.index
      when 2  # drop
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @grid.active = true
        @grid.set = 0
        @grid.mode = @command_window.index
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when item window is active)
  #--------------------------------------------------------------------------
  def update_usa
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      @command_window.active = true
      @grid.active = false
      @grid.set = - 1
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get currently selected data on the item window
      @item = @grid.item
      # If not a use item
      unless @item.is_a?(RPG::Item)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If it can't be used
      unless $game_party.item_can_use?(@item.id)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # If effect scope is an ally
      if @item.scope >= 3
        # Activate target window
        @grid.active = false
        #@target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        # Set cursor position to effect scope (single / all)
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # If effect scope is other than an ally
      else
        # If command event ID is valid
        if @item.common_event_id > 0
          # Command event call reservation
          $game_temp.common_event_id = @item.common_event_id
          # Play item use SE
          $game_system.se_play(@item.menu_se)
          # If consumable
          if @item.consumable
            # Decrease used items by 1
            $game_party.lose_item(@item.id, 1, false)
            # Draw item window item
            @grid.delete_item
          end
          # Switch to map screen
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when target window is active)
  #--------------------------------------------------------------------------
  def update_target
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # If unable to use because items ran out
      unless $game_party.item_can_use?(@item.id) 
        # Remake item window contents
        @grid.refresh
      end
      # Erase target window
      @grid.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If items are used up
      if @grid.item_del?
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If target is all
      if @target_window.index == -1
        # Apply item effects to entire party
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      # If single target
      if @target_window.index >= 0
        # Apply item use effects to target actor
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      # If an item was used
      if used
        # Play item use SE
        $game_system.se_play(@item.menu_se)
        # If consumable
        if @item.consumable
          # Decrease used items by 1
          $game_party.lose_item(@item.id, 1, false)
          # Redraw item window item
          @grid.delete_item
        end
        # Remake target window contents
        @target_window.refresh
        # If all party members are dead
        if $game_party.all_dead?
          # Switch to game over screen
          $scene = Scene_Gameover.new
          return
        end
        # If common event ID is valid
        if @item.common_event_id > 0
          # Common event call reservation
          $game_temp.common_event_id = @item.common_event_id
          # Switch to map screen
          $scene = Scene_Map.new
          return
        end
      end
      # If item wasn't used
      unless used
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
  
  def update_muovi
    
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      @command_window.active = true
      @grid.active = false
      @grid.set = - 1
      return
    end
    
    if Input.trigger?(Input::C)
      if @grid.item != nil
      @grid.get_item
      bitmap = Bitmap.new(32,32)
      x = 4 + (@grid.cursor_rect.width == 32 ? 0 : 18)
      y = 4 + (@grid.cursor_rect.height == 32 ? 0 : 32)
      bitmap.blt(0,0,@grid.contents,Rect.new(@grid.cursor_rect.x + x, 
      @grid.cursor_rect.y + y,@grid.cursor_rect.width,@grid.cursor_rect.height))

      @cursor_icon.refresh(bitmap, @grid.item_saved[1])
      @grid.cursor_rect.width = @cursor_icon.bitmap.width
      @grid.cursor_rect.height = @cursor_icon.bitmap.height
      @cursor_icon.x = @grid.cursor_rect.x + @grid.x + 16
      @cursor_icon.y = @grid.cursor_rect.y + @grid.y + 16
      @cursor_icon.visible = true
      @grid.delete_item

      @grid.mode = 3
      end
      return
    end
  end
  
  def update_lascia
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      @command_window.active = true
      @grid.active = false
      @grid.set = - 1
      return
    end
    if Input.trigger?(Input::C)
      if @grid.item != nil
        @grid.delete_item
      end
      return
    end
  end
  
  def update_muovi2
    @grid.cursor_rect.width = @cursor_icon.bitmap.width
    @grid.cursor_rect.height = @cursor_icon.bitmap.height
    @cursor_icon.x = @grid.cursor_rect.x + @grid.x + 16
    @cursor_icon.y = @grid.cursor_rect.y + @grid.y + 16
    if @grid.empty?
      @cursor_icon.blink_on
      @cursor_icon.tone.set(0,0,0,0)
    else
      @cursor_icon.blink_off
      @cursor_icon.tone.set(0,0,0,255)
    end
    
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      @grid.redraw_item(false)
      @grid.mode = 1
      return
    end
    if Input.trigger?(Input::C)
      if @grid.empty?
        @grid.redraw_item
        @cursor_icon.visible = false
        @grid.mode = 1
      end
      return
    end
  end
end


class Window_Selectable < Window_Base
  alias old_initialize initialize
  def initialize(x, y, width, height)
    old_initialize(x, y, width, height)
    if self.is_a?(Window_Grid)
      @x = 0
      @y = 0
    end
  end
  
  alias old_update update
  def update
    if !self.is_a?(Window_Grid)
      old_update
      return
    end
    super
    item = $game_party.actors[@actor_index].item_grid
    # If cursor is movable
    if self.active and @item_max > 0 and @x >= 0
      # If pressing down on the directional buttons
      if Input.repeat?(Input::DOWN)
        @y = -1 if @y == item.size - (self.cursor_rect.height == 96 ? 3 : 1)
        @y += 2 if item[@y][@x][1] == "w" or item[@y][@x][1] == "a"
        if item[@y + 1][@x][1] == "r" and item[@y + 1][@x - 1][1] == "a"
          @x -= 1
        end
        @y += 1
        $game_system.se_play($data_system.cursor_se)
      end
      # If the up directional button was pressed
      if Input.repeat?(Input::UP)
        @y = item.size if @y - 1 == -1
        @y -= 2 if item[@y - 1][@x][1] == "e" or item[@y - 1][@x][1] == "r"
        @x -= 1 if item[@y - 1][@x - 1][1] == "a"
        @y -= 1
        
        $game_system.se_play($data_system.cursor_se)
      end
      # If the right directional button was pressed
      if Input.repeat?(Input::RIGHT)
        if @x + (self.cursor_rect.width == 64 ? 2 : 1) == item[@y].size
          @x = 0
          @y -= 1 if item[@y - 1][@x][1] == "a"
          @y -= 2 if item[@y - 2][@x][1] == "a"
        else 
        @x += 1 if item[@y][@x][1] == "a"
        if item[@y][@x + 1][1] == "r"
          @y -= 1 if item[@y - 1][@x + 1][1] == "a"
          @y -= 2 if item[@y - 2][@x + 1][1] == "a"
        end
        if item[@y][@x + 1][1] == "e"
          @y -= 1
          @y -= 1 if item[@y - 1][@x + 1][1] == "w"
        end
          @x += 1
        end
        $game_system.se_play($data_system.cursor_se)
      end
      # If the left directional button was pressed
      if Input.repeat?(Input::LEFT)
        @x = item[@y].size if @x - 1 == -1
        if item[@y][@x - 1][1] == "r"
          @x -= 1
          @y -= 1 if item[@y - 1][@x - 1][1] == "a"
          @y -= 2 if item[@y - 2][@x - 1][1] == "a"
        end
        if item[@y][@x - 1][1] == "e"
          @y -= 1
          @y -= 1 if item[@y - 1][@x - 1][1] == "w"
        end
        @x -= 1
        $game_system.se_play($data_system.cursor_se)
      end
    end
    # Update help text (update_help is defined by the subclasses)
    if self.active and @help_window != nil
      update_help
    end
    # Update cursor rectangle
    update_cursor_rect
  end
end

class Window_Grid < Window_Selectable
  
  attr_accessor :mode
  attr_reader :item_saved
  
  def initialize(actor_index)
    super(192,64,448,416)
    self.contents = Bitmap.new(width - 32, height - 32) #icone oggetti
    self.opacity = 0
    @window = Window_Base.new(x , y , width, height) #griglia bianca
    @window.contents = Bitmap.new(width - 32, height - 32)
    @window.z = self.z - 4
    @grid_color = Sprite.new    #colori oggetti
    @grid_color.bitmap = Bitmap.new(width - 32, height - 32)
    @grid_color.x = self.x + 16
    @grid_color.y = self.y + 16
    @grid_color.z = @window.z + 2
    @actor_index = actor_index
    @mode = 0
    @mini_help = Mini_Help.new
    self.set = -1
    n = self.contents.width / 32
    m = self.contents.height / 32
    @column_max = n
    draw_grid
    refresh
  end
  
  def draw_grid
    @window.contents.fill_rect(0, 0, width - 32, height - 32, Color.new(170,15,255))
    i = 0
    color = Color.new(0,0,0)
    while i < self.contents.height
      draw_line(0, i, self.contents.width, i, color)
      i += 32
    end
    i = 0
    while i < self.contents.width
      draw_line(i, 0, i, self.contents.width, color)
      i += 32
    end
  end
  
  def draw_line(sx, sy, ex, ey, color)
    rad = Math.atan2(ey-sy, ex-sx)
    dx = Math.cos(rad)
    dy = Math.sin(rad)
    while (sx - ex).abs > 1 || (sy - ey).abs > 1
      sx += dx
      sy += dy
      @window.contents.set_pixel(sx, sy, color)
    end
  end
  
  def refresh
    @item_max = 0
    item = $game_party.actors[@actor_index].item_grid
    for i in 0..item.size - 1
      for j in 0..item[i].size - 1
        if item[i][j][0]!= 0 and item[i][j][1] != "r" and item[i][j][1] != "e"
          @item_max += 1
        end
      end
    end
    
    for i in 0..item.size - 1
      for j in 0..item[i].size - 1
        draw_item(item[i][j][0], item[i][j][1], i , j)
      end
    end
  end
  
  def update_cursor_rect
    # If cursor position is less than 0
    if @x < 0
      self.cursor_rect.empty
      return
    end
    # Calculate cursor width
    case $game_party.actors[@actor_index].item_grid[@y][@x][1]
    when "i"
      cursor_width = 32
      cursor_height = 32
    when "w"
      cursor_width = 32
      cursor_height = 96
    when "a"
      cursor_width = 64
      cursor_height = 96
    else
      cursor_width = 32
      cursor_height = 32
    end
    # Calculate cursor coordinates
    x = @x * 32
    y = @y * 32
    # Update cursor rectangle
    self.cursor_rect.set(x, y, cursor_width, cursor_height)
  end
  
  def delete_item
    case $game_party.actors[@actor_index].item_grid[@y][@x][1]
    when "i"
      @grid_color.bitmap.fill_rect(@x*32+1, @y*32+1, 31, 31, Color.new(0,0,0,0))
      self.contents.fill_rect(@x*32, @y*32, 32, 32, Color.new(0,0,0,0))
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = ""
    when "w"
      @grid_color.bitmap.fill_rect(@x*32+1, @y*32+1, 31, 95, Color.new(0,0,0,0))
      self.contents.fill_rect(@x*32, @y*32 + 4 + 32, 32, 32, Color.new(0,0,0,0))
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] = ""
    when "a"
      @grid_color.bitmap.fill_rect(@x*32+1, @y*32+1, 63, 95, Color.new(0,0,0,0))
      self.contents.fill_rect(@x*32 + 18, @y*32 + 4 + 32, 32, 32, Color.new(0,0,0,0))
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] = ""
      $game_party.actors[@actor_index].item_grid[@y][@x + 1][0] = 0
      $game_party.actors[@actor_index].item_grid[@y][@x + 1][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 1][@x + 1][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 1][@x + 1][1] = ""
      $game_party.actors[@actor_index].item_grid[@y + 2][@x + 1][0] = 0
      $game_party.actors[@actor_index].item_grid[@y + 2][@x + 1][1] = ""
    end
  end
    
  def item
    i = $game_party.actors[@actor_index].item_grid[@y][@x][0]
    case $game_party.actors[@actor_index].item_grid[@y][@x][1]
    when "i"
      return $data_items[i]
    when "w"
      return $data_weapons[i]
    when "a"
      return $data_armors[i]
    else return nil
    end
  end
  
  def item_del?
    if $game_party.actors[@actor_index].item_grid[@y][@x][0] == 0
      # Unusable
      return true
    else
      return false
    end
  end
  
  def dispose
    super
    @window.dispose
    @grid_color.dispose
    @mini_help.dispose
  end
  
  def update_help
    @mini_help.contents.font.color = (($game_party.item_can_use?(item.id) and item.is_a?(RPG::Item))? normal_color : disabled_color)
    @help_window.set_text(item == nil ? "" : item.description)
    @mini_help.set_text(item == nil ? "" : item.name)
    @mini_help.visible = false if item == nil
    @mini_help.x = self.cursor_rect.x +  self.cursor_rect.width + 192 + 
    (self.contents.width - self.cursor_rect.x - self.cursor_rect.width < @mini_help.width ? -@mini_help.width : 18)
    @mini_help.y = self.cursor_rect.y + self.cursor_rect.height + 64 +
    (self.contents.height - self.cursor_rect.y - self.cursor_rect.height < @mini_help.height ? -@mini_help.height : 18)
  end
  
  def get_item
    @item_saved = [$game_party.actors[@actor_index].item_grid[@y][@x][0], 
    $game_party.actors[@actor_index].item_grid[@y][@x][1], @x, @y]
  end
  
  def redraw_item(f = true)
    if f
      x = 4 + (@x * 32)
      y = @y * 32
    else
      x = 4 + (@item_saved[2] * 32)
      y = @item_saved[3] * 32
      tx = @x
      ty = @y
      @x = @item_saved[2]
      @y = @item_saved[3]
    end
    draw_item(@item_saved[0], @item_saved[1], @y , @x)
    case @item_saved[1]
    when "i"
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = @item_saved[1]
    when "w"
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = @item_saved[1]
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] = "e"
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] = "e"
    when "a"
      $game_party.actors[@actor_index].item_grid[@y][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y][@x][1] = @item_saved[1]
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] = "r"
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] = "r"
      $game_party.actors[@actor_index].item_grid[@y][@x + 1][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y][@x + 1][1] = "r"
      $game_party.actors[@actor_index].item_grid[@y + 1][@x + 1][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 1][@x + 1][1] = "r"
      $game_party.actors[@actor_index].item_grid[@y + 2][@x + 1][0] = @item_saved[0]
      $game_party.actors[@actor_index].item_grid[@y + 2][@x + 1][1] = "r"
    end
    @x = tx if @x != tx and tx != nil
    @y = ty if @y != ty and ty != nil
  end
  
  def empty?
    case @item_saved[1]
    when "i" 
      return true if $game_party.actors[@actor_index].item_grid[@y][@x][1] == ""
    when "w"
      if $game_party.actors[@actor_index].item_grid[@y][@x][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] == ""
      
      return true
    end
    when "a"
      if $game_party.actors[@actor_index].item_grid[@y][@x][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 1][@x][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 2][@x][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y][@x + 1][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 1][@x + 1][1] == "" and 
        $game_party.actors[@actor_index].item_grid[@y + 2][@x + 1][1] == ""
      
        return true
      end
    end
    return false
  end
  
  def set=(set)
    @x = set
    @y = set
    @mini_help.visible = (set == 0 ? true : false) 
  end

  
  def draw_item(item_id, type, i , j)
    if type == "i" and
      $game_party.item_can_use?($data_items[item_id].id)
      opacity = 255
    else
      opacity = 128
    end
        
    if item_id != 0
      case type
      when "i"
        x = 4 + (j * 32)
        y = i * 32
        bitmap = RPG::Cache.icon($data_items[item_id].icon_name)
        @grid_color.bitmap.fill_rect(j*32+1, i*32+1, 31, 31, Color.new(0,0,200))
        self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
      when "w"
        x = 4 + (j * 32)
        y = i * 32
        bitmap = RPG::Cache.icon($data_weapons[item_id].icon_name)
        @grid_color.bitmap.fill_rect(j*32+1, i*32+1, 31, 95, Color.new(200,0,0))
        self.contents.blt(x, y + 4 + 32, bitmap, Rect.new(0, 0, 24, 24), opacity)
      when "a"
        x = 4 + (j * 32)
        y = i * 32
        bitmap = RPG::Cache.icon($data_armors[item_id].icon_name)
        @grid_color.bitmap.fill_rect(j*32+1, i*32+1, 63, 95, Color.new(0,200,0))
        self.contents.blt(x + 18, y + 4 + 32, bitmap, Rect.new(0, 0, 24, 24), opacity)
      end
    end
  end
end

class Mini_Help < Window_Base
  alias old_initialize initialize
  def initialize
    super(0, 0, 180, 40)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.size = 14
    self.back_opacity = 170
    self.z = 102
    self.visible = false
  end
  
  def set_text(text, align = 1)
    # If at least one part of text and alignment differ from last time
    if text != @text or align != @align
      # Redraw text
      self.contents.clear
      #self.contents.font.color = normal_color
      self.contents.draw_text(4, -12, self.width - 40, 32, text, align)
      #self.width = self.contents.text_size(text).width
      @text = text
      @align = align
      @actor = nil
    end
    self.visible = true
  end
end

class Game_Actor < Game_Battler
  attr_accessor :item_grid
  alias old_initialize initialize
  def initialize(actor_id)
    old_initialize(actor_id)
    @item_grid = Array.new(12)
    for i in 0..@item_grid.size - 1
      @item_grid[i] = Array.new(13)
      for k in 0..@item_grid[i].size - 1
        @item_grid[i][k] = Array.new(2)
        @item_grid[i][k][0] = 0
        @item_grid[i][k][1] = ""
      end
    end
  end

end

class Game_Party
  
  def gain_item(item_id, n)
    if item_id > 0
      for k in 1..n
        for i in 0..self.actors.size - 1
         break if set_item(item_id, "i", i) == nil
        end
      end
    end
  end
  
  def gain_weapon(weapon_id, n)
    if weapon_id > 0
      for k in 1..n
        for i in 0..self.actors.size - 1
          break if set_item(weapon_id, "w", i) == nil
        end
      end
    end
  end
  
  def gain_armor(armor_id, n)
    if armor_id > 0
      for k in 1..n
        for i in 0..self.actors.size - 1
          break if set_item(armor_id, "a", i) == nil
        end
      end
    end
  end
  
  def lose_item(item_id, n, random = true)
    if random == true
      if item_id > 0
        for k in 1..n
          del_item(item_id, "i")
        end
      end
    end
    @items[item_id] = [[item_number(item_id) + -n, 0].max, 99].min
  end
  
  def lose_weapon(weapon_id, n, random = true)
    if random == true
      if weapon_id > 0
        for k in 1..n
          del_item(weapon_id, "w")
        end
      end
    end
    @weapons[weapon_id] = [[weapon_number(weapon_id) + -n, 0].max, 99].min
  end

  def lose_armor(armor_id, n, random = true)
    if random == true
      if armor_id > 0
        for k in 1..n
          del_item(armor_id, "a")
        end
      end
    end
    @armors[armor_id] = [[armor_number(armor_id) + -n, 0].max, 99].min
  end
  
  def set_item(item_id, type, i)
      for a in 0..self.actors[i].item_grid.size - 1
        for b in 0..self.actors[i].item_grid[a].size - 1
          if self.actors[i].item_grid[a][b][0] == 0
            case type
            when "i"
              self.actors[i].item_grid[a][b][0] = item_id
              self.actors[i].item_grid[a][b][1] = type
              @items[item_id] = [[item_number(item_id) + 1, 0].max, 99].min
              return
            when "w"
              if a < self.actors[i].item_grid.size - 2
              if self.actors[i].item_grid[a + 1][b][0] == 0 and 
                self.actors[i].item_grid[a + 2][b][0] == 0

                self.actors[i].item_grid[a][b][0] = item_id
                self.actors[i].item_grid[a][b][1] = type
                self.actors[i].item_grid[a + 1][b][0] = item_id
                self.actors[i].item_grid[a + 1][b][1] = "e"
                self.actors[i].item_grid[a + 2][b][0] = item_id
                self.actors[i].item_grid[a + 2][b][1] = "e"
                @weapons[item_id] = [[weapon_number(item_id) + 1, 0].max, 99].min
                return
              end
              end
            when "a"
              if b < self.actors[i].item_grid[a].size - 1 and a < self.actors[i].item_grid.size - 2
              if self.actors[i].item_grid[a + 1][b][0] == 0 and self.actors[i].item_grid[a + 2][b][0] == 0 and 
                self.actors[i].item_grid[a][b + 1][0] == 0 and 
                self.actors[i].item_grid[a + 1][b + 1][0] == 0 and self.actors[i].item_grid[a + 2][b + 1][0] == 0
                
                self.actors[i].item_grid[a][b][0] = item_id
                self.actors[i].item_grid[a][b][1] = type
                self.actors[i].item_grid[a + 1][b][0] = item_id
                self.actors[i].item_grid[a + 1][b][1] = "r"
                self.actors[i].item_grid[a + 2][b][0] = item_id
                self.actors[i].item_grid[a + 2][b][1] = "r"
                self.actors[i].item_grid[a][b + 1][0] = item_id
                self.actors[i].item_grid[a][b + 1][1] = "r"
                self.actors[i].item_grid[a + 1][b + 1][0] = item_id
                self.actors[i].item_grid[a + 1][b + 1][1] = "r"
                self.actors[i].item_grid[a + 2][b + 1][0] = item_id
                self.actors[i].item_grid[a + 2][b + 1][1] = "r"
                @armors[item_id] = [[armor_number(item_id) + 1, 0].max, 99].min
                return
              end
              end
            end
          end
        end
      end
  end
  
  def del_item(item_id, type)
    for i in 0..self.actors.size - 1
      for a in 0..self.actors[i].item_grid.size - 1
        for b in 0..self.actors[i].item_grid[a].size - 1
          if self.actors[i].item_grid[a][b][0] == item_id and 
            self.actors[i].item_grid[a][b][1] == type
            
            case type
            when "i"
              self.actors[i].item_grid[a][b][0] = 0
              self.actors[i].item_grid[a][b][1] = ""
              return
            when "w"
                self.actors[i].item_grid[a][b][0] = 0
                self.actors[i].item_grid[a][b][1] = ""
                self.actors[i].item_grid[a + 1][b][0] = 0
                self.actors[i].item_grid[a + 1][b][1] = ""
                self.actors[i].item_grid[a + 2][b][0] = 0
                self.actors[i].item_grid[a + 2][b][1] = ""
                return
            when "a"
                self.actors[i].item_grid[a][b][0] = 0
                self.actors[i].item_grid[a][b][1] = ""
                self.actors[i].item_grid[a + 1][b][0] = 0
                self.actors[i].item_grid[a + 1][b][1] = ""
                self.actors[i].item_grid[a + 2][b][0] = 0
                self.actors[i].item_grid[a + 2][b][1] = ""
                self.actors[i].item_grid[a][b + 1][0] = 0
                self.actors[i].item_grid[a][b + 1][1] = ""
                self.actors[i].item_grid[a + 1][b + 1][0] = 0
                self.actors[i].item_grid[a + 1][b + 1][1] = ""
                self.actors[i].item_grid[a + 2][b + 1][0] = 0
                self.actors[i].item_grid[a + 2][b + 1][1] = ""
                return
            end
          end
        end
      end
    end
  end
end


class Cursor_Icon < RPG::Sprite
  def initialize
    super
    @color = Color.new(255,255,0,150)
    @rect = Rect.new(0, 0, 24, 24)
  end
  
  def refresh(bitmap, item)
    case item
    when "i"
      x = 4
      y = 4
      width = 32
      height = 32
    when "w"
      x = 4
      y = 36
      width = 32
      height = 96
    when "a"
      x = 22
      y = 36
      width = 64
      height = 96
    end
    if self.bitmap == nil or (self.bitmap.width != width or self.bitmap.height != height)
      self.bitmap = Bitmap.new(width, height)
    else
      self.bitmap.clear
    end
    self.bitmap.fill_rect(0,0,width,height, @color)
    self.bitmap.blt(x, y , bitmap, @rect)
    self.z = 9999
  end
end

class Window_Base
  def draw_actor_picture(actor, x, y)
    bitmap = RPG::Cache.battler(actor.character_name, actor.character_hue)
    cw = bitmap.width
    ch = bitmap.height
    src_rect = Rect.new(0, 0, cw, ch)
    self.contents.blt(x - cw / 2, y - ch, bitmap, src_rect)
  end
end

class Scene_Menu
    def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If command other than save or end game, and party members = 0
      if $game_party.actors.size == 0 and @command_window.index < 4
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Branch by command window cursor position
      case @command_window.index
      when 0  # item
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to item screen
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 1  # skill
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # equipment
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # status
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Make status window active
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # save
        # If saving is forbidden
        if $game_system.save_disabled
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to save screen
        $scene = Scene_Save.new
      when 5  # end game
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to end game screen
        $scene = Scene_End.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when status window is active)
  #--------------------------------------------------------------------------
  def update_status
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Make command window active
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Branch by command window cursor position
      case @command_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item2.new(@status_window.index)
      when 1  # skill
        # If this actor's action limit is 2 or more
        if $game_party.actors[@status_window.index].restriction >= 2
          # Play buzzer SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to skill screen
        $scene = Scene_Skill.new(@status_window.index)
      when 2  # equipment
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to equipment screen
        $scene = Scene_Equip.new(@status_window.index)
      when 3  # status
        # Play decision SE
        $game_system.se_play($data_system.decision_se)
        # Switch to status screen
        $scene = Scene_Status.new(@status_window.index)
      end
      return
    end
  end
end
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top