# ▽△▽ XRXSv19. MeLT_Skillver3. スキル・セレクト ▽△▽ # # publish 2010/ 5/ 4 # update - 12/22 # # # ※素材セクション指定 - 特殊効果詰め合わせシリーズより上 # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV19 # # スキル最大数 # SkillMax = 6 # # 文字列 # Skill1_S = "戦闘用スキル" Skill2_S = "候補" end #============================================================================== # スキルデータ #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # スキル配列の取得 #-------------------------------------------------------------------------- def skill_ids return @skills end def skill_reserve_ids @skill_reserve_ids = [] unless @skill_reserve_ids return @skill_reserve_ids end def skills_reserve set = [] for i in self.skill_reserve_ids set.push($data_skills[i.to_i]) end return set end end #============================================================================== # 「スキルの習得」の変更 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● スキルを覚える *(再定義) #-------------------------------------------------------------------------- def learn_skill(skill_id) return if @skill_learn_ban unless skill_learn?($data_skills[skill_id]) if @skills.size < XRXSV19::SkillMax @skills.push(skill_id) else self.skill_reserve_ids.push(skill_id) end end end #-------------------------------------------------------------------------- # ● スキルの習得済み判定 #-------------------------------------------------------------------------- alias xrxsv19_skill_learn? skill_learn? def skill_learn?(skill) return (xrxsv19_skill_learn?(skill) or self.skill_reserve_ids.include?(skill.id) ) end #-------------------------------------------------------------------------- # ● スキルを忘れる #-------------------------------------------------------------------------- alias xrxsv19_forget_skill forget_skill def forget_skill(skill_id) xrxsv19_forget_skill self.skill_reserve_ids.delete(skill_id) end end #============================================================================== # 拡張ヘルプ対応 #============================================================================== class Window_HelpEX < Window_Help def set(item) self.set_text(item == nil ? "" : item.description) end end #============================================================================== # 背景ウィンドウ #============================================================================== class Window_SkillBack < Window_Selectable def initialize super(0, 56, 544, 304) self.z = 0 self.contents.font.color = system_color self.contents.draw_text(0,4,192,WLH, XRXSV19::Skill1_S) y2 = (XRXSV19::SkillMax + 3) / 2 * WLH + 6 self.contents.draw_text(0, y2, 192, WLH, XRXSV19::Skill2_S) end end #============================================================================== # スキルセレクトウィンドウ #============================================================================== module XRXSV19_NilDrawSkillWindow def draw_item(index) skill = @data[index] if skill != nil super if @actor.calc_mp_cost(skill) == 0 rect = item_rect(index) w = rect.width rect.width = self.contents.text_size("0").width + 8 rect.x += w - rect.width self.contents.clear_rect(rect) end else rect = item_rect(index) self.contents.clear_rect(rect) self.contents.font.color = normal_color self.contents.font.color.alpha = 128 self.contents.draw_text(rect.x + 24, rect.y, 172, 24, "---") end end end class Window_SkillSelect < Window_Skill include XRXSV19_NilDrawSkillWindow include XRXSV_CursorCopy rescue nil def initialize(actor) n = XRXSV19::SkillMax/2 y = 84 h = 32 + WLH * [[XRXSV19::SkillMax, 1].max, 6].min super(0, y, 544, h,actor) self.opacity = 0 refresh end def refresh @data = [] for i in 0...XRXSV19::SkillMax skill = $data_skills[@actor.skill_ids[i].to_i] @data.push(skill) end @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end def update_help @help_window.set(self.skill) end attr_reader :item_max end #============================================================================== # スキルリザーブウィンドウ #============================================================================== class Window_SkillReserve < Window_Skill include XRXSV19_NilDrawSkillWindow include XRXSV_CursorCopy rescue nil def initialize(actor) n = (XRXSV19::SkillMax + 1) / 2 y = 112 + n * WLH h = 32 + WLH * [8 - n, 1].max super(0, y, 544, h, actor) self.opacity = 0 refresh end def refresh @data = [] for skill in @actor.skills_reserve @data.push(skill) end @data.push(nil) unless @data.include?(nil) @data.push(nil) while @data.size < 2 @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end def index_top? return (self.index <= 1) end def update_help @help_window.set(self.skill) end end #============================================================================== # コマンド確認ウィンドウ #============================================================================== class Window_SkillCommand < Window_Command def initialize super(128, ["使う", "入れ替え"]) end end #============================================================================== # スキル画面 #============================================================================== class Scene_Skill < Scene_Base #-------------------------------------------------------------------------- # ● トランジション実行 #-------------------------------------------------------------------------- def perform_transition Graphics.transition(0) end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_menu_background @clear_style = ((XRXSV10::BG_NAME rescue "").size >= 1) @back_window = Window_SkillBack.new @back_window.opacity = 0 if @clear_style @actor = $game_party.members[@actor_index] @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) @help_window = Window_HelpEX.new @help_window.y = Graphics.height - @help_window.height @skill_window1 = Window_SkillSelect.new(@actor) @skill_window1.help_window = @help_window @skill_window1.active = true @skill_window1.index = 0 @skill_window2 = Window_SkillReserve.new(@actor) @skill_window2.help_window = @help_window @skill_window2.active = false @skill_window2.index = -1 @status_window = Window_SkillStatus.new(0, 0, @actor) @target_window = Window_MenuStatus.new(0, 0) @target_window.z += 3 @skill_window = @skill_window1 hide_target_window @help_window.visible = true @command_window.slidein! rescue nil @show_actor = @actor @next_scene = nil @next_scene_duration = 0 @last_index = -2 @skill_sort_window = nil @skill_sort_index = 0 end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_menu_background @back_window.dispose if @back_window != nil @help_window.dispose @skill_window1.dispose @skill_window2.dispose @status_window.dispose @target_window.dispose end #-------------------------------------------------------------------------- # ● 次のアクターの画面に切り替え #-------------------------------------------------------------------------- def next_actor @command_window.slideout! rescue nil @actor_index += 1 @actor_index %= $game_party.members.size @next_scene = $scene.class.new(@actor_index) @next_scene_duration = 4 end #-------------------------------------------------------------------------- # ● 前のアクターの画面に切り替え #-------------------------------------------------------------------------- def prev_actor @command_window.slideout! rescue nil @actor_index += $game_party.members.size - 1 @actor_index %= $game_party.members.size @next_scene = $scene.class.new(@actor_index) @next_scene_duration = 4 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_menu_background @help_window.update @status_window.update @target_window.update if @next_scene != nil @next_scene_duration -= 1 if @next_scene_duration < 0 $scene = @next_scene end return end if @command_window update_skill_command elsif @target_window.active update_target_selection else if Input.trigger?(Input::DOWN) and @skill_window1.active and (@skill_window1.index + 2 >= @skill_window1.item_max) Sound.play_cursor @skill_window2.active = true @skill_window2.index = (@skill_window1.index % 2) @skill_window1.active = false @skill_window1.index = -1 @skill_window = @skill_window2 return elsif Input.trigger?(Input::UP) and @skill_window2.active and @skill_window2.index_top? Sound.play_cursor @skill_window1.active = true @skill_window1.index = ((@skill_window1.item_max-1) / 2 * 2 + @skill_window2.index % 2) @skill_window2.active = false @skill_window2.index = -1 @skill_window = @skill_window1 return end if Input.trigger?(Input::R) or Input.trigger?(Input::L) # else @skill_window.update end update_skill_selection end end #-------------------------------------------------------------------------- # スキルコマンドの更新 #-------------------------------------------------------------------------- def update_skill_command @command_window.update if Input.trigger?(Input::C) Sound.play_decision case @command_window.index when 0 unless @actor.skill_can_use?(@skill) Sound.play_buzzer return end xrxsv19_update_skill_selection when 1 @skill_sort_window = @skill_window @skill_sort_index = @skill_window.index @skill_window.cursor2_copy! end @command_window.dispose @command_window = nil elsif Input.trigger?(Input::B) Sound.play_cancel @command_window.dispose @command_window = nil end end #-------------------------------------------------------------------------- # ● スキル選択の更新 #-------------------------------------------------------------------------- alias xrxsv19_update_skill_selection update_skill_selection def update_skill_selection if @skill_sort_window if Input.trigger?(Input::C) Sound.play_decision if @skill_sort_window == @skill_window1 set1 = @actor.skill_ids else set1 = @actor.skill_reserve_ids end if @skill_window == @skill_window1 set2 = @actor.skill_ids else set2 = @actor.skill_reserve_ids end skill_id1 = set1[@skill_sort_index] skill_id2 = set2[@skill_window.index] set2[@skill_window.index] = skill_id1 set1[@skill_sort_index] = skill_id2 @actor.skill_ids.compact! @skill_window.refresh @status_window.refresh @skill_sort_window.refresh if @skill_sort_window != @skill_window @skill_sort_window.cursor2_dispose! @skill_sort_window = nil elsif Input.trigger?(Input::B) Sound.play_cancel @skill_sort_window.cursor2_dispose! @skill_sort_window = nil end return elsif Input.trigger?(Input::C) @skill = @skill_window.skill unless @skill Sound.play_buzzer return end Sound.play_decision @command_window = Window_SkillCommand.new x = 32 + @skill_window.cursor_rect.x + @skill_window.cursor_rect.width - @command_window.width y = -16 + @skill_window.cursor_rect.y + @skill_window.cursor_rect.height + @skill_window.y @command_window.x = x @command_window.y = y @command_window.openness = 0 @command_window.open unless @actor.skill_can_use?(@skill) @command_window.draw_item(0, false) end return end xrxsv19_update_skill_selection end #-------------------------------------------------------------------------- # ● ターゲットウィンドウの表示 #-------------------------------------------------------------------------- alias xrxsv19_show_target_window show_target_window def show_target_window(right) #@skill_window.contents_opacity = 80 #@skill_window.cursor2_copy! rescue nil xrxsv19_show_target_window(true) @target_window.x += 16 @target_window.slidein! rescue nil @help_window.visible = true end #-------------------------------------------------------------------------- # ● ターゲットウィンドウの非表示 #-------------------------------------------------------------------------- def hide_target_window #@skill_window.cursor2_dispose! rescue nil #@skill_window.contents_opacity = 255 @skill_window.active = true @target_window.visible = false @target_window.active = false @help_window.visible = true @viewport.rect.set(0, 0, Graphics.width, Graphics.height) @viewport.ox = 0 end #-------------------------------------------------------------------------- # ● スキルの決定 #-------------------------------------------------------------------------- alias xrxsv19_determine_skill determine_skill def determine_skill if @skill.for_opponent? Sound.play_buzzer return end xrxsv19_determine_skill end #-------------------------------------------------------------------------- # ● スキルの使用 (使用効果を適用) #-------------------------------------------------------------------------- alias xrxsv19_use_skill_nontarget use_skill_nontarget def use_skill_nontarget xrxsv19_use_skill_nontarget #@ap_list_window.refresh end end #============================================================================== # --- ターゲットウィンドウ用メニューステータスへの対応 --- #============================================================================== module XRXSV19SkillTargetSlidable def slidable_scenes return super + [Scene_Skill] end end class Window_MenuStatus < Window_Selectable include XRXSV19SkillTargetSlidable end #============================================================================== # ナンバー描画への対応 #============================================================================== module XRXSVForDNX def draw_number(x, y, width, height, number, align, skin, opacity = 224) self.draw_text(x, y, width, height, number, align) end def draw_number_l(x, y, width, height, number, align = 0) skin = Cache.system(XRXSVDsIn::NumberL) rescue nil self.draw_number(x, y, width, height, number, align, skin) end def draw_number_s(x, y, width, height, number, align = 0) skin = Cache.system(XRXSVDsIn::NumberS) rescue nil self.draw_number(x, y, width, height, number, align, skin) end end class Bitmap include XRXSVForDNX end