#==============================================================================
# ■ 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 = true
# コマンド表示時の文字間隔
TEXT_W = 32
# スキル設定
T_SKILL = {
#スキルID => [[キー1,キー2,・・・],失敗時の威力(%)(,失敗時のアニメID)]
1 => [[UP,DOWN], 0.0],
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],
#100 => [[LEFT], 0,0],
101 => [[LEFT], 0,0]
}
#==============================================================================
# □ カスタマイズ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
#p 111
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
$csk = 1
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
$csk = @active_battler.current_action.skill_id
skill_id = @active_battler.current_action.skill_id
return unless cmd_skill_enable?(skill_id)
# コマンドスキル発動
make_cmd_skill_skill_result(skill_id)
#skill_update_phase4_step3(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?
@animation1_id = CommandSkill::T_SKILL[@skill.id][1]
@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