[VXA] Categorize Item Scene

0 Members and 1 Guest are viewing this topic.

**
Rep:
Level 72
RMRK Junior
~ Categorize Item Scene v1.0~
create your own categories and assign
items, weapons, armor to them via notetags

Ported from RMVX
by: Seiryuki
on: 2012-Jan-02

Original Script
by: KGC
on: 2008-Apr-10
for: RMVX
translated by: Mr. Anonymous
the original untranslated version of the VX script can be found here:
http://f44.aaa.livedoor.jp/~ytomy/tkool/rpgtech/php/tech.php?tool=VX&cat=tech_vx/item&tech=categorize_item

Description
While RMVXAce already categorises the items in the items scene into Items, Weapons, Armor, and Key Items this script allows you to create your own categories and assign items, weapons, and armor to any of them using notebox tags.
This script also allows you to customise the size and location of the help, category, and item windows. See the Custom Layout Section for more information.

Compatibility
May not be compatible with scripts that redo the item scene.
May be compatible with scripts that modify the item categories for shops.

Instructions
Place this script above Main and below Materials.

To assign an item to a category, place <category IDENTIFIER> tag in the item's (or weapon, or armor) notebox where IDENTIFIER is the label listed in the CATEGORY_IDENTIFIER array in the Customisation Section below.
You can add to or remove from the CATEGORY_IDENTIFIER list.

NOTE: The following symbols are reserved and MUST NOT be used in the CATEGORY_IDENTIFIER list:
       :item, :weapon, :armor, :key_item, :all_item

You can assign an item to multiple categories by simply placing more <category IDENTIFIER> tags in the item's notebox.
NOTE: When doing that, make sure that ALLOW_DUPLICATE is set to true (see Customisation Section) or else only the last tag in the notebox will be used as the category for the item.

Screenshots


Script
MediaFire Link or,
Code: [Select]
#===============================================================
#==================== CATEGORIZE ITEM SCENE v1.0 ===============
#===============================================================
#= Ported from RMVX to RMVXAce
#= Author: Seiryuki
#= Date: 2012-Jan-02
#= Type: VXA/RGSS3
#= Additions: a few more customisation options
#---------------------------------------------------------------
#= RMVX Title: KGC's Categorize Item Script
#= Author: KGC
#= Date: 2008-Apr-10
#= Translated by: Mr. Anonymous
#= The original untranslated version of the VX script can be found here:
#= http://f44.aaa.livedoor.jp/~ytomy/tkool/rpgtech/php/tech.php?tool=VX&cat=tech_vx/item&tech=categorize_item
#===============================================================
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# DESCRIPTION:
# While RMVXAce already categorises the items in the items scene
# into Items, Weapons, Armor, and Key Items this script allows
# you to create your own categories and assign items, weapons,
# and armor to any of them using notebox tags.
#
# This script also allows you to customise the size and location
# of the help, category, and item windows.
# See the Custom Layout Section for more information.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# COMPATIBILITY:
# May not be compatible with scripts that redo the item scene.
# May be compatible with scripts that modify the item categories
# for shops.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# INSTRUCTIONS:
# Place this script above Main and below Materials.
#
# To assign an item to a category, place <category IDENTIFIER> tag
# in the item's (or weapon, or armor) notebox where IDENTIFIER
# is the label listed in the CATEGORY_IDENTIFIER array in the
# Customisation Section below.
# You can add to or remove from the CATEGORY_IDENTIFIER list.
#
# NOTE: The following symbols are reserved and MUST NOT be used in
#    the CATEGORY_IDENTIFIER list:
#       :item, :weapon, :armor, :key_item, :all_item
#
# You can assign an item to multiple categories by simply placing
# more <category IDENTIFIER> tags in the item's notebox.
# NOTE: When doing that, make sure that ALLOW_DUPLICATE is set to
# true (see Customisation Section) or else only the last tag in
# the notebox will be used as the category for the item.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#===============================================================



$data_system = load_data("Data/System.rvdata2") if $data_system == nil

module ICAT
#=============================================================================#
# CUSTOMISATION SECTION - Do not make changes unless you understand completely
# what you are doing. Read and follow the below instructions very carefully.
#=============================================================================#
#-----------------------------------------------------------------------------#

