#============================================================================== # ■ VX-RGSS2-8 コマンドスキル [Ver.1.2.0] by Claimh #------------------------------------------------------------------------------ # コマンド入力によってスキルを発動させます。 # コマンド入力に失敗した場合、ダメージ減 or ミス #============================================================================== module CommandSkill # キー簡易置き換え A = Input::A # キーボード:Shift B = Input::B # キーボード:X C = Input::C # キーボード:C X = Input::X # キーボード:A Y = Input::Y # キーボード:S Z = Input::Z # キーボード:D L = Input::L # キーボード:Q R = Input::R # キーボード:W UP = Input::UP DOWN = Input::DOWN LEFT = Input::LEFT RIGHT = Input::RIGHT #============================================================================== # □ カスタマイズSTART #============================================================================== # 1キーあたりの入力時間 KEY_SEC = 1.0 # キー入力時に表示するバーのファイル名(Graphics/Systemにインポート) T_BAR_NAME = "bar" # コマンド表示タイプ # true :ゲームパッド式 #  false:キーボード式 KEY_TYPE = false # 成功時のSE(nil:無効) COMP_SE = "Up" # 失敗時のSE(nil:無効) MISS_SE = "Miss" # コマンド表示時の文字間隔 TEXT_W = 32 # スキル設定 T_SKILL = { #スキルID => [[キー1,キー2,・・・],失敗時の威力(%)] 7 => [[UP,DOWN], 50], 8 => [[X,C,Z], 50], 9 => [[DOWN,X,A,B], 50], 10 => [[LEFT,UP], 50], 11 => [[L,X,R], 50], 12 => [[X,C,RIGHT,R], 50], 13 => [[UP,RIGHT], 50], 14 => [[L,Z,A], 50], 15 => [[R,X,X,DOWN], 50], 16 => [[DOWN, RIGHT], 50], 17 => [[A,B,C], 50], 18 => [[Y,X,DOWN,B], 50], 19 => [[LEFT,DOWN], 50], 20 => [[Z,Y,A], 50], 21 => [[B,C,X,L], 50], 22 => [[RIGHT,DOWN], 50], 23 => [[A,B,R], 50], 24 => [[X,Y,LEFT,R], 50], 25 => [[LEFT,RIGHT], 50], 26 => [[X,L,B], 50], 27 => [[LEFT,X,C,Z], 50], 28 => [[LEFT,DOWN], 50], 29 => [[C,X,A], 50], 30 => [[X,Z,C,UP], 50], 31 => [[UP,DOWN,X], 0], 32 => [[LEFT,RIGHT,L,R], 50], 57 => [[A, C], 10], 58 => [[C, X, UP], 50], 59 => [[A, UP, RIGHT, A], 50], 60 => [[Z, C, A, B], 50], 61 => [[X, C], 50], 62 => [[UP, X, DOWN], 50], 63 => [[LEFT, C, Y, A], 50], 64 => [[X, C, Y, A], 50], 65 => [[Y, A], 50], 66 => [[RIGHT, B, A], 50], 67 => [[LEFT, UP, Z, A], 50], 68 => [[Y, B, Y, A], 50], 69 => [[LEFT, A], 50], 70 => [[A, C, A], 50], 71 => [[B, B, A, A], 50], 72 => [[A, B, X, Y], 50], 73 => [[X, A], 50], 74 => [[Y, A, B], 50], 75 => [[LEFT, RIGHT, Y, A], 50], 76 => [[A, C, L, A], 50], 77 => [[R, X], 50], 78 => [[L, C, R], 50], 79 => [[LEFT, L, RIGHT, R], 50], 80 => [[C, C, Z, RIGHT], 50] } #============================================================================== # □ カスタマイズEND #============================================================================== module_function #-------------------------------------------------------------------------- # ● キーリスト取得 #-------------------------------------------------------------------------- def get_key_list(skill_id) return nil if T_SKILL[skill_id].nil? return nil if T_SKILL[skill_id][0].nil? return T_SKILL[skill_id][0] end def get_per(skill_id) return nil if T_SKILL[skill_id].nil? return nil if T_SKILL[skill_id][1].nil? return T_SKILL[skill_id][1] end end #============================================================================== # ■ Input #============================================================================== module Input module_function #-------------------------------------------------------------------------- # ● 指定キー以外のキー入力判定 #-------------------------------------------------------------------------- def n_trigger?(num) if trigger?(num) return false elsif trigger?(A) or trigger?(B) or trigger?(C) or trigger?(X) or trigger?(Y) or trigger?(Z) or trigger?(L) or trigger?(R) or trigger?(UP) or trigger?(DOWN) or trigger?(RIGHT) or trigger?(LEFT) return true end return false # 未入力または使用しないキーの場合 end #-------------------------------------------------------------------------- # ● キー変換テーブル(表示文字取得用) #-------------------------------------------------------------------------- GP_KEY = { # ゲームパッド用変換テーブル A=>"A",B=>"B",C=>"C",X=>"X",Y=>"Y",Z=>"Z",L=>"L",R=>"R", UP=>"↑",DOWN=>"↓",LEFT=>"←",RIGHT=>"→" } KB_KEY = { # キーボード用変換テーブル A=>"Sh",B=>"X",C=>"Z",X=>"A",Y=>"S",Z=>"D",L=>"Q",R=>"W", UP=>"↑",DOWN=>"↓",LEFT=>"←",RIGHT=>"→" } def key_converter(key) # ゲームパッドタイプ if CommandSkill::KEY_TYPE ret = GP_KEY[key] # キーボードタイプ else ret = KB_KEY[key] end return (ret == nil ? "" : ret ) end end #============================================================================== # ■ Window_KeyCounter #------------------------------------------------------------------------------ #  進捗率を表示するバー #============================================================================== class Window_KeyCounter < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # key :キー配列 #-------------------------------------------------------------------------- def initialize super(0, 244, 150, 80) self.contents = Bitmap.new(width - 32, height - 32) self.opacity = 0 self.z = 1 # バトラーよりも奥に表示 refresh(0) end #-------------------------------------------------------------------------- # ● リフレッシュ # current = 進捗率(%) #-------------------------------------------------------------------------- def refresh(current) self.contents.clear #draw_counter_bar(0, 0, 100-current) # 進捗方向:← draw_counter_bar(0, 0, current) # 進捗方向:→ end #-------------------------------------------------------------------------- # ● バー表示 # x : x表示位置 # y : y表示位置 # current : 進捗率(%) #-------------------------------------------------------------------------- def draw_counter_bar(x, y, current) bitmap = Cache.system(CommandSkill::T_BAR_NAME) cw = bitmap.width * current / 100 ch = bitmap.height src_rect = Rect.new(0, 0, cw, ch) self.contents.blt(x, y, bitmap, src_rect) end end #============================================================================== # ■ Window_KeyCount #------------------------------------------------------------------------------ #  入力するキーを表示するウィンドウ。 #============================================================================== class Window_KeyCount < Window_Base TEXT_H = WLH # 文字高さ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # key :キー配列 #-------------------------------------------------------------------------- def initialize(key) super(0, 208, 150, 80) self.contents = Bitmap.new(width - 32, height - 32) self.back_opacity = 160 # 半透明 self.z = 0 # 進捗バーよりも奥に表示 @key = key @key_count = 0 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@key.size x = i * CommandSkill::TEXT_W # 文字間の間隔 if i < @key_count self.contents.font.color = knockout_color else self.contents.font.color = normal_color end self.contents.draw_text(x, 0, 100, TEXT_H, Input.key_converter(@key[i])) end end #-------------------------------------------------------------------------- # ● キーカウント #-------------------------------------------------------------------------- def key_in @key_count += 1 refresh end #-------------------------------------------------------------------------- # ● テキスト表示 # text : テキスト #-------------------------------------------------------------------------- def text_in(text) self.contents.clear self.contents.draw_text(0, 0, 100, TEXT_H, text, 1) end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler attr_accessor :cmd_miss_flag # コマンド入力ミス #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_cmd_skill initialize def initialize initialize_cmd_skill # 原物 @cmd_miss_flag = false end #-------------------------------------------------------------------------- # ● 最終命中率の計算 # user : 攻撃者、スキルまたはアイテムの使用者 # obj : スキルまたはアイテム (通常攻撃の場合は nil) #-------------------------------------------------------------------------- alias calc_hit_cmd_skill calc_hit def calc_hit(user, obj = nil) if obj.is_a?(RPG::Skill) and $scene.is_a?(Scene_Battle) and user.cmd_miss_flag and CommandSkill.get_per(obj.id) == 0 user.cmd_miss_flag = false return -1 end calc_hit_cmd_skill(user, obj) end #-------------------------------------------------------------------------- # ● スキルまたはアイテムによるダメージ計算 # user : スキルまたはアイテムの使用者 # obj : スキルまたはアイテム # 結果は @hp_damage または @mp_damage に代入する。 #-------------------------------------------------------------------------- alias make_obj_damage_value_cmd_skill make_obj_damage_value def make_obj_damage_value(user, obj) make_obj_damage_value_cmd_skill(user, obj) if obj.is_a?(RPG::Skill) and $scene.is_a?(Scene_Battle) and user.cmd_miss_flag user.cmd_miss_flag = false if obj.damage_to_mp @mp_damage = (@mp_damage * CommandSkill.get_per(obj.id) / 100).truncate else @hp_damage = (@hp_damage * CommandSkill.get_per(obj.id) / 100).truncate end end end end #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● CMD Skill初期化 #-------------------------------------------------------------------------- def init_cmd_skill @active_battler.cmd_miss_flag = false @cmd_skill_ok = false # @cmd_skill_miss_flag = false end #-------------------------------------------------------------------------- # ● CMD Skill実行可能? #-------------------------------------------------------------------------- def cmd_skill_enable?(skill_id) # エネミーは不可 return false if @active_battler.is_a?(Game_Enemy) # データなし return false if CommandSkill.get_key_list(skill_id).nil? # 閃き時コマンドなし if defined?(SysFlash) return false if @active_battler.flash_flag end return true end #-------------------------------------------------------------------------- # ● CMD Skill前処理 #-------------------------------------------------------------------------- def pre_cmd_skill init_cmd_skill skill_id = @active_battler.action.skill.id return unless cmd_skill_enable?(skill_id) # コマンドスキル発動 make_cmd_skill_skill_result(skill_id) =begin # 全体化 [VXでは仕様削除] if CommandSkill::ALL_ATK and @cmd_skill_ok if CommandSkill::ALL_ATK_SK.include?(skill_id) @skill_copy = @skill.dup @skill.scope = 2 @active_battler.action.make_targets end end =end end #-------------------------------------------------------------------------- # ● CMD Skill後処理 #-------------------------------------------------------------------------- def after_cmd_skill =begin if CommandSkill::ALL_ATK and @cmd_skill_ok if CommandSkill::ALL_ATK_SK.include?(@skill_copy.id) @skill = $data_skills[@skill_copy.id] = @skill_copy end end # Miss時にアニメーションを変える [VXでは仕様削除] if CommandSkill::MISS_ANIME and @cmd_skill_miss_flag @cmd_skill_miss_flag = false unless CommandSkill::T_SKILL[@skill.id][2].nil? @animation2_id = CommandSkill::T_SKILL[@skill.id][2] end end =end init_cmd_skill end #-------------------------------------------------------------------------- # ● コマンドスキル Window X位置取得 #-------------------------------------------------------------------------- def cmd_skill_window_x return 544 - 150 end #-------------------------------------------------------------------------- # ● コマンドスキル コマンド入力ループ #-------------------------------------------------------------------------- def cmd_skill_loop(cmd_list, time) key_count = 0 for i in 0...time update_basic # キー入力に成功? if Input.trigger?(cmd_list[key_count]) key_count += 1 @window_keycount.key_in elsif Input.n_trigger?(cmd_list[key_count]) # 違うキーを押した # Miss時 SE演奏 Audio.se_play("Audio/SE/" + CommandSkill::MISS_SE) if CommandSkill::MISS_SE != nil break end # 全キー入力完了 if key_count >= cmd_list.size @window_keycount.text_in("Complete") # Complete時 SE演奏 Audio.se_play("Audio/SE/" + CommandSkill::COMP_SE) if CommandSkill::COMP_SE != nil @cmd_skill_ok = true break end # 進捗バーの更新 @window_counter.refresh((i*100/time).truncate) end end #-------------------------------------------------------------------------- # ● コマンドスキル 結果作成 #-------------------------------------------------------------------------- def make_cmd_skill_skill_result(skill_id) # コマンドリスト取得 cmd_list = CommandSkill.get_key_list(skill_id) time = CommandSkill::KEY_SEC * cmd_list.size * Graphics.frame_rate # キー入力&カウントウィンドウ作成 @window_keycount = Window_KeyCount.new(cmd_list) @window_counter = Window_KeyCounter.new @window_keycount.x = @window_counter.x = cmd_skill_window_x # コマンド入力ループ cmd_skill_loop(cmd_list, time) # ミス時は"Miss"表示 unless @cmd_skill_ok @window_keycount.text_in("Miss") @active_battler.cmd_miss_flag = true # @cmd_skill_miss_flag = true end # Miss、Complete表示用のウェイト for i in 0...10 update_basic end @window_keycount.dispose @window_counter.dispose end #------------------------------------------------------------------------------ #-------------------------------------------------------------------------- # ● 戦闘行動の実行 : スキル #-------------------------------------------------------------------------- alias execute_action_cmd_skill execute_action_skill def execute_action_skill pre_cmd_skill # 追加 execute_action_cmd_skill after_cmd_skill # 追加 end end