=begin ◆概要 アクターが取得できるスキルに最大数を設けます。 ◆機能 ・アクターのメモ欄に<スキル最大数 n>と記入すると、アクターのスキル最大数が nになります。 ・アクターがスキルを最大数以上に覚えようとすると、専用の画面に飛びます。 ◆仕様 ・無理矢理感あるので注意。 ◆使用上の注意 ・●……再定義 ★……エイリアス ○……新規定義 =end module FAI_SNL # 設定項目:メモ欄に最大数を設定しないアクターのスキル最大数。 DEFAULT_SKILL_NUM = 8 # 設定項目:戦闘終了後、スキル設定画面でマップBGMを流さないようにする FORBID_REPLAY_BGM = true # 設定項目:スキル設定画面でのヘルプウィンドウに表示する文 # 一定時間ごとに切り替わります。サンプルを参考にしてください。 # 三つでも四つでも指定できます。 HELP_TEXT = ["スキルが最大数を超えました。\n"+ "残したいスキルを左側に移動させてください。", "決定キーでスキルを交換できます。\n"+ "Shiftキーでスキル説明文を閲覧できます。"] # 設定項目:文が切り替わる時間 HELP_COUNT = 100 end class RPG::Actor < RPG::BaseItem #-------------------------------------------------------------------------- # ○ メモ欄の取得 #-------------------------------------------------------------------------- def skill_num_max @skill_num_max || (@skill_num_max = note =~ /<スキル最大数\s*(\d+)>/ ? $1.to_i : FAI_SNL::DEFAULT_SKILL_NUM) end end #============================================================================== # ■ BattleManager #============================================================================== module BattleManager #-------------------------------------------------------------------------- # ● 勝利の処理 #-------------------------------------------------------------------------- def self.process_victory play_battle_end_me FAI_SNL::FORBID_REPLAY_BGM ? RPG::BGM.stop : replay_bgm_and_bgs $game_message.add(sprintf(Vocab::Victory, $game_party.name)) display_exp gain_gold gain_drop_items gain_exp if $game_party.members.any?{|a|a.skill_max?} $game_temp.snl_from_battle = 0 else replay_bgm_and_bgs if FAI_SNL::FORBID_REPLAY_BGM SceneManager.return end battle_end(0) return true end end #============================================================================== # ■ Game_Temp #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :snl_from_battle # 一時保存用変数 end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :skill_num_max #-------------------------------------------------------------------------- # ★ セットアップ #-------------------------------------------------------------------------- alias snl_setup setup def setup(actor_id) snl_setup(actor_id) @skill_num_max = actor.skill_num_max end #-------------------------------------------------------------------------- # ● スキルを覚える #-------------------------------------------------------------------------- def learn_skill(skill_id) unless skill_learn?($data_skills[skill_id]) @skills.push(skill_id) @skills.sort! end if skill_max? if SceneManager.scene_is?(Scene_Battle) SceneManager.snapshot_for_background SceneManager.goto(Scene_EmitSkill) else SceneManager.call(Scene_EmitSkill) end end end #-------------------------------------------------------------------------- # ○ スキルが最大か? #-------------------------------------------------------------------------- def skill_max? @skills.size > (skill_num_max || FAI_SNL::DEFAULT_SKILL_NUM) end #-------------------------------------------------------------------------- # ○ スキル群のセット #-------------------------------------------------------------------------- def skill_set(skills) @skills = skills.collect{|s|s.id} end #-------------------------------------------------------------------------- # ○ スキルのあまり #-------------------------------------------------------------------------- def emit_skills @skills[skill_num_max, 999].collect{|i|$data_skills[i]} end end #============================================================================== # □ Window_EmitSkillStatus #============================================================================== class Window_fai_snl_Base < Window_Command #-------------------------------------------------------------------------- # ○ 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number; @skills.size; end #-------------------------------------------------------------------------- # ○ ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width; Graphics.width / 2; end #-------------------------------------------------------------------------- # ○ コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list @skills.each{|s|add_command(s.name, :skill)} end #-------------------------------------------------------------------------- # ○ 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- def process_handling return unless open? && active return update_help if Input.trigger?(:A) super end #-------------------------------------------------------------------------- # ○ カーソルを右に移動 #-------------------------------------------------------------------------- def cursor_right(wrap = false) call_handler(:change) end #-------------------------------------------------------------------------- # ○ カーソルを左に移動 #-------------------------------------------------------------------------- def cursor_left(wrap = false) call_handler(:change) end #-------------------------------------------------------------------------- # ○ スキルの取得 #-------------------------------------------------------------------------- def skill @skills[index] end #-------------------------------------------------------------------------- # ○ スキルの交換 #-------------------------------------------------------------------------- def exchange_skill(skill) s = @skills[index]; @skills[index] = skill; refresh; s end #-------------------------------------------------------------------------- # ○ ヘルプウィンドウ更新メソッドの呼び出し(無効化) #-------------------------------------------------------------------------- def call_update_help end #-------------------------------------------------------------------------- # ○ ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help super @help_window.set_item(skill) end #-------------------------------------------------------------------------- # ○ 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) rect.width -= 4 draw_item_name(@skills[index], rect.x, rect.y) draw_skill_cost(rect, @skills[index]) end #-------------------------------------------------------------------------- # ○ スキルの使用コストを描画 #-------------------------------------------------------------------------- def draw_skill_cost(rect, skill) return if !@actor if @actor.skill_tp_cost(skill) > 0 change_color(tp_cost_color) draw_text(rect, @actor.skill_tp_cost(skill), 2) elsif @actor.skill_mp_cost(skill) > 0 change_color(mp_cost_color) draw_text(rect, @actor.skill_mp_cost(skill), 2) end end end #============================================================================== # □ Window_EmitSkillStatus #============================================================================== class Window_LearnedSkill < Window_fai_snl_Base #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :skills #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor) @skills = actor.skills[0, actor.skill_num_max]; @actor = actor super(0, 120) end end #============================================================================== # □ Window_EmitSkillStatus #============================================================================== class Window_EmitSkill < Window_fai_snl_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor) @skills = actor.emit_skills; @actor = actor super(window_width, 120) deactivate.select(-1) end end #============================================================================== # □ Window_EmitSkillStatus #============================================================================== class Window_EmitSkillStatus < Window_Base #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y, actor) super(x, y, 544, 48); @actor = actor; refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear draw_actor_name(@actor, 4, 0) draw_actor_level(@actor, 140, 0) draw_actor_hp(@actor, 240, 0) draw_actor_mp(@actor, 392, 0) end end #============================================================================== # □ Window_YesNo #============================================================================== class Window_YesNo < Window_HorzCommand #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super self.width = 156; self.height = 48 add_command("はい", :yes); add_command("いいえ", :no) contents.clear; create_contents; draw_all_items end #-------------------------------------------------------------------------- # ○ 桁数の取得 #-------------------------------------------------------------------------- def col_max; 2; end end class Scene_EmitSkill < Scene_Base #-------------------------------------------------------------------------- # ○ 開始処理 #-------------------------------------------------------------------------- def start @count = 0 super create_background create_all_window end #-------------------------------------------------------------------------- # ○ 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_background end #-------------------------------------------------------------------------- # ○ 全てのウィンドウの作成 #-------------------------------------------------------------------------- def create_all_window @actor = $game_party.members.find{|a|a.skill_max?} return return_scene if !@actor create_help_window @status_window = Window_EmitSkillStatus.new(0, @help_window.height, @actor) @learn_window = Window_LearnedSkill.new(@actor) @emit_window = Window_EmitSkill.new(@actor) [@learn_window, @emit_window].each{|w| w.help_window = @help_window w.set_handler(:ok, method(:on_skill_ok)) w.set_handler(:cancel, method(:on_skill_cancel)) w.set_handler(:change, method(:change_window)) } end #-------------------------------------------------------------------------- # ○ ヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_help_window @help_window = Window_Help.new @help_window.viewport = @viewport @help_window.set_text(FAI_SNL::HELP_TEXT[0]) end #-------------------------------------------------------------------------- # ○ 背景の作成 #-------------------------------------------------------------------------- def create_background @background_sprite = Sprite.new @background_sprite.bitmap = SceneManager.background_bitmap end #-------------------------------------------------------------------------- # ○ 背景の解放 #-------------------------------------------------------------------------- def dispose_background @background_sprite.dispose end #-------------------------------------------------------------------------- # ○ 全ウィンドウの更新 #-------------------------------------------------------------------------- def update_all_windows super return if @yesno_window @count += 1; @count = 1 if Input.press?(:A) if (@count % FAI_SNL::HELP_COUNT) == 0 @count = 0 if @count >= FAI_SNL::HELP_TEXT.size * FAI_SNL::HELP_COUNT @help_window.set_text(FAI_SNL::HELP_TEXT[@count / FAI_SNL::HELP_COUNT]) end end #-------------------------------------------------------------------------- # ○ ウィンドウの挙動 #-------------------------------------------------------------------------- def change_window return if [@learn_window, @emit_window].all?{|w|w.index >= 0} if @learn_window.active index = [@learn_window.index, @actor.emit_skills.size - 1].min @emit_window.activate.select(index) @learn_window.deactivate.select(-1) else index = [@emit_window.index, @actor.skill_num_max - 1].min @learn_window.activate.select(@emit_window.index) @emit_window.deactivate.select(-1) end Input.update end def on_skill_ok if [@learn_window, @emit_window].all?{|w|w.index >= 0} skill = @learn_window.skill @learn_window.exchange_skill(@emit_window.exchange_skill(skill)) @learn_window.activate; @emit_window.select(-1) else if @learn_window.index >= 0 @emit_window.activate.select(0) @learn_window.deactivate else @learn_window.activate.select(0) @emit_window.deactivate end end end def on_skill_cancel if [@learn_window, @emit_window].all?{|w|w.index >= 0} @learn_window.activate; @emit_window.select(-1) else @yesno_window = Window_YesNo.new(192, 180) @yesno_window.set_handler(:ok, method(:yesno_ok)) @yesno_window.set_handler(:cancel, method(:yesno_cancel)) @help_window.set_text("よろしいですか?") @yesno_window.openness = 0; @yesno_window.open update_basic until @yesno_window.open? end end def yesno_ok if @yesno_window.current_symbol == :yes @actor.skill_set(@learn_window.skills) if $game_party.members.find{|a|a.skill_max?} SceneManager.goto(Scene_EmitSkill) else if FAI_SNL::FORBID_REPLAY_BGM && $game_temp.snl_from_battle BattleManager.replay_bgm_and_bgs; $game_temp.snl_from_battle = nil end return_scene end else yesno_cancel end end def yesno_cancel @yesno_window.close; update_basic until @yesno_window.close? @yesno_window.dispose; @yesno_window = nil @chest_item_window.activate end end