#>> CATEGORY_IDENTIFIER - Create your categories here.
#   You can add or remove categories from this list.
#   On the left is the symbol used to identify the category.
#   On the right is the category label that will be used when setting
#   the e.g. <category Potions> tag in the notebox, where Potions is
#   the label.
#
#   IMPORTANT - You cannot use the following as symbols as they are
#   reserved:
#       :item, :weapon, :armor, :key_item, :all_item
  CATEGORY_IDENTIFIER = {
    :potion => "Potions", #example tag: <category Potions>
    :ammunition => "Ammunition", #example tag: <category Ammunition>
    }

#>> VISIBLE_CATEGORY_INDEX - Set the categories that would be visible
#     in the item category window.
#   On the left is identifying symbol from the CATEGORY_IDENTIFIER list
#   above. It must be a symbol present in that list above, OR, one of the
#   reserved symbols stated above. Make sure spelling is correct!
#   On the right is the text to display, and can be any text desired.
#   (see below customisation section for RESERVED_CATEGORY_INDEX list).
#
#   Only what is present in the VISIBLE_CATEGORY_INDEX will be shown in the
#   item category window (so you can remove any from the list).
#   This list can be arranged in any order desired.
  VISIBLE_CATEGORY_INDEX = {
    #:item => "Common", #reserved symbol, but can be removed.
    :weapon => "Weapons", #reserved symbol, but can be removed.
    :armor => "Armor", #reserved symbol, but can be removed.
    :key_item => "Special", #reserved symbol, but can be removed.
    :all_item => "*ALL*", #reserved symbol, but can be removed.
    :potion => "Potions",
    :ammunition => "Ammo",
    }

#>> CATEGORY_DESCRIPTION - Simple. The list below creates descriptions
#     that will be shown in the help window. BUT! Number of items in the
#     this list MUST match the number of items in the VISIBLE_CATEGORY_INDEX
#     list above.....and the arranged order too.
  CATEGORY_DESCRIPTION = [
    #"Viewing basic items.",
    "Viewing attack-type items for use in battles.",
    "Viewing head, body, arm and leg equipment.",
    "Viewing important items.",
    "Viewing all items.",
    "Viewing potions.",
    "Viewing ammunition.",
  ]
 
#>> I'm not sure how important setting this is.
  ITEM_DEFAULT_CATEGORY = :item #default= :item
  ITEM_DEFAULT_CATEGORY_INDEX = CATEGORY_IDENTIFIER.index(ITEM_DEFAULT_CATEGORY)
 
#>> AUTOFIT_CATEGORY_COLUMNS - Set to true if you want all the
#     categories to autofit in the width of the item category window.
#     Set to false if you only want CATEGORY_WINDOW_MAX_COLUMNS number
#     of categories visible in the window width. If there are more
#     categories than CATEGORY_WINDOW_MAX_COLUMNS, the rest will still be
#     accessible to the right of the last category.
  AUTOFIT_CATEGORY_COLUMNS = true #default=true
  CATEGORY_WINDOW_MAX_COLUMNS = 5 #If autofit=false, this number is used.
 
#>> ALLOW_DUPLICATE - This is for when items have multiple tags
#     in the notebox.
#   Set to true if you want to allow an item in other categories.
#   Setting to false will only choose the last category tag from the
#   item's notebox as the item's category.
  ALLOW_DUPLICATE = true #default=true
 
#>> CATEGORY_WINDOW_COL_WIDTH - Specify the width of the column to
#     be used for each category. The category's text is auto-squished
#     to fit.
  CATEGORY_WINDOW_COL_WIDTH = 50 #default=50

#>> CATEGORY_WINDOW_COL_SPACE - The amount of space-padding to be
#     used on either end of the column.
  CATEGORY_WINDOW_COL_SPACE = 2 #default=2


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#>> DEFAULT_SCENE_ITEM_LAYOUT - If you want the normal item scene
#     layout where the help window is on top, categories in the
#     middle, and item list below set this to TRUE.
#     If you wish to move and resize the windows yourself, set to
#     FALSE and modify the CUSTOM LAYOUT SECTION below.
  DEFAULT_SCENE_ITEM_LAYOUT = true #default=true

