Код:
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
#_/ ◆ Item Categorization - KGC_CategorizeItem ◆ VX ◆
#_/ ◇ Last update : 2008/04/10 ◇
#_/ ◇ Translated by Mr. Anonymous ◇
#_/ ◆ http://ytomy.sakura.ne.jp/ ◆
#_/-----------------------------------------------------------------------------
#_/ Adds a function to the Items screen which allows the player to display
#_/ items by catagory.
#_/ To assign a category to an item, you must add <category IDENTIFIER> to the
#_/ notes on the specified item.
#_/ EX. A Potion would be listed as <category Goods> and a Sword would be
#_/ listed as <category Weapons>, provided you use the default terminology.
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
$data_system = load_data("Data/System.rvdata") if $data_system == nil
#==============================================================================#
# ★ Customization ★ #
#==============================================================================#
module KGC
module CategorizeItem
# ◆ Automatically Catagorize Items ◆
ENABLE_AUTO_CATEGORIZE = true
# ◆ Duplicate Category Entries. ◆
# Set to false, items can have multiple categories.
# Set to true, items will be classified under the last tag (In the item
# database "Notes")
NOT_ALLOW_DUPLICATE = true
# ◆ Category Identifier ◆
# Arrange names in order to identify a category with the category identifier.
# These are the default item catagories translated for future reference.
# "Goods", "Combat", "Weapons", "Shields", "Helmets", "Armor",
# "Accessories", "Valuables", "Special Items", "All Items"
CATEGORY_IDENTIFIER = [
"Goods", # Consumable items (potion)
"Combat", # Battle-only items (fire bomb)
"Weapons", # Weapons
"Shields", # Shields
"Helmets", # Head Gear / Helmets
"Armor", # Body Gear / Armor
"Accessories", # Accessories / Rings, Necklaces, etc
"Valuables", # Treasures and the like
"Special Items", # AKA Plot Devices. Special keys, etc.
"All Items", # All Items
]
# ◆ Default Catagory Display ◆
# Not hard to figure this one out.
ITEM_DEFAULT_CATEGORY = "Goods"
# ◆ Item Screen Category Name ◆
# Shows what current category is selected in the item description window.
# Must be arranged in the same order as CATAGORY_IDENTIFIER.
CATEGORY_NAME = [
"Goods",
"Combat",
Vocab.weapon, # Weapons
Vocab.armor1, # Shields
"#{Vocab.armor2}", # Head Gear
"#{Vocab.armor3}", # Body Gear
Vocab.armor4, # Accessories
"Valuables",
"Special",
"All",
]
# ◆ Descriptive Text ◆
# Must be arranged in the same order as CATAGORY_IDENTIFIER
CATEGORY_DESCRIPTION = [
"Viewing #{Vocab.item}.",
"Viewing Combat #{Vocab.item}. For use during battle.",
"Viewing #{Vocab.weapon}s.",
"Viewing #{Vocab.armor1}s.",
"Viewing #{Vocab.armor2}s.",
"Viewing #{Vocab.armor3}s.",
"Viewing #{Vocab.armor4}.",
"Viewing Valuables.",
"Viewing Special #{Vocab.item}. A.K.A. Plot Devices.",
"Viewing All #{Vocab.item}.",
]
# ◆ Coordinates of item description window. [ x, y ]
CATEGORY_WINDOW_POSITION = [1, 48]
# ◆ Number of rows in the item description window.
CATEGORY_WINDOW_COLUMNS = 10
# ◆ Item description window column line width.
CATEGORY_WINDOW_COL_WIDTH = 50
# ◆ item description window column spacer width.
CATEGORY_WINDOW_COL_SPACE = 1
end
end
#------------------------------------------------------------------------------#
$imported = {} if $imported == nil
$imported["CategorizeItem"] = true
module KGC::CategorizeItem
# ◆ Item Index ◆
ITEM_DEFAULT_CATEGORY_INDEX = CATEGORY_IDENTIFIER.index(ITEM_DEFAULT_CATEGORY)
# ◆ Reserved Category Index ◆
# To be honest I'm not entirely sure what this affects.
RESERVED_CATEGORY_INDEX = {
"All Items" => CATEGORY_IDENTIFIER.index("All Items"),
"Valuables" => CATEGORY_IDENTIFIER.index("Valuables"),
"Weapons" => CATEGORY_IDENTIFIER.index("Weapons"),
"Gear" => CATEGORY_IDENTIFIER.index("Gear"),
"Shields" => CATEGORY_IDENTIFIER.index("Shields"),
"Helmets" => CATEGORY_IDENTIFIER.index("Helmets"),
"Armor" => CATEGORY_IDENTIFIER.index("Armor"),
"Accessories" => CATEGORY_IDENTIFIER.index("Accessories")
}
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
# Unless you know what you're doing, it's best not to alter anything beyond #
# this point, as this only affects the tags used for "Notes" in database. #
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #
# Whatever word(s) are after the separator ( | ) in the following lines are
# what are used to determine what is searched for in the "Notes" section.
# Regular Expression Definition
module Regexp
# Base Item Module
module BaseItem
# Category tag string
CATEGORY = /^<(?:CATEGORY|classification|category?)[ ]*(.*)>/i
end
end
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================
class RPG::BaseItem
#--------------------------------------------------------------------------
# ○ アイテム分類のキャッシュ生成
#--------------------------------------------------------------------------
def create_categorize_item_cache
if @__item_category == nil || !KGC::CategorizeItem::ENABLE_AUTO_CATEGORIZE
@__item_category = []
else
@__item_category.compact!
end
self.note.split(/[\r\n]+/).each { |line|
if line =~ KGC::CategorizeItem::Regexp::BaseItem::CATEGORY
# カテゴリ
c = KGC::CategorizeItem::CATEGORY_IDENTIFIER.index($1)
@__item_category << c if c != nil
end
}
if @__item_category.empty?
@__item_category << KGC::CategorizeItem::ITEM_DEFAULT_CATEGORY_INDEX
elsif KGC::CategorizeItem::NOT_ALLOW_DUPLICATE
# 最後に指定したカテゴリに配置
@__item_category = [@__item_category.pop]
end
end
#--------------------------------------------------------------------------
# ○ アイテムのカテゴリ
#--------------------------------------------------------------------------
def item_category
create_categorize_item_cache if @__item_category == nil
return @__item_category
end
end
#==================================End Class===================================#
#==============================================================================
# ■ RPG::UsableItem
#==============================================================================
class RPG::UsableItem < RPG::BaseItem
#--------------------------------------------------------------------------
# ○ アイテム分類のキャッシュ生成
#--------------------------------------------------------------------------
def create_categorize_item_cache
@__item_category = []
if self.price == 0
@__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["Valuables"]
end
super
end
end
#==================================End Class===================================#
#==============================================================================
# ■ RPG::Weapon
#==============================================================================
class RPG::Weapon < RPG::BaseItem
#--------------------------------------------------------------------------
# ○ アイテム分類のキャッシュ生成
#--------------------------------------------------------------------------
def create_categorize_item_cache
@__item_category = []
@__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["Weapon"]
super
end
end
#==================================End Class===================================#
#==============================================================================
# ■ RPG::Armor
#==============================================================================
class RPG::Armor < RPG::BaseItem
#--------------------------------------------------------------------------
# ○ アイテム分類のキャッシュ生成
#--------------------------------------------------------------------------
def create_categorize_item_cache
@__item_category = []
@__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["Armor"]
type = nil
case self.kind
when 0
type = "Shields"
when 1
type = "Head Gear"
when 2
type = "Body Gear"
when 3
type = "Accessories"
end
if type != nil
@__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX[type]
end
super
end
end
#==================================End Class===================================#
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :category # カテゴリ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# x : ウィンドウの X 座標
# y : ウィンドウの Y 座標
# width : ウィンドウの幅
# height : ウィンドウの高さ
#--------------------------------------------------------------------------
alias initialize_KGC_CategorizeItem initialize
def initialize(x, y, width, height)
@category = 0
initialize_KGC_CategorizeItem(x, y, width, height)
end
#--------------------------------------------------------------------------
# ○ カテゴリ設定
#--------------------------------------------------------------------------
def category=(value)
@category = value
refresh
end
#--------------------------------------------------------------------------
# ● アイテムをリストに含めるかどうか
# item : アイテム
#--------------------------------------------------------------------------
alias include_KGC_CategorizeItem? include?
def include?(item)
return false if item == nil
# 「全種」なら無条件で含める
if @category == KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["All Items"]
return true
end
result = include_KGC_CategorizeItem?(item)
unless result
# 使用可能なら追加候補とする
if $imported["UsableEquipment"] && $game_party.item_can_use?(item)
result = true
end
end
# 戦闘外ならカテゴリ一致判定
unless $game_temp.in_battle
result &= (item.item_category.include?(@category))
end
return result
end
end
#==================================End Class===================================#
#==============================================================================
# □ Window_ItemCategory
#------------------------------------------------------------------------------
# アイテム画面でカテゴリ選択を行うウィンドウです。
#==============================================================================
class Window_ItemCategory < Window_Command
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
cols = KGC::CategorizeItem::CATEGORY_WINDOW_COLUMNS
width = KGC::CategorizeItem::CATEGORY_WINDOW_COL_WIDTH * cols + 32
width += (cols - 1) * KGC::CategorizeItem::CATEGORY_WINDOW_COL_SPACE
commands = KGC::CategorizeItem::CATEGORY_NAME
super(width, commands, cols, 0,
KGC::CategorizeItem::CATEGORY_WINDOW_COL_SPACE)
self.x = KGC::CategorizeItem::CATEGORY_WINDOW_POSITION[0]
self.y = KGC::CategorizeItem::CATEGORY_WINDOW_POSITION[1]
self.z = 1000
self.index = 0
end
#--------------------------------------------------------------------------
# ● ヘルプテキスト更新
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(KGC::CategorizeItem::CATEGORY_DESCRIPTION[self.index])
end
end
#==================================End Class===================================#
#==============================================================================
# ■ Scene_Item
#==============================================================================
class Scene_Item < Scene_Base
#--------------------------------------------------------------------------
# ● 開始処理
#--------------------------------------------------------------------------
alias start_KGC_CategorizeItem start
def start
start_KGC_CategorizeItem
@category_window = Window_ItemCategory.new
@category_window.help_window = @help_window
show_category_window
end
#--------------------------------------------------------------------------
# ● 終了処理
#--------------------------------------------------------------------------
alias terminate_KGC_CategorizeItem terminate
def terminate
terminate_KGC_CategorizeItem
@category_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias update_KGC_CategorizeItem update
def update
@category_window.update
update_KGC_CategorizeItem
if @category_window.active
update_category_selection
end
end
#--------------------------------------------------------------------------
# ○ カテゴリ選択の更新
#--------------------------------------------------------------------------
def update_category_selection
unless @category_activated
@category_activated = true
return
end
# 選択カテゴリー変更
if @last_category_index != @category_window.index
@item_window.category = @category_window.index
@item_window.refresh
@last_category_index = @category_window.index
end
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::C)
Sound.play_decision
hide_category_window
end
end
#--------------------------------------------------------------------------
# ● アイテム選択の更新
#--------------------------------------------------------------------------
alias update_item_selection_KGC_CategorizeItem update_item_selection
def update_item_selection
if Input.trigger?(Input::B)
Sound.play_cancel
show_category_window
return
end
update_item_selection_KGC_CategorizeItem
end
#--------------------------------------------------------------------------
# ○ カテゴリウィンドウの表示
#--------------------------------------------------------------------------
def show_category_window
@category_window.open
@category_window.active = true
@item_window.active = false
end
#--------------------------------------------------------------------------
# ○ カテゴリウィンドウの非表示
#--------------------------------------------------------------------------
def hide_category_window
@category_activated = false
@category_window.close
@category_window.active = false
@item_window.active = true
# アイテムウィンドウのインデックスを調整
if @item_window.index >= @item_window.item_max
@item_window.index = [@item_window.item_max - 1, 0].max
end
end
end
#==================================End Class===================================#
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
#_/ The original untranslated version of this 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
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
Социальные закладки