Project1

标题: 关于“物品分类脚本”,如何设置分类战斗和非战斗物品? [打印本页]

作者: ranceking    时间: 2012-11-24 20:49
标题: 关于“物品分类脚本”,如何设置分类战斗和非战斗物品?
本帖最后由 ranceking 于 2012-12-7 01:00 编辑

这个脚本挺不错
价格0元的分类成贵重物品,武器/防具/道具也都自动识别
现在的问题是“战斗道具”和“任务道具”;前者无法自动识别,后者我也不知道怎么分类,请大神们指教

脚本如下

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ アイテム分類 - KGC_CategorizeItem ◆ VX ◆
#_/    ◇ Last update : 2009/09/04 ◇
#_/----------------------------------------------------------------------------
#_/  アイテムや武器、防具を種類別に分類する機能を作成します。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

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

#==============================================================================
# ★ カスタマイズ項目 - Customize ★
#==============================================================================

module KGC
module CategorizeItem
  # ◆ 非戦闘時に分類する
  ENABLE_NOT_IN_BATTLE = true
  # ◆ 戦闘時に分類する
  ENABLE_IN_BATTLE     = false

  # ◆ 戦闘時と非戦闘時で同じカテゴリを使用する
  #  分類ウィンドウの設定は個別に行ってください。
  USE_SAME_CATEGORY = true

  # ◆ 自動振り分けを行う
  ENABLE_AUTO_CATEGORIZE = true
  # ◆ 複数のカテゴリには配置しない
  #  true にすると、いずれか1つのカテゴリにしか振り分けなくなります。
  #  (「全種」は例外)
  NOT_ALLOW_DUPLICATE = false

  # ◆ 戦闘中に選択したアイテムの位置を記憶する
  REMEMBER_INDEX_IN_BATTLE = true


  # ━━━━━━━━ 非戦闘時 カテゴリ ━━━━━━━━

  # ◆ カテゴリ識別名
  #  メモ欄でカテゴリを識別するための名称を並べてください。
  #  以下の名称は、メモ欄に記述する必要はありません。
  #   "全種", "貴重品", "武器", "防具", "盾", "頭防具", "身体防具", "装飾品"
  CATEGORY_IDENTIFIER = [
    "通常道具",
    "战斗道具",
    "武器",
    "副手",
    "头部防具",
    "身体防具",
    "装饰品",
    "贵重品",
    "任务道具",
    "全部",  # ← 最後の項目だけは , を付けても付けなくてもOK
  ]
  # ◆ アイテムのデフォルトカテゴリ
  #  どのカテゴリにも当てはまらないアイテムの割り当て先です。
  ITEM_DEFAULT_CATEGORY = "通常道具"

  # ◆ リストに表示する名称
  #  アイテム画面で分類ウィンドウに表示する名称です。
  #  「カテゴリ識別名」と同じ順に並べてください。
  CATEGORY_NAME = [
    "通常道具",
    "战斗道具",
    Vocab.weapon,           # 武器
    "副手",           # 盾
    "#{Vocab.armor2}部防具",  # 頭防具
    "#{Vocab.armor3}防具",  # 身体防具
    Vocab.armor4,           # 装飾品
    "贵重品",
    "任务道具",
    "全部",
  ]

  # ◆ 分類の説明文
  #  「カテゴリ識別名」と同じ順に並べてください。
  CATEGORY_DESCRIPTION = [
    "平时使用的物品,包括饮食和药剂。",
    "战斗中才可以使用的危险物品。",
    "你所拥有的兵器,当然是杀人用的。",
    "包括盾牌、卷轴、书籍和其他副手可以用的东西。",
    "各种漂亮或者不漂亮的帽子。",
    "各种漂亮的衣服和盔甲。",
    "包括耳钉、手链、戒指和手表,好吧我说了手表?",
    "珍贵的东西。",
    "关键的东西,千万别弄丢。",
    "你所拥有的全部物品。",
  ]


  # ━━━━━━━━ 戦闘時 カテゴリ ━━━━━━━━
  # USE_SAME_CATEGORY = false  の場合のみ有効になります。
  # 設定方法は非戦闘時と同様です。

  # ◆ カテゴリ識別名
  CATEGORY_IDENTIFIER_BATTLE = [
    "通常アイテム",
    "戦闘用アイテム",
    "武器",
    "盾",
    "頭防具",
    "身体防具",
    "装飾品",
    "貴重品",
    "イベントアイテム",
    "全種",  # ← 最後の項目だけは , を付けても付けなくてもOK
  ]
  # ◆ アイテムのデフォルトカテゴリ
  ITEM_DEFAULT_CATEGORY_BATTLE = "通常アイテム"

  # ◆ リストに表示する名称
  CATEGORY_NAME_BATTLE = [
    "通常",
    "戦闘用",
    Vocab.weapon,           # 武器
    Vocab.armor1,           # 盾
    "#{Vocab.armor2}防具",  # 頭防具
    "#{Vocab.armor3}防具",  # 身体防具
    Vocab.armor4,           # 装飾品
    "貴重品",
    "イベント",
    "すべて",
  ]

  # ◆ 分類の説明文
  CATEGORY_DESCRIPTION_BATTLE = [
    "ごく普通の#{Vocab.item}を表示します。",
    "戦闘用の#{Vocab.item}を表示します。",
    "#{Vocab.weapon}を表示します。",
    "#{Vocab.armor1}を表示します。",
    "#{Vocab.armor2}防具を表示します。",
    "#{Vocab.armor3}防具を表示します。",
    "#{Vocab.armor4}を表示します。",
    "貴重品を表示します。",
    "イベント用の#{Vocab.item}を表示します。",
    "すべての#{Vocab.item}を表示します。",
  ]

  if USE_SAME_CATEGORY
    # 非戦闘時の設定を流用
    CATEGORY_IDENTIFIER_BATTLE   = CATEGORY_IDENTIFIER
    ITEM_DEFAULT_CATEGORY_BATTLE = ITEM_DEFAULT_CATEGORY
    CATEGORY_NAME_BATTLE         = CATEGORY_NAME
    CATEGORY_DESCRIPTION_BATTLE  = CATEGORY_DESCRIPTION
  end


  # ━━━━━━━━ 非戦闘時 分類ウィンドウ ━━━━━━━━

  # ◆ 分類ウィンドウの座標 [x, y]
  CATEGORY_WINDOW_POSITION  = [264, 128]
  # ◆ 分類ウィンドウの列数
  CATEGORY_WINDOW_COLUMNS   = 2
  # ◆ 分類ウィンドウの列幅
  CATEGORY_WINDOW_COL_WIDTH = 96
  # ◆ 分類ウィンドウの列間の空白
  CATEGORY_WINDOW_COL_SPACE = 32


  # ━━━━━━━━ 戦闘時 分類ウィンドウ ━━━━━━━━

  # ◆ 分類ウィンドウの座標 [x, y]
  CATEGORY_WINDOW_POSITION_BATTLE  = [264, 128]
  # ◆ 分類ウィンドウの列数
  CATEGORY_WINDOW_COLUMNS_BATTLE   = 2
  # ◆ 分類ウィンドウの列幅
  CATEGORY_WINDOW_COL_WIDTH_BATTLE = 96
  # ◆ 分類ウィンドウの列間の空白
  CATEGORY_WINDOW_COL_SPACE_BATTLE = 32
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["CategorizeItem"] = true