#>> CUSTOM LAYOUT SECTION:
#     The default settings below recreate the layout as if
#     DEFAULT_SCENE_ITEM_LAYOUT was set to true above.
#-----------
# DEFAULTS:
#-----------
#  HELP_WINDOW_POSITION      = [0, 0]
#  HELP_WINDOW_WIDTH         = Graphics.width #or enter your own number
#  HELP_WINDOW_NUM_OF_LINES  = 2
#  CATEGORY_WINDOW_POSITION  = [0, 72]
#  CATEGORY_WINDOW_WIDTH     = Graphics.width #or enter your own number
#  ITEMLIST_WINDOW_POSITION  = [0, 120]
#  ITEMLIST_WINDOW_HEIGHT    = 296

  HELP_WINDOW_POSITION      = [0, 0]
  HELP_WINDOW_WIDTH         = Graphics.width #or enter your own number
  HELP_WINDOW_NUM_OF_LINES  = 2
  CATEGORY_WINDOW_POSITION  = [0, 72]
  CATEGORY_WINDOW_WIDTH     = Graphics.width #or enter your own number
  ITEMLIST_WINDOW_POSITION  = [0, 120]
  ITEMLIST_WINDOW_HEIGHT    = 296
#>> END OF LAYOUT SECTION
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

#-----------------------------------------------------------------------------#
#=============================================================================#
# END OF CUSTOMISATION SECTION
#=============================================================================#
#-----------------------------------------------------------------------------#
# DO NOT MODIFY ANYTHING BELOW HERE UNLESS YOU ARE SURE OF WHAT YOU'RE DOING! #
#-----------------------------------------------------------------------------#
#=============================================================================#
#=============================================================================#

   
  RESERVED_CATEGORY_INDEX = {
    "All Items" => CATEGORY_IDENTIFIER.index(:all_item),
    "Key Items" => CATEGORY_IDENTIFIER.index(:key_item),
    "Weapons" => CATEGORY_IDENTIFIER.index(:weapon),
    "Armor" => CATEGORY_IDENTIFIER.index(:armor),
    "Items" => CATEGORY_IDENTIFIER.index(:item),
  }

  module Regexp
    module BaseItem
      # Category tag string
      CATEGORY = /^<(?:CATEGORY|classification|category?)[ ]*(.*)>/i
    end
  end

end # END OF module: ICAT



#=============================================================================#
# Creates the item category window from VISIBLE_CATEGORY_INDEX hash above.
#=============================================================================#
class ICAT_WindowItemCategory < Window_ItemCategory
 
  def initialize
    super
    self.z = 1000
    self.index = 0
  end
 
  def update_help
    #I'm too lazy to find a way to identify description by symbol.
    @help_window.set_text(ICAT::CATEGORY_DESCRIPTION[self.index])
  end
 
  alias icat_make_command_list make_command_list
  def make_command_list
    ICAT::VISIBLE_CATEGORY_INDEX.each { |symbol, label|
      add_command(label, symbol)
    }
  end
 
  def col_max
    if ICAT::AUTOFIT_CATEGORY_COLUMNS
      cols = ICAT::VISIBLE_CATEGORY_INDEX.length
    else
      cols = ICAT::CATEGORY_WINDOW_MAX_COLUMNS
    end
    return cols
  end
 
  def window_width
    if ICAT::CATEGORY_WINDOW_WIDTH == nil
      return Graphics.width
    else
      return ICAT::CATEGORY_WINDOW_WIDTH
    end
  end
 
  def spacing
    return ICAT::CATEGORY_WINDOW_COL_SPACE
  end
 
end #class



#=============================================================================#
# Creates category array from BASEITEM database.
#=============================================================================#
class RPG::BaseItem
  attr_reader :icat
 
  def create_categorize_item_cache
    if @icat == nil
      @icat = []
    else
      @icat.compact!
    end
    self.note.split(/[\r\n]+/).each { |line|
      if line =~ ICAT::Regexp::BaseItem::CATEGORY
        c = ICAT::CATEGORY_IDENTIFIER.key($1)
        @icat << c if c != nil
      end
    }
    if @icat.empty?
      @icat << ICAT::ITEM_DEFAULT_CATEGORY_INDEX
    elsif !ICAT::ALLOW_DUPLICATE
      @icat = [@icat.pop]
    end
  end
 
  def item_category
    create_categorize_item_cache if @icat == nil
    return @icat
  end
 
end #class



#=============================================================================#
# Creates category array from USABLEITEM database.
#=============================================================================#
class RPG::UsableItem < RPG::BaseItem
 
  def create_categorize_item_cache
    @icat = []
    if key_item?
      @icat << ICAT::RESERVED_CATEGORY_INDEX.key("Key Items")
    elsif !key_item?
      @icat << ICAT::RESERVED_CATEGORY_INDEX.key("Items")
    end
    super
  end
 
end #class



#=============================================================================#
# Creates category array from WEAPON database.
#=============================================================================#
class RPG::Weapon < RPG::EquipItem
 
  def create_categorize_item_cache
    @icat = []
    @icat << ICAT::RESERVED_CATEGORY_INDEX.key("Weapons")
    super
  end
 
