Project1

标题: 物品分类脚本的问题 [打印本页]

作者: 雪明卡比    时间: 2014-1-18 08:50
标题: 物品分类脚本的问题
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ アイテム分類 - KGC_CategorizeItem ◆ VX ◆
#_/    ◇ Last update : 2008/01/12 ◇
#_/    翻译:snstar2006
#_/----------------------------------------------------------------------------
#_/  アイテムや武器、防具を種類別に分類する機能を作成します。
#_/  
#_/  
#_/  设置方法:在物品、武器、防具的备注栏里打上如下格式:
#_/       <分类 类别>
#_/      类别以你在 「种类 识别名称」 设置的名称分类
#_/      若是找不到分类名称,就会归在默认的物品种类下
#_/     详细设置请看下面的注释
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

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

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

module KGC
module CategorizeItem
  # ◆ 自動振り分けを行う
  # ◆ 自動分类
  #    不需在备注栏设置,会根据下面的设定自动分类
  #=================================================
  #    所有物品:所有的物品包括物品、武器、各类防具
  #    贵重物品:价格设置为0的物品(好贵重啊 = =")
  #    武器:    所有的武器(废话)
  #    盾:      盾类防具
  #    头部防具:头部防具
  #    身体防具:身体防具
  #    装饰品:  装饰品
  #        = = 所有防具的说明都是废话
  ENABLE_AUTO_CATEGORIZE = true



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

  # ◆ 多种类设置
  #  设置为 true 时,物品可以设置为多种类
  #  设置为 false时,物品会被归为最後设置的种类
  #  (「全種」は例外)

  NOT_ALLOW_DUPLICATE = false

  # ◆ カテゴリ識別名
  #  メモ欄でカテゴリを識別するための名称を並べてください。
  #  以下の名称は、メモ欄に記述する必要はありません。
  #   "全種", "貴重品", "武器", "防具", "盾", "頭防具", "身体防具", "装飾品"

  # ◆ 种类 识别名称
  #  在数据库的「备注」栏填入以下名称
  #  用来分别物品/装备类别
  #   "全種", "貴重品", "武器", "防具", "盾", "頭防具", "身体防具", "装飾品"
  CATEGORY_IDENTIFIER = [
    "一般物品",
    "战斗中使用",
    "武器",
    "盾",
    "頭部防具",
    "身体防具",
    "装饰品",
    "貴重物品",
    "剧情物品",
    "全部种类",  # ← 最後的类别,显示全部物品
  ]
  # ◆ アイテムのデフォルトカテゴリ
  #  どのカテゴリにも当てはまらないアイテムの割り当て先です。

  # ◆ 默认物品种类
  #  没有设定种类、或是分类名称找不到的物品自动归到此类中
  ITEM_DEFAULT_CATEGORY = "一般物品"

  # ◆ リストに表示する名称
  #  アイテム画面で分類ウィンドウに表示する名称です。
  #  「カテゴリ識別名」と同じ順に並べてください。

  # ◆ 种类 名称
  #  在物品画面显示的种类名称
  #  务必与上面所设置的「种类 识别名称」一样的顺序
  CATEGORY_NAME = [
    "一般",
    "战斗中使用",
    Vocab.weapon,           # 武器
    Vocab.armor1,           # 盾
    "#{Vocab.armor2}防具",  # 頭防具
    "#{Vocab.armor3}防具",  # 身体防具
    Vocab.armor4,           # 装飾品
    "貴重物品",
    "剧情物品",
    "所有物品",
  ]

  # ◆ 分類の説明文
  #  「カテゴリ識別名」と同じ順に並べてください。

  # ◆ 种类的说明
  #  务必与上面所设置的「种类 识别名称」一样的顺序

  CATEGORY_DESCRIPTION = [
    "显示十分普通的#{Vocab.item}。",
    "显示战斗中使用的#{Vocab.item}。",
    "显示#{Vocab.weapon}。",
    "显示#{Vocab.armor1}。",
    "显示#{Vocab.armor2}防具。",
    "显示#{Vocab.armor3}防具。",
    "显示#{Vocab.armor4}。",
    "显示貴重物品。",
    "显示剧情#{Vocab.item}。",
    "显示所有#{Vocab.item}。",
  ]

  # ◆ 分類ウィンドウの座標 [x, y]
  # ◆ 分類窗口座標 [x, y]
  CATEGORY_WINDOW_POSITION  = [264, 128]

  # ◆ 分類ウィンドウの列数
  # ◆ 分類窗口列数(应该是栏数吧)
  CATEGORY_WINDOW_COLUMNS   = 2

  # ◆ 分類ウィンドウの列幅
  # ◆ 分類窗口列幅(栏的宽度)
  CATEGORY_WINDOW_COL_WIDTH = 96

  # ◆ 分類ウィンドウの列間の空白
  # ◆ 分類窗口列间空白(栏与栏之间的空格大小)
  CATEGORY_WINDOW_COL_SPACE = 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
  # 预留的类别 index (自动分类时用的)
  RESERVED_CATEGORY_INDEX = {
    "全部种类"     => CATEGORY_IDENTIFIER.index("全部种类"),
    "貴重物品"   => CATEGORY_IDENTIFIER.index("貴重物品"),
    "武器"     => CATEGORY_IDENTIFIER.index("武器"),
    "防具"     => CATEGORY_IDENTIFIER.index("防具"),
    "盾"       => CATEGORY_IDENTIFIER.index("盾"),
    "頭部防具"   => CATEGORY_IDENTIFIER.index("頭部防具"),
    "身体防具" => CATEGORY_IDENTIFIER.index("身体防具"),
    "装飾品"   => CATEGORY_IDENTIFIER.index("装飾品")
  }

  # 正規表現を定義
  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.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

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

#==============================================================================
# ■ 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
end

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

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

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

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

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

class RPG::Armor < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ アイテム分類のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_categorize_item_cache
    @__item_category = []
    @__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["防具"]
    type = nil
    case self.kind
    when 0
      type = "盾"
    when 1
      type = "頭部防具"
    when 2
      type = "身体防具"
    when 3
      type = "装飾品"
    end
    if type != nil
      @__item_category << KGC::CategorizeItem::RESERVED_CATEGORY_INDEX[type]
    end
    super
  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 @category == KGC::CategorizeItem::RESERVED_CATEGORY_INDEX["全部种类"]
      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

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

#==============================================================================
# □ 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

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

#==============================================================================
# ■ 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
为什么在用这文本时提示第17行出现错误

作者: 紫英晓狼1130    时间: 2014-1-18 08:58
貌似在第二行已经表明那是VX的脚本…
所以会出错
作者: 雪明卡比    时间: 2014-1-18 08:59
紫英晓狼1130 发表于 2014-1-18 08:58
貌似在第二行已经表明那是VX的脚本…
所以会出错

原来如此,能求一个简单物品分类脚本吗?




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