module KGC::CategorizeItem
  # アイテムのデフォルトカテゴリ index
  ITEM_DEFAULT_CATEGORY_INDEX =
    CATEGORY_IDENTIFIER.index(ITEM_DEFAULT_CATEGORY)
  # アイテムのデフォルトカテゴリ index (戦闘時)
  ITEM_DEFAULT_CATEGORY_INDEX_BATTLE =
    CATEGORY_IDENTIFIER_BATTLE.index(ITEM_DEFAULT_CATEGORY_BATTLE)

  # 予約識別名
  RESERVED_CATEGORIES = [
    "全部", "贵重品", "武器", "防具", "盾", "头部防具", "身体防具", "装饰品"
  ]
  # 予約カテゴリ index
  RESERVED_CATEGORY_INDEX = {}
  # 予約カテゴリ index (戦闘時)
  RESERVED_CATEGORY_INDEX_BATTLE = {}

  # 予約カテゴリ index 作成
  RESERVED_CATEGORIES.each { |c|
    RESERVED_CATEGORY_INDEX[c]        = CATEGORY_IDENTIFIER.index(c)
    RESERVED_CATEGORY_INDEX_BATTLE[c] = CATEGORY_IDENTIFIER_BATTLE.index(c)
  }

  module Regexp
    module BaseItem
      # カテゴリ
      CATEGORY = /<(?: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.each_line { |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 create_categorize_item_battle_cache
    if @__item_category_battle == nil ||
        !KGC::CategorizeItem::ENABLE_AUTO_CATEGORIZE
      @__item_category_battle = []
    else
      @__item_category_battle.compact!
    end

    self.note.each_line { |line|
      if line =~ KGC::CategorizeItem::Regexp::BaseItem::CATEGORY
        # カテゴリ
        c = KGC::CategorizeItem::CATEGORY_IDENTIFIER_BATTLE.index($1)
        @__item_category_battle << c if c != nil
      end
    }
    if @__item_category_battle.empty?
      @__item_category_battle <<
        KGC::CategorizeItem::ITEM_DEFAULT_CATEGORY_INDEX_BATTLE
    elsif KGC::CategorizeItem::NOT_ALLOW_DUPLICATE
      # 最後に指定したカテゴリに配置
      @__item_category_battle = [@__item_category_battle.pop]
    end
  end
  #--------------------------------------------------------------------------
  # ○ アイテムのカテゴリ (非戦闘時)
  #--------------------------------------------------------------------------
  def item_category
    create_categorize_item_cache if @__item_category == nil
    return @__item_category
  end
  #--------------------------------------------------------------------------
  # ○ アイテムのカテゴリ (戦闘時)
  #--------------------------------------------------------------------------
  def item_category_battle
    create_categorize_item_battle_cache if @__item_category_battle == nil
    return @__item_category_battle
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ 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["貴重品"]
    end
    super
  end
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成 (戦闘時)
  #--------------------------------------------------------------------------
  def create_categorize_item_battle_cache
    @__item_category_battle = []
    if self.price == 0
      @__item_category_battle <<
        KGC::CategorizeItem::RESERVED_CATEGORY_INDEX_BATTLE["貴重品"]
    end
    super
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Weapon
#==============================================================================

class RPG::Weapon < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成 (非戦闘時)
  #--------------------------------------------------------------------------
  def create_categorize_item_cache
    @__item_category = []
    @__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["武器"]
    super
  end
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成 (戦闘時)
  #--------------------------------------------------------------------------
  def create_categorize_item_battle_cache
    @__item_category_battle = []
    @__item_category_battle <<
      KGC::CategorizeItem::RESERVED_CATEGORY_INDEX_BATTLE["武器"]
    super
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Armor
#==============================================================================

class RPG::Armor < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ 定数
  #--------------------------------------------------------------------------
  CATEGORIZE_TYPE = ["盾", "头部防具", "身体防具", "装饰品"]
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成 (非戦闘時)
  #--------------------------------------------------------------------------
  def create_categorize_item_cache
    @__item_category = []
    @__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["防具"]
    type = CATEGORIZE_TYPE[self.kind]
    if type != nil
      @__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX[type]
    end
    super
  end
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成 (戦闘時)
  #--------------------------------------------------------------------------
  def create_categorize_item_battle_cache
    @__item_category_battle = []
    @__item_category_battle <<
      KGC::CategorizeItem::RESERVED_CATEGORY_INDEX_BATTLE["防具"]
    type = CATEGORIZE_TYPE[self.kind]
    if type != nil
      @__item_category_battle <<
        KGC::CategorizeItem::RESERVED_CATEGORY_INDEX_BATTLE[type]
    end
    super
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Temp
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :item_window_category     # アイテム画面で表示するカテゴリ
  attr_accessor :item_category_disabled   # アイテム画面のカテゴリ無効化フラグ
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_CategorizeItem initialize
  def initialize
    initialize_KGC_CategorizeItem

    @item_window_category   = nil
    @item_category_disabled = false
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_writer   :last_item_category       # カーソル記憶用 : アイテムカテゴリ
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  alias initialize_KGC_CategorizeItem initialize
  def initialize(actor_id)
    initialize_KGC_CategorizeItem(actor_id)

    @last_item_category = 0
  end
  #--------------------------------------------------------------------------
  # ○ カーソル記憶用のカテゴリ取得
  #--------------------------------------------------------------------------
  def last_item_category
    @last_item_category = 0 if @last_item_category == nil
    return @last_item_category
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ 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 $game_temp.in_battle
      return true unless KGC::CategorizeItem::ENABLE_IN_BATTLE
      reserved_index = KGC::CategorizeItem::RESERVED_CATEGORY_INDEX_BATTLE
    else
      return true unless KGC::CategorizeItem::ENABLE_NOT_IN_BATTLE
      reserved_index = KGC::CategorizeItem::RESERVED_CATEGORY_INDEX
    end
    return true if @category == reserved_index["全部"]

    result = include_KGC_CategorizeItem?(item)

    unless result
      # 使用可能なら追加候補とする
      if $imported["UsableEquipment"] && $game_party.item_can_use?(item)
        result = true
      end
    end
    # カテゴリ一致判定
    item_category = ($game_temp.in_battle ?
      item.item_category_battle : item.item_category)
    result &= item_category.include?(@category)
    # 「全種」なら含める
    return true if @category == reserved_index["全部"]

    return result
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_ItemCategory
#------------------------------------------------------------------------------
#  アイテム画面でカテゴリ選択を行うウィンドウです。
#==============================================================================

class Window_ItemCategory < Window_Command
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    if $game_temp.in_battle
      cols     = KGC::CategorizeItem::CATEGORY_WINDOW_COLUMNS_BATTLE
      width    = KGC::CategorizeItem::CATEGORY_WINDOW_COL_WIDTH_BATTLE
      space    = KGC::CategorizeItem::CATEGORY_WINDOW_COL_SPACE_BATTLE
      commands = KGC::CategorizeItem::CATEGORY_NAME_BATTLE
      position = KGC::CategorizeItem::CATEGORY_WINDOW_POSITION_BATTLE
    else
      cols     = KGC::CategorizeItem::CATEGORY_WINDOW_COLUMNS
      width    = KGC::CategorizeItem::CATEGORY_WINDOW_COL_WIDTH
      space    = KGC::CategorizeItem::CATEGORY_WINDOW_COL_SPACE
      commands = KGC::CategorizeItem::CATEGORY_NAME
      position = KGC::CategorizeItem::CATEGORY_WINDOW_POSITION
    end
    width = width * cols + 32
    width += (cols - 1) * space
    super(width, commands, cols, 0, space)
    self.x = position[0]
    self.y = position[1]
    self.z = 1000
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    if $game_temp.in_battle
      text = KGC::CategorizeItem::CATEGORY_DESCRIPTION_BATTLE[self.index]
    else
      text = KGC::CategorizeItem::CATEGORY_DESCRIPTION[self.index]
    end
    @help_window.set_text(text)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Item
#==============================================================================

if KGC::CategorizeItem::ENABLE_NOT_IN_BATTLE
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

    if $game_temp.item_window_category == nil
      show_category_window
    else
      # 指定カテゴリを表示
      category = $game_temp.item_window_category
      if category.is_a?(String)
        category = KGC::CategorizeItem::CATEGORY_IDENTIFIER.index(category)
      end
      @category_window.openness = 0
      hide_category_window
      @category_window.index = category
      @item_window.category  = category
      @item_window.call_update_help
    end
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  alias terminate_KGC_CategorizeItem terminate
  def terminate
    terminate_KGC_CategorizeItem

    @category_window.dispose
    $game_temp.item_window_category = nil
  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
      show_category_window
      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
      if $game_temp.item_category_disabled
        return_scene
      else
        show_category_window
      end
      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  # <-- if KGC::CategorizeItem::ENABLE_NOT_IN_BATTLE

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Battle
#==============================================================================

if KGC::CategorizeItem::ENABLE_IN_BATTLE
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● アイテム選択の開始
  #--------------------------------------------------------------------------
  alias start_item_selection_KGC_CategorizeItem start_item_selection
  def start_item_selection
    start_item_selection_KGC_CategorizeItem

    # カテゴリウィンドウを作成
    @category_window = Window_ItemCategory.new
    @category_window.help_window = @help_window
    @category_window.z = @help_window.z + 10

    if $game_temp.item_window_category == nil
      @item_window.active = false

      # 記憶していたカテゴリを復元
      if KGC::CategorizeItem::REMEMBER_INDEX_IN_BATTLE
        @category_window.index = @active_battler.last_item_category
        @item_window.category = @category_window.index
      end
    else
      # 指定カテゴリを表示
      category = $game_temp.item_window_category
      if category.is_a?(String)
        category =
          KGC::CategorizeItem::CATEGORY_IDENTIFIER_BATTLE.index(category)
      end
      hide_item_category_window
      @category_window.openness = 0
      @category_window.index    = category
      @item_window.category     = category
      @item_window.refresh
      @item_window.call_update_help
    end
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の終了
  #--------------------------------------------------------------------------
  alias end_item_selection_KGC_CategorizeItem end_item_selection
  def end_item_selection
    if @category_window != nil
      @category_window.dispose
      @category_window = nil
    end
    $game_temp.item_window_category = nil

    end_item_selection_KGC_CategorizeItem
  end
  #--------------------------------------------------------------------------
  # ● アイテム選択の更新
  #--------------------------------------------------------------------------
  alias update_item_selection_KGC_CategorizeItem update_item_selection
  def update_item_selection
    @category_window.update
    if @category_window.active
      update_item_category_selection
      return
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      if $game_temp.item_category_disabled
        end_item_selection
      else
        show_item_category_window
      end
      return
    end

    update_item_selection_KGC_CategorizeItem
  end
  #--------------------------------------------------------------------------
  # ● アイテムの決定
  #--------------------------------------------------------------------------
  alias determine_item_KGC_CategorizeItem determine_item
  def determine_item
    # 選択したカテゴリを記憶
    if KGC::CategorizeItem::REMEMBER_INDEX_IN_BATTLE && @category_window != nil
      @active_battler.last_item_category = @category_window.index
    end

    determine_item_KGC_CategorizeItem
  end
  #--------------------------------------------------------------------------
  # ○ アイテムのカテゴリ選択の更新
  #--------------------------------------------------------------------------
  def update_item_category_selection
    @help_window.update

    # 選択カテゴリー変更
    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
      end_item_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      hide_item_category_window
    end
  end
  #--------------------------------------------------------------------------
  # ○ アイテムカテゴリウィンドウの表示
  #--------------------------------------------------------------------------
  def show_item_category_window
    @category_window.open
    @category_window.active = true
    @item_window.active = false
  end
  #--------------------------------------------------------------------------
  # ○ アイテムカテゴリウィンドウの非表示
  #--------------------------------------------------------------------------
  def hide_item_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  # <-- if KGC::CategorizeItem::ENABLE_IN_BATTLE
作者: ranceking    时间: 2012-11-26 09:52
没有大触可以为我解答么?
作者: 咕噜    时间: 2012-11-28 22:51
本帖最后由 delv25 于 2012-11-28 22:53 编辑

我什么也不知道,我知道有个更好的脚本。
比如乃某些不可出售的破烂东西,0元也辨别为贵重道具就不好了……

这个脚本在道具说明后加“@分类”

比如:神圣的剑
说明:一把来自神圣领域的剑@武器
         破烂的剑
说明:二手货……@武器
         新手布衣
说明:新手村赠送的出门道具@防具

打开道具就可以看到分类了,不用担心@后面的,只会显示@前面的,@后面的归为分类。
= =希望用得开心……
  1. #==============================================================================
  2. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  3. #==============================================================================

  4. module RPG
  5.   class Weapon
  6.     def description
  7.       description = @description.split(/@/)[0]
  8.       return description != nil ? description : ''
  9.     end
  10.     def desc
  11.       desc = @description.split(/@/)[1]
  12.       return desc != nil ? desc : "普通物品"
  13.     end
  14.   end
  15.   class Item
  16.     def description
  17.       description = @description.split(/@/)[0]
  18.       return description != nil ? description : ''
  19.     end
  20.     def desc
  21.       desc = @description.split(/@/)[1]
  22.       return desc != nil ? desc : "普通物品"
  23.     end
  24.   end
  25.   class Armor
  26.     def description
  27.       description = @description.split(/@/)[0]
  28.       return description != nil ? description : ''
  29.     end
  30.     def desc
  31.       desc = @description.split(/@/)[1]
  32.       return desc != nil ? desc : "普通物品"
  33.     end
  34.   end
  35. end

  36. class Harts_Window_ItemTitle < Window_Base
  37.   def initialize
  38.     super(0, 0, 160, 64)
  39.     self.contents = Bitmap.new(width - 32, height - 32)
  40.     self.contents.clear
  41.     self.contents.font.color = normal_color
  42.     self.contents.draw_text(4, 0, 120, 32, Vocab::item, 1)
  43.   end
  44. end

  45. class Harts_Window_ItemCommand < Window_Selectable
  46.   attr_accessor :commands
  47.   def initialize
  48.     super(0, 64, 160, 296)
  49.     self.index = 0
  50.     refresh
  51.   end
  52.   
  53. def addcommand
  54.    @commands = []
  55.    for i in 1...$data_items.size
  56.      if $game_party.item_number($data_items[i]) > 0
  57.        push = true
  58.        for com in @commands
  59.          if com == $data_items[i].desc
  60.            push = false
  61.          end
  62.        end
  63.        if push == true
  64.          @commands.push($data_items[i].desc)
  65.        end
  66.      end
  67.    end
  68.    for i in 1...$data_weapons.size
  69.      if $game_party.item_number($data_weapons[i]) > 0
  70.        push = true
  71.        for com in @commands
  72.          if com == $data_weapons[i].desc
  73.            push = false
  74.            end
  75.          end
  76.          if push == true
  77.            @commands.push($data_weapons[i].desc)
  78.          end
  79.        end
  80.      end
  81.      for i in 1...$data_armors.size
  82.        if $game_party.item_number($data_armors[i]) > 0
  83.          push = true
  84.          for com in @commands
  85.            if com == $data_armors[i].desc
  86.              push = false
  87.            end
  88.          end
  89.          if push == true
  90.            @commands.push($data_armors[i].desc)
  91.          end
  92.        end
  93.      end
  94.      if @commands == []
  95.        @commands.push("普通物品")
  96.      end      
  97.      @item_max = @commands.size
  98.   end
  99.   
  100. def refresh
  101.     addcommand
  102.     create_contents
  103.     for i in 0...@item_max
  104.       draw_item(i, normal_color)
  105.     end
  106.   end
  107.   
  108.   def draw_item(index, color)
  109.     y = index * WLH
  110.     self.contents.font.color = color
  111.     if @commands[index] != nil
  112.       self.contents.draw_text(4,y, 172, WLH, @commands[index])
  113.     end
  114.   end

  115.   def update_help
  116.     @help_window.set_text(@commands[self.index])
  117.   end
  118. end

  119. class Harts_Window_ItemList < Window_Selectable
  120.   
  121.   def initialize
  122.     super(160, 0, 384, 360)
  123.     self.index = 0
  124.     refresh
  125.   end
  126.   
  127.   def item
  128.     return @data[self.index]
  129.   end
  130.   
  131.   def refresh
  132.     @data = []
  133.   end
  134.   
  135.   def set_item(command)
  136.     refresh
  137.     for i in 1...$data_items.size
  138.       if $game_party.item_number($data_items[i]) > 0  and $data_items[i].desc == command
  139.         @data.push($data_items[i])
  140.       end
  141.     end
  142.     for i in 1...$data_weapons.size
  143.       if $game_party.item_number($data_weapons[i]) > 0  and $data_weapons[i].desc == command
  144.         @data.push($data_weapons[i])
  145.       end
  146.     end
  147.     for i in 1...$data_armors.size
  148.       if $game_party.item_number($data_armors[i]) > 0  and $data_armors[i].desc == command
  149.         @data.push($data_armors[i])
  150.       end
  151.     end
  152.     @item_max = @data.size
  153.     if @item_max > 0
  154.       self.contents = Bitmap.new(width - 32, row_max * 32)
  155.       self.contents.clear
  156.       for i in 0...@item_max
  157.         draw_item(i)
  158.       end
  159.     end
  160.   end
  161.   
  162.   def item_number
  163.     return @item_max
  164.   end
  165.   
  166.   def draw_item(index)
  167.     rect = item_rect(index)
  168.     self.contents.clear_rect(rect)
  169.     item = @data[index]
  170.     if item != nil
  171.       number = $game_party.item_number(item)
  172.       enabled = $game_party.item_can_use?(item)
  173.       rect.width -= 4
  174.       draw_item_name(item, rect.x, rect.y, enabled)
  175.       self.contents.draw_text(rect, sprintf(":%2d", number), 2)
  176.     end
  177.   end
  178.   
  179.   def update_help
  180.     @help_window.set_text(self.item == nil ? "" : self.item.description)
  181.   end
  182. end
  183. class Harts_Window_Help < Window_Base
  184.   
  185.   def initialize
  186.     super(0, 360, 544, WLH + 32)
  187.   end

  188.   def set_text(text, align = 0)
  189.     if text != @text or align != @align
  190.       self.contents.clear
  191.       self.contents.font.color = normal_color
  192.       self.contents.draw_text(4, 0, self.width - 40, WLH , text, align)
  193.       @text = text
  194.       @align = align
  195.     end
  196.   end
  197. end

  198. class Harts_Window_MenuStatus < Window_Selectable

  199.   def initialize(x, y)
  200.     super(x, y, 288, 416)
  201.     refresh
  202.     self.active = false
  203.     self.index = -1
  204.   end

  205.   def refresh
  206.     self.contents.clear
  207.     @item_max = $game_party.members.size
  208.     for actor in $game_party.members
  209.       x = 8
  210.       y = actor.index * 96 + WLH / 2
  211.       draw_actor_name(actor, x, y)
  212.       draw_actor_class(actor, x + 120, y)
  213.       draw_actor_level(actor, x, y + WLH * 1)
  214.       draw_actor_state(actor, x, y + WLH * 2)
  215.       draw_actor_hp(actor, x + 120, y + WLH * 1)
  216.       draw_actor_mp(actor, x + 120, y + WLH * 2)
  217.     end
  218.   end

  219.   def update_cursor
  220.     if @index < 0               
  221.       self.cursor_rect.empty
  222.     elsif @index < @item_max  
  223.       self.cursor_rect.set(0, @index * 96, contents.width, 96)
  224.     elsif @index >= 100        
  225.       self.cursor_rect.set(0, (@index - 100) * 96, contents.width, 96)
  226.     else                       
  227.       self.cursor_rect.set(0, 0, contents.width, @item_max * 96)
  228.     end
  229.   end
  230. end

  231. class Scene_Item < Scene_Base
  232.   def start
  233.     super
  234.     create_menu_background
  235.     @viewport = Viewport.new(0, 0, 544, 416)
  236.     @itemtitle_window = Harts_Window_ItemTitle.new
  237.     @itemcommand_window = Harts_Window_ItemCommand.new
  238.     @command_index = @itemcommand_window.index
  239.     @itemcommand_window.refresh
  240.     @itemlist_window = Harts_Window_ItemList.new
  241.     @itemlist_window.active = false
  242.     @help_window = Harts_Window_Help.new
  243.     @help_window.viewport = @viewport
  244.     @target_window = Harts_Window_MenuStatus.new(96, 0)
  245.     @itemcommand_window.help_window = @help_window
  246.     @itemlist_window.help_window = @help_window
  247.     @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
  248.     hide_target_window
  249.   end

  250.   def terminate
  251.     super
  252.     dispose_menu_background
  253.     @viewport.dispose
  254.     @itemtitle_window.dispose
  255.     @itemcommand_window.dispose
  256.     @itemlist_window.dispose
  257.     @help_window.dispose
  258.     @target_window.dispose
  259.   end

  260.   def return_scene
  261.     $scene = Scene_Menu.new(0)
  262.   end

  263.   def update
  264.     super
  265.     update_menu_background
  266.     @help_window.update
  267.     @itemlist_window.update
  268.     @itemcommand_window.update
  269.     @target_window.update
  270.     @itemcommand_window.refresh
  271.     if @command_index != @itemcommand_window.index
  272.       @itemlist_window.index = 0
  273.       @command_index = @itemcommand_window.index
  274.       @itemcommand_window.update_help
  275.       @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
  276.     end
  277.     if @itemcommand_window.active
  278.       @itemcommand_window.update_help
  279.       update_itemcommand
  280.     elsif @itemlist_window.active
  281.       update_itemlist
  282.     elsif @target_window.active
  283.       update_target_selection
  284.     end
  285.   end

  286.   def update_itemcommand
  287.     if Input.trigger?(Input::B)
  288.       Sound.play_cancel
  289.       return_scene
  290.       return
  291.     end
  292.     if Input.trigger?(Input::C)
  293.       if @itemlist_window.item_number == 0
  294.         Sound.play_buzzer
  295.         return
  296.       end
  297.       Sound.play_decision
  298.       @itemcommand_window.active = false
  299.       @itemlist_window.index = 0
  300.       @itemlist_window.active = true
  301.       return
  302.     end
  303.   end

  304.   def update_itemlist
  305.     if Input.trigger?(Input::B)
  306.       Sound.play_cancel
  307.       @itemcommand_window.active = true
  308.       @itemlist_window.active = false
  309.       @itemcommand_window.index = @command_index
  310.     elsif Input.trigger?(Input::C)
  311.       @item = @itemlist_window.item
  312.       if @item != nil
  313.         $game_party.last_item_id = @item.id
  314.       end
  315.       if $game_party.item_can_use?(@item)
  316.         Sound.play_decision
  317.         determine_item
  318.       else
  319.         Sound.play_buzzer
  320.       end
  321.     end
  322.   end

  323.   def determine_item
  324.     if @item.for_friend?
  325.       show_target_window(@itemlist_window.index % 2 == 0)
  326.       if @item.for_all?
  327.         @target_window.index = 99
  328.       else
  329.         if $game_party.last_target_index < @target_window.item_max
  330.           @target_window.index = $game_party.last_target_index
  331.         else
  332.           @target_window.index = 0
  333.         end
  334.       end
  335.     else
  336.       use_item_nontarget
  337.     end
  338.   end

  339.   def update_target_selection
  340.     if Input.trigger?(Input::B)
  341.       Sound.play_cancel
  342.       if $game_party.item_number(@item) == 0
  343.         @itemlist_window.refresh                 
  344.       end
  345.       @itemlist_window.active = true
  346.       @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
  347.       hide_target_window
  348.       @itemlist_window.active = true
  349.     elsif Input.trigger?(Input::C)
  350.       if not $game_party.item_can_use?(@item)
  351.         Sound.play_buzzer
  352.       else
  353.         determine_target
  354.       end
  355.     end
  356.   end

  357.   def determine_target
  358.     used = false
  359.     if @item.for_all?
  360.       for target in $game_party.members
  361.         target.item_effect(target, @item)
  362.         used = true unless target.skipped
  363.       end
  364.     else
  365.       $game_party.last_target_index = @target_window.index
  366.       target = $game_party.members[@target_window.index]
  367.       target.item_effect(target, @item)
  368.       used = true unless target.skipped
  369.     end
  370.     if used
  371.       use_item_nontarget
  372.     else
  373.       Sound.play_buzzer
  374.     end
  375.   end

  376.   def show_target_window(right)
  377.     @itemlist_window.active = false
  378.     width_remain = 544 - @target_window.width
  379.     @target_window.x = right ? width_remain : 0
  380.     @target_window.visible = true
  381.     @target_window.active = true
  382.     if right
  383.       @viewport.rect.set(0, 0, width_remain, 416)
  384.       @viewport.ox = 0
  385.     else
  386.       @viewport.rect.set(@target_window.width, 0, width_remain, 416)
  387.       @viewport.ox = @target_window.width
  388.     end
  389.   end

  390.   def hide_target_window
  391.     @target_window.visible = false
  392.     @target_window.active = false
  393.     @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
  394.     @viewport.rect.set(0, 0, 544, 416)
  395.     @viewport.ox = 0
  396.   end

  397.   def use_item_nontarget
  398.     Sound.play_use_item
  399.     $game_party.consume_item(@item)
  400.     @itemlist_window.draw_item(@itemlist_window.index)
  401.     @itemlist_window.set_item(@itemcommand_window.commands[@command_index])
  402.     @target_window.refresh
  403.     if $game_party.all_dead?
  404.       $scene = Scene_Gameover.new
  405.     elsif @item.common_event_id > 0
  406.       $game_temp.common_event_id = @item.common_event_id
  407.       $scene = Scene_Map.new
  408.     end
  409.   end
  410. end

  411. #==============================================================================
  412. # 本脚本来自www.66RPG.com,使用和转载请保留此信息
  413. #==============================================================================
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1