end #class



#=============================================================================#
# Creates category array from ARMOR database.
#=============================================================================#
class RPG::Armor < RPG::EquipItem
 
  def create_categorize_item_cache
    @icat = []
    @icat << ICAT::RESERVED_CATEGORY_INDEX.key("Armor")
    super
  end
 
end #class



#=============================================================================#
# Creates item window, categorised by RESERVED_CATEGORY_INDEX and by your own
# custom VISIBLE_CATEGORY_INDEX hash above.
#=============================================================================#
class Window_ItemList < Window_Selectable
 
  alias icat_initialize initialize
  def initialize(x, y, width, height)
    icat_initialize(x, y, width, height)
    @category = ICAT::VISIBLE_CATEGORY_INDEX
  end
 
  def include?(item)
    return false if item == nil
    case @category
    when :item
      item.is_a?(RPG::Item) && !item.key_item?
    when :weapon
      item.is_a?(RPG::Weapon)
    when :armor
      item.is_a?(RPG::Armor)
    when :key_item
      item.is_a?(RPG::Item) && item.key_item?
    when :all_item
      item.is_a?(RPG::Item) || item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon)
    else
      ###### NEED TO CHECK FOR CUSTOM CATEGORIES HERE AND
      ###### DECIDE IF TO INCLUDE THE ITEM TO IT
      @icategory = item.item_category
      for i in @icategory do
        if @category == i
          return item.item_category.include?(@category)
        end
      end
      return false
    end #when
  end #def
 
end #class



#=============================================================================#
# Allows for the customisation of the help window.
#=============================================================================#
class Window_Help < Window_Base
 
  alias icat_help_initialize initialize
  def initialize(line_number = 2)
    if ICAT::DEFAULT_SCENE_ITEM_LAYOUT
      super(0, 0, Graphics.width, fitting_height(line_number))
    else
      super(
        ICAT::HELP_WINDOW_POSITION[0],
        ICAT::HELP_WINDOW_POSITION[1],
        ICAT::HELP_WINDOW_WIDTH,
        fitting_height(ICAT::HELP_WINDOW_NUM_OF_LINES))
    end
  end
 
end #class



#=============================================================================#
# Creates the entire item scene: item window, item categories, help window.
#=============================================================================#
class Scene_Item < Scene_ItemBase
 
  alias icat_create_category_window create_category_window
  #Create the item category window.
  def create_category_window
    @category_window = ICAT_WindowItemCategory.new
    @category_window.viewport = @viewport
    @category_window.help_window = @help_window
    @category_window.x = ICAT::CATEGORY_WINDOW_POSITION[0]
    if ICAT::DEFAULT_SCENE_ITEM_LAYOUT #customise check
      @category_window.y = @help_window.height
    else
      @category_window.y = ICAT::CATEGORY_WINDOW_POSITION[1]
    end
    @category_window.set_handler(:ok,     method(:on_category_ok))
    @category_window.set_handler(:cancel, method(:return_scene))
    @category_window.opacity = 255 #255=totally opaque
    @category_window.back_opacity = 255 #255=totally opaque
    @category_window.contents_opacity = 255 #255=totally opaque
  end
 
  #Create the item list window.
  alias icat_create_item_window create_item_window
  def create_item_window
    if ICAT::DEFAULT_SCENE_ITEM_LAYOUT #customise check
      wy = @category_window.y + @category_window.height
      wh = Graphics.height - wy
    else
      wy = ICAT::ITEMLIST_WINDOW_POSITION[1]
      wh = ICAT::ITEMLIST_WINDOW_HEIGHT
    end
    @item_window = Window_ItemList.new(0, wy, Graphics.width, wh)
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:ok,     method(:on_item_ok))
    @item_window.set_handler(:cancel, method(:on_item_cancel))
    @category_window.item_window = @item_window
  end
 
end #class

#=============================================================================#
# -------------------------------END OF SCRIPT------------------------------- #
#=============================================================================#

I accept criticism regarding aliasing and other things in the code. I know little ruby and criticism would help me understand it more.

« Last Edit: January 03, 2012, 01:43:24 AM by Seiryuki »

**
Rep:
Level 71
Captain of Ultima
A small problem... I made an armour category "Ichor", I've set up that in the script, but this item is still in both categories - Armour and Ichor. And "All" category is empty no matter, how much items i have.
Sorry 'bout my bad english :/

