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.

Diablo Style Item Inventory

Status
Not open for further replies.
Item System Diablo Style
Version: Beta

Introduction

Creates an inventory in a grid. For those of you who have never played Diablo, you get a set amount of space, in a grid. Each item takes up a certain space on the grid. In this script items are one block, weapons are 3 vertical, and shields are 2x3.

Features

Each player has their own inventory(items add first to hero 1, then to hero 2 etc)
Sort items out to your liking

Pending:
Dropping items drops to map
Compatability with Grouping and Details
Customizable size for individual weapons/armors/items

Screenshots

This will explain all...

Don't worry, the script is english.
Demo

Not needed
Script


Code:
#==============================================================================

#  Item System Diablo Style

#------------------------------------------------------------------------------

#  By DarkSchneider 

#  [url=http://www.rpg2s.net]http://www.rpg2s.net[/url]

#------------------------------------------------------------------------------

#  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(255,255,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

Instructions

Just place it in the script editor above main below default scripts. Then test game and open up "Items" in the menu

FAQ

Nothing yet.

Compatibility

Tested and compatible with SDK. Grouping and details doesnt work with this as of yet, but may be in the next version.

Credits and Thanks

Made by By DarkSchneider of www.rpg2s.net, Credit to Schwarz for draw_line
I translated about 3 italian words :D

Author's Notes

This is BETA still. More features to be added, more bugs to be fixed, more compatibility to come.
 
yeah, I know. Its beta remember? This looks a lot better:


But I'm not sure how to change the colors like that but if you dont like white find this line
Code:
@window.contents.fill_rect(0, 0, width - 32, height - 32, Color.new(255,255,255))

and change 255,255,255 to any color you want
 
Wow! Very nice idea, I'll try to use this one.
A "Give" option would be cool to transfer items between Actors.
(And if it worked with the Zenith TBS *g*)

Is there an option to limit the available storage space per actor?

Greets,
Dukey
 
I keep getting a no method error for line 687:
$game_party.actors[@actor_index].item_grid[@y + 1][@x][1] == "" and

when i move an item past the top of the grid. :(
 
I would be correct in assuming that your grouping that you state would make certain items stackable? for example, Potionx10 rather then ten potions taking up ten slots?
 
Your gonna have to find a way to support larger icons, small 24x24 or 32x32 don't fit in with the 3sx2s (72x48 i think it is) sized blocks. allow it to support diablo sized icons, maybe then itll be worth it. Oh yeah, change the back ground to be an image like rock or something.
 
hmm, Why don't you make a constant that determines the size for each weapons.

WEAPONS[ID] = [X,Y]
ARMOURS[ID] = [X,Y]

and ect.
 

Kraft

Sponsor

can you move the items around in the box?
because I have noticed that if you have only like 3 squares left, but they are not in order (for a weapon) (order meaning, one above another) you can sometimes move things around to make more room.

Kraft

PS, Icon Stretching would be a good idea, I think, since the squared reaelly arent that big anyway (shield) you could make it a little bigger without killing the quality.
 
This is great for use with Mr. Mo's ABS script and it makes the RMXp more like Diablo(somewhat) if I can figure out how to tweak this script I'll post what I did as soon as I figure out how to tweak it.
 
Another thing too, when a player selects to drop an item have another window show up that says "Drop item?" and the command would be automatically selected on No and also a Yes button by it.
 
remind me a little of the CHIP SYSTEM from one of those MegaMan games for gba...
can u do that with the EQUIP screen too?:yes: :#
oh yea...and a build in Mixing script will rock too^_^! (like: when u make 2 items into one...)
 
DarkJeff;148384 said:
remind me a little of the CHIP SYSTEM from one of those MegaMan games for gba...
can u do that with the EQUIP screen too?:yes: :#
oh yea...and a build in Mixing script will rock too^_^! (like: when u make 2 items into one...)

horadric cube any1?
 
y very nice. I have been searching for a way to answer my Item Space dilemma. This may just solve that better than the route I was taking.
 
Status
Not open for further replies.

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