#============================================================================== # ■ XP-RGSS-33 コマンドスキル [Ver.2.3.0] by Claimh #------------------------------------------------------------------------------ # コマンド入力によってスキルを発動させます。 # コマンド入力に失敗した場合、威力減少(&アニメーション変化) #============================================================================== module CommandSkill # キー簡易置き換え A = Input::A # キーボード:Z 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 RAND = "?" # ランダムキー #============================================================================== # □ カスタマイズSTART #============================================================================== # 1キーあたりの入力時間 KEY_SEC = 1.0 # キー入力時に表示するバーのファイル名(Graphics/Windowskinsにインポート) T_BAR_NAME = "bar" # コマンド表示タイプ # true :ゲームパッド式 #  false:キーボード式 KEY_TYPE = true # コマンド入力成功時に対象を全体化(true:有効|false:無効) ALL_ATK = false # 全体化するスキルID ALL_ATK_SK = [57, 61] # 成功時のSE(nil:無効) COMP_SE = "056-Right02" # 失敗時のSE(nil:無効) MISS_SE = "058-Wrong02" # 失敗時に対象側アニメーションを変える(true:有効|false:無効) MISS_ANIME = false # コマンド表示時の文字間隔 TEXT_W = 32 # スキル設定 T_SKILL = { #スキルID => [[キー1,キー2,・・・],失敗時の威力(%)(,失敗時のアニメID)] 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 => [[RAND, RAND], 10], 58 => [[C, X, UP], 50], 59 => [[A, UP, RIGHT, A], 50], 60 => [[Z, C, A, B], 50], 61 => [[X, RAND], 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 #============================================================================== R_KEYS = [A,B,C,X,Y,Z,L,R,UP,DOWN,LEFT,RIGHT] # ランダムキーに使うキー配列 #-------------------------------------------------------------------------- # ● キーリスト取得 #-------------------------------------------------------------------------- def self.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 self.change_rand(list) ret_list = [] for i in 0...list.size ret_list.push(list[i] == RAND ? R_KEYS[rand(R_KEYS.size)] : list[i]) end return ret_list 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=>"Z",B=>"X",C=>"C",X=>"A",Y=>"S",Z=>"D",L=>"Q",R=>"W", UP=>"↑",DOWN=>"↓",LEFT=>"←",RIGHT=>"→" } def key_converter(key) return CommandSkill::RAND if key == CommandSkill::RAND # ゲームパッドタイプ 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, 256, 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 = RPG::Cache.windowskin(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 = 32 # 文字高さ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # key :キー配列 #-------------------------------------------------------------------------- def initialize(key) super(0, 220, 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 : スキルの使用者 (バトラー) # skill : スキル #-------------------------------------------------------------------------- alias skill_effect_cmd_skill skill_effect def skill_effect(user, skill) if $scene.is_a?(Scene_Battle) and user.cmd_miss_flag skill_copy = $data_skills[skill.id].dup skill.power = skill.power * CommandSkill::T_SKILL[skill.id][1] / 100 skill.hit = 0 if skill.power == 0 # 威力0で命中しない補正 end ret = skill_effect_cmd_skill(user, skill) if $scene.is_a?(Scene_Battle) and user.cmd_miss_flag user.cmd_miss_flag = false $data_skills[skill.id] = skill_copy.dup end return ret 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? # 閃き時コマンドなし return false if defined?(SysFlash) and @active_battler.flash_flg # 強制アクションでなければ unless @active_battler.current_action.forcing # SP 切れなどで使用できなくなった場合 unless @active_battler.skill_can_use?(skill_id) # アクション強制対象のバトラーをクリア $game_temp.forcing_battler = nil return false end end return true end #-------------------------------------------------------------------------- # ● CMD Skill前処理 #-------------------------------------------------------------------------- def pre_cmd_skill init_cmd_skill skill_id = @active_battler.current_action.skill_id return unless cmd_skill_enable?(skill_id) # コマンドスキル発動 make_cmd_skill_skill_result(skill_id) # 全体化 if CommandSkill::ALL_ATK and @cmd_skill_ok if CommandSkill::ALL_ATK_SK.include?(skill_id) @skill_copy = @skill.dup @skill.scope = 2 end end end #-------------------------------------------------------------------------- # ● CMD Skill後処理 #-------------------------------------------------------------------------- def after_cmd_skill 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時にアニメーションを変える if CommandSkill::MISS_ANIME and @cmd_skill_miss_flag unless CommandSkill::T_SKILL[@skill.id][2].nil? @animation2_id = CommandSkill::T_SKILL[@skill.id][2] end end init_cmd_skill end #-------------------------------------------------------------------------- # ● コマンドスキル Window X位置取得 #-------------------------------------------------------------------------- def cmd_skill_window_x #「戦闘位置補正」併用時にコメント外す #case $game_party.actors.size #when 1 # actor_x = 240 #when 2 # actor_x = @active_battler.index * 240 + 120 #when 3 # actor_x = @active_battler.index * 200 + 40 #when 4 actor_x = @active_battler.index * 160 #end return actor_x end #-------------------------------------------------------------------------- # ● コマンドスキル コマンド入力ループUPDATE #-------------------------------------------------------------------------- def cmd_skill_loop_update Graphics.update Input.update @spriteset.update end #-------------------------------------------------------------------------- # ● コマンドスキル コマンド入力ループ #-------------------------------------------------------------------------- def cmd_skill_loop(cmd_list, time) key_count = 0 for i in 0...time cmd_skill_loop_update # キー入力に成功? 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) cmd_list = CommandSkill.change_rand(cmd_list) 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 cmd_skill_loop_update end @window_keycount.dispose @window_counter.dispose end #------------------------------------------------------------------------------ #-------------------------------------------------------------------------- # ● スキルアクション 結果作成 #-------------------------------------------------------------------------- alias make_skill_action_result_cmd_skill make_skill_action_result def make_skill_action_result pre_cmd_skill make_skill_action_result_cmd_skill # 原物 after_cmd_skill end end