**
Rep:
Level 72
RMRK Junior
There are special reserved categories that KGC made:
:all_item
:key_item
:weapon
:armor
:item
The items you have in your inventory automatically gets assigned to those categories within KGC's code.

So...if you have a category "Ichor" with armours in it, all those armours will also fall into in the :armor category.
There is a very easy way to solve your problem (actually, it's the reason I ported this script!). Simply comment-out (#) all the reserved categories and create your own; just make sure you don't use the same words as the reserved categories.

E.g.:
Code: [Select]
  VISIBLE_CATEGORY_INDEX = {
    #:item => "Common", #reserved symbol, but can be removed.
    #:weapon => "Weapons", #reserved symbol, but can be removed.
    #:armor => "Armor", #reserved symbol, but can be removed.
    #:key_item => "Special", #reserved symbol, but can be removed.
    :all_item => "*ALL*", #reserved symbol, but can be removed.
    :potion => "Potions",
    :ammunition => "Ammo",
    :ichor => "Ichor",
    :armoury => "Armor",
    :weaponry => "Weapons",
    :specialItems => "Key-Items",
    }
Noticed that I created my own categories for armour, weapon, etc. Of course, I would have also added those categories into the CATEGORY_IDENTIFIER array. This means that I will have to use the tags to manually place items into those categories. This gives the system great freedom to categorise your entire inventory the way you want.

I will check the problem with the :all_item category, but remember that you can also create your own :all_item category; just give it a different name like :all_inventory, then, just assign the items to the :all_inventory category since you can assign items to multiple categories. This is something I do since there may be certain items that you may not want the player to see in the Item_Scene even if they have it acquired.

I hope that helps.

EDIT: I've tested the :all_item category and it works fine. It automatically assigns all items to that category. I'm not sure how it didn't work for you. Review the changes you've made and see if there might be some problem you missed. If you're still getting the problem, I think it's best to post the top section of the script (the places you've changed) so I can take a look.
« Last Edit: April 03, 2012, 06:44:29 PM by Seiryuki »

**
Rep:
Level 71
Captain of Ultima
Ok, I' get it. Let me guess - in "Item" category are only items, no weapons, or armours, right?

I have thinking about making my own categories, but I was hoping, that I doesn't have to tag each armor/weapon/item that I create.

But thanks :)
Sorry 'bout my bad english :/

**
Rep:
Level 72
RMRK Junior
You are right. Nothing is wrong with using the reserved categories. I just prefer to create my own because it is more powerful. Yes, I'll have to do each one manually, but that way I have full understanding of what items go where in the categories, without having to guess.

Most people don't care to categorise their inventory more than what VXAce offers. Those that do, would really see a need to make every category on their own instead of using the reserved ones. Why? Because we, the designers, make use of items in special ways, whether it is with scripts or with our own workarounds.
To understand it better, here is my example:
I am using Yanfly's Equipment script where I can create my own equipment slots. I created Guardian (as in Guardian Force/Summon) slots so the actor can equip GFs like in Final Fantasy VIII. The GFs are really armours. So when a GF armour is equipped, it has traits and it also teaches the actor a skill (Summon skill with summon animation). I want to have an armours-category in my inventory screen, but I don't want the player to see GFs there! It would look weird since my GFs aren't supposed to be categorised under items! So I created my own armours category and manually placed the armour items I want shown there. I created my own All Items category so that the GFs don't appear in there either. In the end, the user wouldn't know that the GFs are really armours.

So, if the game is a simple game with not much special use of items, then using the reserved categories would be the easy solution. However, some designers would be making special use of items and would like to control what is being displayed on the inventory menu and so this script shows its full power with custom categories.

Anyways, I'm glad to be of help. :)

PS. With my GF system above, the GFs would show up in the Shop screen for sale because they are armours. That is where I make use of Mithran's Limit Shop Buy script and Enelvon/Seiryuki's Sell-Only Shop script to prevent them from showing up.
« Last Edit: April 04, 2012, 09:25:46 PM by Seiryuki »

**
Rep:
Level 71
Captain of Ultima
Ok, thank :)
I think I will make my own categories, I have custom equipment slots too, and some extra slots, so - you're right - that's the best option :)
Sorry 'bout my bad english :/

**
Rep: +0/-0Level 29
Filthy Frank fan
Hello people. I'm posting here to find some help. I can't figure out how to resize window  to fit normaly. If anyone can help out I would really appreciate it. Also, if anyone knows if there is a way to make a sub category like Weapons/Swords-Daggers-Axe-Bow  and stuff like that. Thanks for reading