#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ #_/ ◆ Skill Categorizations - KGC_CategorizeSkill ◆ VX ◆ #_/ ◇ Last Update: 03/08/2008 #_/ ◆ Written by TOMY #_/ ◆ Translation by Mr. Anonymous #_/ ◆ KGC Site: #_/ ◆ http://ytomy.sakura.ne.jp/ #_/ ◆ Translator's Blog: #_/ ◆ http://mraprojects.wordpress.com #_/----------------------------------------------------------------------------- #_/ Adds a function to the Skills screen which allows the player to display #_/ skillss by catagory. #_/ To assign a category to an skill, you must add to the #_/ notes on the specified item. #_/ EX. Fire would be listed as and Dual Strike #_/ listed as , provided you use the default #_/ terminology. Parts of this script are untested, however it should work as #_/ it is just fine. Areas untested will be highlighted by comments. #_/============================================================================= #_/ Install: Insert above other skill-related scripts. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_ $data_system = load_data("Data/System.rvdata") if $data_system == nil #==============================================================================# # ★ Customization ★ # #==============================================================================# module KGC module CategorizeSkill # ◆ Enable Skill Categorization (Non-Combat) ◆ # If this is set to true, the Skill Categories menu will be in effect in # the main skills menu. # If set to false, it will not. If that's the case, you must set # USE_SAME_MENU to false. ENABLE_NOT_IN_BATTLE = true # ◆ Enable Skill Categorization (Combat) ◆ # If this is set to true, the Skill Categories menu will be in effect in # the skills menu during battle sequences. # If set to false, it will not. If that's the case, you must set # USE_SAME_MENU to false. ENABLE_IN_BATTLE = true # ◆ Combat and Non-Combat Categorization Syncronize ◆ # If ENABLE_NOT_IN_BATTLE & ENABLE_IN_BATTLE are set to true, set this to # true. Otherwise, set it to false. # Essentially, under the true condition, the Skill Categories menu will be # the same in and out of battle. Under the false condition, you may use # different categories or text for battle and non-battle menus. USE_SAME_CATEGORY = true # ◆ Automatically Catagorize Skills ◆ # If you intend to actually utilize this script, this must be set to true. 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 = false # ◆ Recall Skill Category (Combat) ◆ # true = Automatically highlight the category of skills last used. # false = Reset to the value in SKILL_DEFAULT_CATEGORY_BATTLE. REMEMBER_INDEX_IN_BATTLE = true # ◆ Vocabulary Modifications ◆ # ◆ Category Identifier ◆ # Arrange names in order to syncronize a category with the category # identifier. # The comments to the right of each identifier are supposed to be how the # RESERVED_CATEGORY_IDENTIFIER sorts extra categories into these fields. # However, this is untested. # These are the default skill catagories translated for future reference. # "Recovery", "Offensive Magic", "Offensive Skills", # "Assist", "Special Skills", "All Skills" CATEGORY_IDENTIFIER = [ "Recovery", # Recovery / Recovery Magic / Recovery Skills "Magical", # Offensive Magic "Physical", # Offensive Skills "Assist", # Assist / Assist Magic / Assist Skills "Special", # Special Skills "All Skills", # All Skills ] # ◆ Default Catagory Display ◆ # Affects which category is highlighted by default. SKILL_DEFAULT_CATEGORY = "All Skills" # ◆ Skill Screen Category Name ◆ # Allows you to change the names of the skill categories that are displayed # in-game. These must be arranged in the same order as CATAGORY_IDENTIFIER. CATEGORY_NAME = [ "Recovery", "Magical", "Physical", "Assist", "Special", "All Skills", ] # ◆ Descriptive Text ◆ # This affects the text displayed in the skill description ("help") window. # These must be arranged in the same order as CATAGORY_IDENTIFIER. CATEGORY_DESCRIPTION = [ "Viewing Recovery #{Vocab.skill}.", "Viewing Offensive Magic.", "Viewing Physical Skills.", "Viewing Assist #{Vocab.skill}.", "Viewing Special #{Vocab.skill}.", "Viewing All #{Vocab.skill}.", ] #-------------------------- Battle Categories ------------------------------# # You ONLY a need to modify these if USE_SAME_CATEGORY is set to false. # #---------------------------------------------------------------------------# # ◆ Battle Category Identifier ◆ # Arrange names in order to syncronize a category with the category # identifier. CATEGORY_IDENTIFIER_BATTLE = [ "Recovery", "Magical", "Physical", "Assist", "Special", "All Skills", ] # ◆ Default Battle Catagory Display ◆ # See DEFAULT_CATEGORY_BATTLE SKILL_DEFAULT_CATEGORY_BATTLE = "All Skills" # ◆ Battle Skill Screen Category Name ◆ # Allows you to change the names of the skill categories (for battle). # Must be arranged in the same order as CATAGORY_IDENTIFIER. CATEGORY_NAME_BATTLE = [ "Recovery", "Magical", "Physical", "Assist", "Special", "All Skills", ] # ◆ Battle Skill Descriptive Text ◆ # This affects the text displayed in the skill description "help" window. # Must be arranged in the same order as CATAGORY_IDENTIFIER CATEGORY_DESCRIPTION_BATTLE = [ "Viewing Recovery #{Vocab.skill}.", "Viewing Offensive Magic.", "Viewing Physical Skills.", "Viewing Assist #{Vocab.skill}.", "Viewing Special #{Vocab.skill}.", "Viewing All #{Vocab.skill}.", ] if USE_SAME_CATEGORY # When USE_SAME_CATEGORY = true CATEGORY_IDENTIFIER_BATTLE = CATEGORY_IDENTIFIER SKILL_DEFAULT_CATEGORY_BATTLE = SKILL_DEFAULT_CATEGORY CATEGORY_NAME_BATTLE = CATEGORY_NAME CATEGORY_DESCRIPTION_BATTLE = CATEGORY_DESCRIPTION end # Catagory Window Position Properties # ◆ Coordinates of skill description window. [ x, y ] CATEGORY_WINDOW_POSITION = [1, 48] # ◆ Number of rows in the skill description window. CATEGORY_WINDOW_COLUMNS = 6 # ◆ Skill description window column line width. CATEGORY_WINDOW_COL_WIDTH = 84 # ◆ Skill description window column spacer width. CATEGORY_WINDOW_COL_SPACE = 1 # Battle Catagory Window Position Properties # ◆ Coordinates of skill description window. [ x, y ] CATEGORY_WINDOW_POSITION_BATTLE = [1, 48] # ◆ Number of rows in the skill description window. CATEGORY_WINDOW_COLUMNS_BATTLE = 6 # ◆ Skill description window column line width. CATEGORY_WINDOW_COL_WIDTH_BATTLE = 84 # ◆ Skill description window column spacer width. CATEGORY_WINDOW_COL_SPACE_BATTLE = 1 end end #---------------------- Reserved Categories and Indexes -----------------------# $imported = {} if $imported == nil $imported["CategorizeSkill"] = true module KGC::CategorizeSkill # CATEGORY_IDENTIFIER index SKILL_DEFAULT_CATEGORY_INDEX = CATEGORY_IDENTIFIER.index(SKILL_DEFAULT_CATEGORY) # CATEGORY_IDENTIFIER_BATTLE index (Battle) SKILL_DEFAULT_CATEGORY_INDEX_BATTLE = CATEGORY_IDENTIFIER_BATTLE.index(SKILL_DEFAULT_CATEGORY_BATTLE) # ◆ Reserved Category Index ◆ # To be honest I'm not entirely sure what this affects. # According to the original scripter(s), you can assign these categories to # skills and they'll be sorted automatically into the approperiate category. # However, I haven't tested this. If anyone does, please let me know. # These are the default reserved skill catagories for future reference. # "All Skills", "Recovery", "Recovery Magic", "Recovery Skills", "Attack", # "Attack Magic", "Attack Skills", "Assist", "Assist Magic", # "Assist Skills" RESERVED_CATEGORIES = [ "All Skills", "Recovery", "Recovery Magic", "Recovery Skills", "Attack", "Magical", "Physical", "Assist", "Assist Magic", "Assist Skills" ] # RESERVED_CATEGORY index RESERVED_CATEGORY_INDEX = {} # RESERVED_CATEGORY_INDEX_BATTLE index (Battle) 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) } # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # # 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 Defined module Regexp # Base Skill Module module Skill # Catagory Tag String CATEGORY = /<(?:CATEGORY|classification|category?)[ ]*(.*)>/i end end end #============================================================================== # ■ RPG::Skill #============================================================================== class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # ○ スキル分類のキャッシュ生成 (非戦闘時) #-------------------------------------------------------------------------- def create_categorize_skill_cache @__skill_category = [] # 自動振り分け if KGC::CategorizeSkill::ENABLE_AUTO_CATEGORIZE prefix = auto_categorize_prefix if prefix != nil suffix = auto_categorize_suffix @__skill_category << KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX[prefix] @__skill_category << KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX[prefix + suffix] end @__skill_category.compact! end # メモ欄 self.note.split(/[\r\n]+/).each { |line| if line =~ KGC::CategorizeSkill::Regexp::Skill::CATEGORY # カテゴリ c = KGC::CategorizeSkill::CATEGORY_IDENTIFIER.index($1) @__skill_category << c if c != nil end } if @__skill_category.empty? @__skill_category << KGC::CategorizeSkill::SKILL_DEFAULT_CATEGORY_INDEX elsif KGC::CategorizeSkill::NOT_ALLOW_DUPLICATE # 最後に指定したカテゴリに配置 @__skill_category = [@__skill_category.pop] end end #-------------------------------------------------------------------------- # ○ スキル分類のキャッシュ生成 (戦闘時) #-------------------------------------------------------------------------- def create_categorize_skill_battle_cache @__skill_category_battle = [] # 自動振り分け if KGC::CategorizeSkill::ENABLE_AUTO_CATEGORIZE prefix = auto_categorize_prefix if prefix != nil suffix = auto_categorize_suffix @__skill_category_battle << KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX_BATTLE[prefix] @__skill_category_battle << KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX_BATTLE[prefix + suffix] end @__skill_category_battle.compact! end # メモ欄 self.note.split(/[\r\n]+/).each { |line| if line =~ KGC::CategorizeSkill::Regexp::Skill::CATEGORY # カテゴリ c = KGC::CategorizeSkill::CATEGORY_IDENTIFIER_BATTLE.index($1) @__skill_category_battle << c if c != nil end } if @__skill_category_battle.empty? @__skill_category_battle << KGC::CategorizeSkill::SKILL_DEFAULT_CATEGORY_INDEX_BATTLE elsif KGC::CategorizeSkill::NOT_ALLOW_DUPLICATE # 最後に指定したカテゴリに配置 @__skill_category_battle = [@__skill_category_battle.pop] end end #-------------------------------------------------------------------------- # ○ 自動振り分け先の接頭辞 #-------------------------------------------------------------------------- def auto_categorize_prefix if is_recover? return "Recovery" elsif is_attack? return "Attack" elsif is_assist? return "Assist" else return nil end end #-------------------------------------------------------------------------- # ○ 自動振り分け先の接尾辞 #-------------------------------------------------------------------------- def auto_categorize_suffix return (physical_attack ? "Skill" : "Magic") end #-------------------------------------------------------------------------- # ○ 回復スキル判定 #-------------------------------------------------------------------------- def is_recover? result = for_friend? # 対象が味方 result &= (occasion != 3) # 使用不可でない result &= (base_damage < 0) || # ダメージ量が負、または (plus_state_set.empty? && # ステートを付加せずに解除する !minus_state_set.empty?) return result end #-------------------------------------------------------------------------- # ○ 攻撃スキル判定 #-------------------------------------------------------------------------- def is_attack? result = for_opponent? # 対象が敵 result &= battle_ok? # 戦闘中に使用可能 result &= (base_damage > 0) # ダメージ量が正 return result end #-------------------------------------------------------------------------- # ○ 補助スキル判定 #-------------------------------------------------------------------------- def is_assist? result = (scope != 0) # 対象が [なし] 以外 result &= battle_ok? # 戦闘中に使用可能 result &= !(plus_state_set.empty? && minus_state_set.empty?) # ステートが変化する return result end #-------------------------------------------------------------------------- # ○ スキルのカテゴリ (非戦闘時) #-------------------------------------------------------------------------- def skill_category create_categorize_skill_cache if @__skill_category == nil return @__skill_category end #-------------------------------------------------------------------------- # ○ スキルのカテゴリ (戦闘時) #-------------------------------------------------------------------------- def skill_category_battle create_categorize_skill_battle_cache if @__skill_category_battle == nil return @__skill_category_battle end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_writer :last_skill_category # カーソル記憶用 : スキルカテゴリ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # actor_id : アクター ID #-------------------------------------------------------------------------- alias initialize_KGC_CategorizeSkill initialize def initialize(actor_id) initialize_KGC_CategorizeSkill(actor_id) @last_skill_category = 0 end #-------------------------------------------------------------------------- # ○ カーソル記憶用のカテゴリ取得 #-------------------------------------------------------------------------- def last_skill_category @last_skill_category = 0 if @last_skill_category == nil return @last_skill_category end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_Skill #============================================================================== class Window_Skill < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :category # カテゴリ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 # width : ウィンドウの幅 # height : ウィンドウの高さ # actor : アクター #-------------------------------------------------------------------------- alias initialize_KGC_CategorizeSkill initialize def initialize(x, y, width, height, actor) @category = 0 initialize_KGC_CategorizeSkill(x, y, width, height, actor) end #-------------------------------------------------------------------------- # ○ カテゴリ設定 #-------------------------------------------------------------------------- def category=(value) @category = value refresh end #-------------------------------------------------------------------------- # ○ スキルをリストに含めるかどうか # skill : スキル #-------------------------------------------------------------------------- unless $@ alias include_KGC_CategorizeSkill? include? if method_defined?(:include?) end def include?(skill) return false if skill == nil if defined?(include_KGC_CategorizeSkill?) return false unless include_KGC_CategorizeSkill?(skill) end # 分類しない場合は含める if $game_temp.in_battle return true unless KGC::CategorizeSkill::ENABLE_IN_BATTLE reserved_index = KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX_BATTLE skill_category = skill.skill_category_battle else return true unless KGC::CategorizeSkill::ENABLE_NOT_IN_BATTLE reserved_index = KGC::CategorizeSkill::RESERVED_CATEGORY_INDEX skill_category = skill.skill_category end # 「全種」なら含める return true if @category == reserved_index["All Skills"] # カテゴリ一致判定 return (skill_category.include?(@category)) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @data = [] for skill in @actor.skills next unless include?(skill) @data.push(skill) if skill.id == @actor.last_skill_id self.index = @data.size - 1 end end @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # □ Window_SkillCategory #------------------------------------------------------------------------------ #  スキル画面でカテゴリ選択を行うウィンドウです。 #============================================================================== class Window_SkillCategory < Window_Command #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize if $game_temp.in_battle cols = KGC::CategorizeSkill::CATEGORY_WINDOW_COLUMNS_BATTLE width = KGC::CategorizeSkill::CATEGORY_WINDOW_COL_WIDTH_BATTLE space = KGC::CategorizeSkill::CATEGORY_WINDOW_COL_SPACE_BATTLE commands = KGC::CategorizeSkill::CATEGORY_NAME_BATTLE position = KGC::CategorizeSkill::CATEGORY_WINDOW_POSITION_BATTLE else cols = KGC::CategorizeSkill::CATEGORY_WINDOW_COLUMNS width = KGC::CategorizeSkill::CATEGORY_WINDOW_COL_WIDTH space = KGC::CategorizeSkill::CATEGORY_WINDOW_COL_SPACE commands = KGC::CategorizeSkill::CATEGORY_NAME position = KGC::CategorizeSkill::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::CategorizeSkill::CATEGORY_DESCRIPTION[self.index] else text = KGC::CategorizeSkill::CATEGORY_DESCRIPTION_BATTLE[self.index] end @help_window.set_text(text) end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Skill #============================================================================== if KGC::CategorizeSkill::ENABLE_NOT_IN_BATTLE class Scene_Skill < Scene_Base #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias start_KGC_CategorizeSkill start def start start_KGC_CategorizeSkill @category_window = Window_SkillCategory.new @category_window.help_window = @help_window show_category_window end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- alias terminate_KGC_CategorizeSkill terminate def terminate terminate_KGC_CategorizeSkill @category_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_KGC_CategorizeSkill update def update @category_window.update update_KGC_CategorizeSkill 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 @skill_window.category = @category_window.index @skill_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 elsif Input.trigger?(Input::R) Sound.play_cursor next_actor elsif Input.trigger?(Input::L) Sound.play_cursor prev_actor end end #-------------------------------------------------------------------------- # ● スキル選択の更新 #-------------------------------------------------------------------------- alias update_skill_selection_KGC_CategorizeSkill update_skill_selection def update_skill_selection if Input.trigger?(Input::B) Sound.play_cancel show_category_window return elsif Input.trigger?(Input::R) || Input.trigger?(Input::L) # 何もしない return end update_skill_selection_KGC_CategorizeSkill end #-------------------------------------------------------------------------- # ○ カテゴリウィンドウの表示 #-------------------------------------------------------------------------- def show_category_window @category_window.open @category_window.active = true @skill_window.active = false end #-------------------------------------------------------------------------- # ○ カテゴリウィンドウの非表示 #-------------------------------------------------------------------------- def hide_category_window @category_activated = false @category_window.close @category_window.active = false @skill_window.active = true # スキルウィンドウのインデックスを調整 if @skill_window.index >= @skill_window.item_max @skill_window.index = [@skill_window.item_max - 1, 0].max end end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Battle #============================================================================== if KGC::CategorizeSkill::ENABLE_IN_BATTLE class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● スキル選択の開始 #-------------------------------------------------------------------------- alias start_skill_selection_KGC_CategorizeSkill start_skill_selection def start_skill_selection start_skill_selection_KGC_CategorizeSkill # カテゴリウィンドウを作成 @category_window = Window_SkillCategory.new @category_window.help_window = @help_window @category_window.z = @help_window.z + 10 @skill_window.active = false # 記憶していたカテゴリを復元 if KGC::CategorizeSkill::REMEMBER_INDEX_IN_BATTLE @category_window.index = @active_battler.last_skill_category @skill_window.category = @category_window.index @skill_window.refresh end end #-------------------------------------------------------------------------- # ● スキル選択の終了 #-------------------------------------------------------------------------- alias end_skill_selection_KGC_CategorizeSkill end_skill_selection def end_skill_selection if @category_window != nil @category_window.dispose @category_window = nil end end_skill_selection_KGC_CategorizeSkill end #-------------------------------------------------------------------------- # ● スキル選択の更新 #-------------------------------------------------------------------------- alias update_skill_selection_KGC_CategorizeSkill update_skill_selection def update_skill_selection @category_window.update if @category_window.active update_skill_category_selection return elsif Input.trigger?(Input::B) Sound.play_cancel show_category_window return end update_skill_selection_KGC_CategorizeSkill end #-------------------------------------------------------------------------- # ● スキルの決定 #-------------------------------------------------------------------------- alias determine_skill_KGC_CategorizeSkill determine_skill def determine_skill # 選択したカテゴリを記憶 if KGC::CategorizeSkill::REMEMBER_INDEX_IN_BATTLE && @category_window != nil @active_battler.last_skill_category = @category_window.index end determine_skill_KGC_CategorizeSkill end #-------------------------------------------------------------------------- # ○ スキルのカテゴリ選択の更新 #-------------------------------------------------------------------------- def update_skill_category_selection @help_window.update # 選択カテゴリー変更 if @last_category_index != @category_window.index @skill_window.category = @category_window.index @skill_window.refresh @last_category_index = @category_window.index end if Input.trigger?(Input::B) Sound.play_cancel end_skill_selection elsif Input.trigger?(Input::C) Sound.play_decision hide_category_window end end #-------------------------------------------------------------------------- # ○ カテゴリウィンドウの表示 #-------------------------------------------------------------------------- def show_category_window @category_window.open @category_window.active = true @skill_window.active = false end #-------------------------------------------------------------------------- # ○ カテゴリウィンドウの非表示 #-------------------------------------------------------------------------- def hide_category_window @category_activated = false @category_window.close @category_window.active = false @skill_window.active = true # スキルウィンドウのインデックスを調整 if @skill_window.index >= @skill_window.item_max @skill_window.index = [@skill_window.item_max - 1, 0].max end end end end