#==============================================================================
# ■ 特殊消費スキル By 貪藻矢射妥←
#------------------------------------------------------------------------------
# スキルの消費SPをMaxSPの割合で消費する、あるいはHPで消費するってなヤツ
#
# MaxSPにおける割合もHPの場合も全てスキルのSP消費量にて設定します。
# また、消費軽減属性を使用することでSP(HP)の消費を増減することが可能です。
#
# ※消費軽減属性のついた防具を複数装備することでさらに消費が増加/軽減されます。
# (故に消費『半減』、『倍増』ではなく、『軽減』、『増加』なのです。)
#
#==============================================================================
# 更新っぽいもの
#
# 2007:02:16
# ・HP消費スキルでもスキルの使用可能判定にSPが関与していたバグを修正
#
# 2007:06:28
# ・消費軽減属性を設定可能に・・・
#
# 2007:07:13
# ・消費軽減、、増加属性を設定可能に・・・
# ・スクリプトを微調整
#
# 2007:10:01
# ・HP消費スキルなどが使える場合でも、アイコンが半透明だったバグを修正
#
# 2008:09:18
# ・スキルのコストの色変え機能を追加
# ・カスタマイズポイント:色の変更
#
# 2009:06:03
# ・スキルの使用可能判定を若干修正
#
# 2009:10:01
# ・コスト消費増加でも減少していたバグを修正
# ・ステートによる判定を追加
#
# 2010:07:17
# ・省エネモード、全力モードを追加
#
# 2015:10:01
# ・VXA風Sound対応
#
# 2016:03:01
# ・武器による命中精度対応
#
# 2017:11:03
# ・沈黙の拡張対応
#
# 2020:10:01
# ・Window VXA対応
#
# 2020:11:01
# ・他スクリプト併用時のアップデート反映
# ・外部フラグ追加
#
# 2025:05:01
# ・一部外部フラグによる分岐が出来てなかったので対応
$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Skill_Specialite"] = true
module ChangeSC
include BM
include DIAMOND
# HP消費スキルの文字色(使用可能時)
INDIS_RED = Color.new(255, 100, 100, MAX8BIT)
# HP消費スキルの文字色(使用不可時)
DIS_RED = INDIS_RED.clone
DIS_RED.alpha = HARF8BIT
# スキルのコストの表示色(使用可能時)
COSTCOLOR = Color.new(180, 240, 180, MAX8BIT)
# スキルのコストの表示色(使用不可時)
COSTDISCL = COSTCOLOR.clone
COSTDISCL.alpha = HARF8BIT
# スキルのコストの表示色色変え機能フラグ
COSTCLFLG = true
# SP割合消費の属性番号
SP_P_C = 32
# HP消費の属性番号
HP_C = 33
# HP割合消費の属性番号
HP_P_C = 34
# 消費軽減の属性番号
EX_RED = 27
# 消費増加の属性番号
EX_INC = 29
# 消費軽減のステート番号
ST_RED = 233
# 消費増加のステート番号
ST_INC = 248
# 消費増減レート
# [[属性による増減倍率], [ステートによる増減倍率]]
COST_RATE = [[0.9, 1.1], [0.9, 1.2]]
# 省エネのステート番号
ST_ECO = 205
# 全力のステート番号
ST_FuP = 206
# コストと威力の対応レート
# [[省エネ],[全力]]
COST_POW = [[0.85, 0.85], [1.15, 1.15]]
end
class Game_Actor < Game_Battler
include ChangeSC
#--------------------------------------------------------------------------
# ● SP消費増加/軽減のレート取得
#--------------------------------------------------------------------------
def get_cost_rate(index, flg=0)
case flg
when 0
case COST_RATE.size
when 1
return COST_RATE[0][index % 2]
when 2
return COST_RATE[index / 2][index % 2]
else
p "消費増減レートの設定が異常です"
end
when 1
case COST_POW.size
when 1
return COST_POW[0][index % 2]
when 2
return COST_POW[index / 2][index % 2]
else
p "コストと威力の対応レートの設定が異常です"
end
else
p "フラグが異常です。"
end
end
#--------------------------------------------------------------------------
# ● SP消費増加/軽減のためのアレ(アレって何さ?)
#--------------------------------------------------------------------------
def armor_cost_exp
crate = 100
# 属性防御による判定
if $OuterFlgs["Equip_Extend"]
armor_list = [@armor1_id, @armor2_id, @armor6_id, @armor3_id, @armor4_id,
@armor5_id, @armor7_id, @armor8_id]
else # 元の処理
armor_list = [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
end # $OuterFlgs["Equip_Extend"]
for i in armor_list
armor = $data_armors[i]
# コスト減少
if armor != nil and armor.guard_element_set.include?(EX_RED)
crate /= get_cost_rate(0)
end
# コスト増加
if armor != nil and armor.guard_element_set.include?(EX_INC)
crate /= get_cost_rate(1)
end
end
# ステートによる判定
# コスト減少
if @states.include?(ST_RED)
crate /= get_cost_rate(2)
end
# コスト増加
if @states.include?(ST_INC)
crate /= get_cost_rate(3)
end
# モードによる判定
# 省エネモード
if self.states.include?(ST_ECO)
crate /= get_cost_rate(0, 1)
end
# 全力モード
if self.states.include?(ST_FuP)
crate /= get_cost_rate(2, 1)
end
return crate
end
#--------------------------------------------------------------------------
# ● SP消費増加/軽減のためのアレ(アレって何さ?)
#--------------------------------------------------------------------------
def actor_pow_rate
crate = 100
# モードによる判定
# 省エネモード
if self.states.include?(ST_ECO)
crate /= get_cost_rate(1, 1)
end
# 全力モード
if self.states.include?(ST_FuP)
crate /= get_cost_rate(3, 1)
end
return crate
end
end
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● エネミーの場合無視するためのアレ(アレって何さ?)
#--------------------------------------------------------------------------
def armor_cost_exp
return 100
end
#--------------------------------------------------------------------------
# ● エネミーの場合無視するためのアレ(アレって何さ?)
#--------------------------------------------------------------------------
def actor_pow_rate
return 100
end
end
#==============================================================================
# ■ Window_Skill
#------------------------------------------------------------------------------
# スキル画面、バトル画面で、使用できるスキルの一覧を表示するウィンドウです。
#==============================================================================
class Window_Skill < Window_Selectable
include RUBY_SYS
include BM
include ChangeSC
#--------------------------------------------------------------------------
# ● 項目の描画
# index : 項目番号
#--------------------------------------------------------------------------
def draw_item(index)
skill = @data[index]
if @actor.skill_can_use?(skill.id)
if skill.element_set.include?(HP_C) || skill.element_set.include?(HP_P_C)
rootcolor = NDIS_RED
else
rootcolor = normal_color
end
cost_color = COSTCOLOR
else
if skill.element_set.include?(HP_C) || skill.element_set.include?(HP_P_C)
rootcolor = DIS_RED
else
rootcolor = disabled_color
end
cost_color = COSTDISCL
end
x = 4 + index % 2 * (288 + 32)
y = index / 2 * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, NILCOLOR)
bitmap = RPG::Cache.icon(skill.icon_name)
if rootcolor == normal_color || rootcolor == INDIS_RED
opacity = MAX8BIT
else
opacity = HARF8BIT
end
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.font.color = rootcolor
skill.name = transfer(skill.name)
draw_ex_text(x + 28, y, skill.name, 0)
rate = 1
if $OuterFlgs["Skill_Specialite"]
crate = @actor.armor_cost_exp / 100
rate *= crate
end # $OuterFlgs["Skill_Specialite"]
if skill.element_set.include?(SP_P_C)
@C_cost = (skill.sp_cost * @actor.maxsp / 100) / rate
elsif skill.element_set.include?(HP_P_C)
@C_cost = (skill.sp_cost * @actor.maxhp / 100) / rate
else
@C_cost = skill.sp_cost / rate
end
if COSTCLFLG
self.contents.font.color = cost_color
end
self.contents.draw_text(x + 232, y, 48, 32, Integer(@C_cost).to_s, 2)
self.contents.font.color = normal_color
end
end
#==============================================================================
# ■ Game_Battler (分割定義 3)
#------------------------------------------------------------------------------
# バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================
class Game_Battler
include DIAMOND
include ChangeSC
#--------------------------------------------------------------------------
# ● スキルの真のコスト取得
# skill_id : スキル ID
#--------------------------------------------------------------------------
def get_change_skill_cost(skill_id)
rate = 1
crate = 1
if $OuterFlgs["Skill_Specialite"]
crate = self.armor_cost_exp / 100
rate *= crate
end # $OuterFlgs["Skill_Specialite"]
@cost = $data_skills[skill_id].sp_cost
# HP割合消費の場合
if $data_skills[skill_id].element_set.include?(HP_P_C)
return Integer(@cost * self.maxhp / 100 / rate)
# SP割合消費の場合
elsif $data_skills[skill_id].element_set.include?(SP_P_C)
return Integer(@cost * self.maxsp / 100 / rate)
# HP/SPの通常消費の場合
else
return Integer(@cost / rate)
end
end
#--------------------------------------------------------------------------
# ● スキルの使用可能判定
# skill_id : スキル ID
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
@cost = get_change_skill_cost(skill_id)
target_of_cost = 0
# 消費SP or HP の最大値取得
if ($data_skills[skill_id].element_set.include?(HP_C) ||
$data_skills[skill_id].element_set.include?(HP_P_C))
target_of_cost = self.hp
else
target_of_cost = self.sp
end
# SilfeedArks スクリプト用カウンターモード初期化
sa_counter_mode = 0
if $SilfeedArks["Special_Attack"]
# SilfeedArks スクリプト使用時に改めてカウンターモードを取得する
sa_counter_mode = $game_temp.counter_mode
end # $SilfeedArks["Special_Attack"]
# 消費SP or HP が足りない場合は使用不可
if (@cost > target_of_cost) && (sa_counter_mode == 0)
return false
end
# 戦闘不能の場合は使用不可
if dead?
return false
end
# 沈黙状態の場合、スキルは使用不可
if $OuterFlgs["Silent_Extend"]
if !user_is_silence?(skill_id)
return false
end
else # 元の処理
if $data_skills[skill_id].atk_f == 0 && self.restriction == 1
return false
end
end # $OuterFlgs["Silent_Extend"]
# 使用可能時を取得
occasion = $data_skills[skill_id].occasion
# 戦闘中の場合
if $game_temp.in_battle
# [常時] または [バトルのみ] なら使用可
return (occasion == 0 or occasion == 1)
# 戦闘中ではない場合
else
# [常時] または [メニューのみ] なら使用可
return (occasion == 0 or occasion == 2)
end
end
end
#==============================================================================
# ■ Scene_Battle (分割定義 4)
#------------------------------------------------------------------------------
# バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle
include ChangeSC
include BM
#--------------------------------------------------------------------------
# ● スキルアクション 結果作成
#--------------------------------------------------------------------------
def make_skill_action_result
# スキルを取得
@skill = $data_skills[@active_battler.current_action.skill_id]
# 強制アクションでなければ
unless @active_battler.current_action.forcing or @critical_skill
# SP 切れなどで使用できなくなった場合
unless @active_battler.skill_can_use?(@skill.id)
if $OuterFlgs["Equip_Extend"]
if @active_battler.is_a?(Game_Actor)
# 多刀流用、装備戻し
@active_battler.weapon_id = @weapon_id_tmp
@active_battler.armor1_id = @armor1_id_tmp
@active_battler.armor2_id = @armor2_id_tmp
@active_battler.armor3_id = @armor3_id_tmp
@active_battler.armor4_id = @armor4_id_tmp
@active_battler.armor5_id = @armor5_id_tmp
@active_battler.armor6_id = @armor6_id_tmp
@active_battler.armor7_id = @armor7_id_tmp
@active_battler.armor8_id = @armor8_id_tmp
# フラグセット戻し
@mlt_blade_atked = [false, false, false, false, false, false, false, false]
end
end # $OuterFlgs["Equip_Extend"]
# アクション強制対象のバトラーをクリア
$game_temp.forcing_battler = nil
# ステップ 1 に移行
@phase4_step = 1
return
end # SP 切れなどで使用できなくなった場合
end # 強制アクションでなければ
@critical_skill = false
rate = 1
if $OuterFlgs["Skill_Specialite"]
crate = @active_battler.armor_cost_exp / 100
rate *= crate
end # $OuterFlgs["Skill_Specialite"]
# SilfeedArks スクリプト用カウンターモード初期化
sa_counter_mode = 0
sa_act_btr_cntr = [0,nil,[],nil,false,nil,false]
if $SilfeedArks["Special_Attack"]
# SilfeedArks スクリプト使用時に改めてカウンターモードを取得する
sa_counter_mode = $game_temp.counter_mode
sa_act_btr_cntr = @active_battler.counter
end # $SilfeedArks["Special_Attack"]
# 効果範囲:敵X体 ランダム スクリプト用残り回数初期化
dia_selected_num = 0
if $OuterFlgs["Rand_Select"]
# 効果範囲:敵X体 ランダム スクリプト使用時に改めて残り回数を取得する
dia_selected_num = @selected_num
end # $OuterFlgs["Rand_Select"]
unless ( sa_counter_mode >= 1 ) && ( sa_act_btr_cntr[0] == 4 )
# 初回のみ実施
if dia_selected_num == 0
# HP/SP 消費
if @skill.element_set.include?(SP_P_C)
@active_battler.sp -= Integer(@skill.sp_cost * @active_battler.maxsp / 100 / rate)
elsif @skill.element_set.include?(HP_C)
@active_battler.hp -= Integer(@skill.sp_cost / rate)
elsif @skill.element_set.include?(HP_P_C)
@active_battler.hp -= Integer(@skill.sp_cost * @active_battler.maxhp / 100 / rate)
else
@active_battler.sp -= Integer(@skill.sp_cost / rate)
end
# ステータスウィンドウをリフレッシュ
@status_window.refresh
# ヘルプウィンドウにスキル名を表示
@help_window.set_text(@skill.name, 1)
end
else
# 当身、スキルそのまま返す場合 スキル名を元の物に
@status_window.refresh
@help_window.set_text($data_skills[@counter_temp].name, 1)
end
# アニメーション ID を設定
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# コモンイベント ID を設定
@common_event_id = @skill.common_event_id
# 対象側バトラーを設定
set_target_battlers(@skill.scope)# スキルの効果を適用
for target in @target_battlers
if $SilfeedArks["Special_Attack"]
# 当身判定
if (target.counter[2].include?(1) &&
@skill.element_set.include?(target.counter[3])) ||
(target.counter[2].include?(2) && @skill.int_f >= 1) ||
(target.counter[2].include?(3) && @skill.atk_f >= 1) ||
(target.counter[2].include?(4)) ||
(target.counter[2].include?(5))
target.counter[6] = true
end
end # $SilfeedArks["Special_Attack"]
if $OuterFlgs["Decoy_De_Koi"]
$game_system.act_tgt = target
end # $OuterFlgs["Decoy_De_Koi"]
target.skill_effect(@active_battler, @skill)
end
end
end
#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
# スキル画面の処理を行うクラスです。
#==============================================================================
class Scene_Skill
include ChangeSC
#--------------------------------------------------------------------------
# ● フレーム更新 (スキルウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_skill
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
# メニュー画面に切り替え
$scene = Scene_Menu.new(1)
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# スキルウィンドウで現在選択されているデータを取得
@skill = @skill_window.skill
# 使用できない場合
if @skill == nil or not @actor.skill_can_use?(@skill.id)
# ブザー SE を演奏
Sound.play_buzzer
return
end
# 決定 SE を演奏
Sound.play_ok
# 効果範囲が味方の場合
if @skill.scope >= 3
# ターゲットウィンドウをアクティブ化
@skill_window.deactivate
@target_window.x = (@skill_window.index + 1) % 2 * 304
@target_window.show
@target_window.activate
# 効果範囲 (単体/全体) に応じてカーソル位置を設定
if @skill.scope == 4 || @skill.scope == 6
@target_window.index = -1
elsif @skill.scope == 7
@target_window.index = @actor_index - 10
else
@target_window.index = 0
end
# 効果範囲が味方以外の場合
else
# コモンイベント ID が有効の場合
if @skill.common_event_id > 0
# コモンイベント呼び出し予約
$game_temp.common_event_id = @skill.common_event_id
# スキルの使用時 SE を演奏
$game_system.se_play(@skill.menu_se)
rate = 1
if $OuterFlgs["Skill_Specialite"]
crate = @actor.armor_cost_exp * 100
rate *= crate
end # $OuterFlgs["Skill_Specialite"]
# HP/SP 消費
if @skill.element_set.include?(SP_P_C)
@actor.sp -= Integer(@skill.sp_cost * @actor.maxsp / 100 / rate)
elsif @skill.element_set.include?(HP_C)
@actor.hp -= Integer(@skill.sp_cost / rate)
elsif @skill.element_set.include?(HP_P_C)
@actor.hp -= Integer(@skill.sp_cost * @actor.maxhp / 100 / rate)
else
@actor.sp -= Integer(@skill.sp_cost / rate)
end
# 各ウィンドウの内容を再作成
@status_window.refresh
@skill_window.refresh
@target_window.refresh
# マップ画面に切り替え
$scene = Scene_Map.new
return
end
end
return
end
# R ボタンが押された場合
if Input.trigger?(Input::R)
# カーソル SE を演奏
Sound.play_cursor
# 次のアクターへ
@actor_index += 1
@actor_index %= $game_party.actors.size
# 別のスキル画面に切り替え
$scene = Scene_Skill.new(@actor_index)
return
end
# L ボタンが押された場合
if Input.trigger?(Input::L)
# カーソル SE を演奏
Sound.play_cursor
# 前のアクターへ
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# 別のスキル画面に切り替え
$scene = Scene_Skill.new(@actor_index)
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_target
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
# ターゲットウィンドウを消去
@skill_window.activate
@target_window.hide
@target_window.deactivate
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# SP 切れなどで使用できなくなった場合
unless @actor.skill_can_use?(@skill.id)
# ブザー SE を演奏
Sound.play_buzzer
return
end
# ターゲットが全体の場合
if @target_window.index == -1
# パーティ全体にスキルの使用効果を適用
used = false
for i in $game_party.actors
used |= i.skill_effect(@actor, @skill)
end
end
# ターゲットが使用者の場合
if @target_window.index <= -2
# ターゲットのアクターにスキルの使用効果を適用
target = $game_party.actors[@target_window.index + 10]
used = target.skill_effect(@actor, @skill)
end
# ターゲットが単体の場合
if @target_window.index >= 0
# ターゲットのアクターにスキルの使用効果を適用
target = $game_party.actors[@target_window.index]
used = target.skill_effect(@actor, @skill)
end
# スキルを使った場合
if used
# スキルの使用時 SE を演奏
$game_system.se_play(@skill.menu_se)
rate = 1
if $OuterFlgs["Skill_Specialite"]
crate = @actor.armor_cost_exp / 100
rate *= crate
end # $OuterFlgs["Skill_Specialite"]
# HP/SP 消費
if @skill.element_set.include?(SP_P_C)
@actor.sp -= Integer(@skill.sp_cost * @actor.maxsp / 100 / rate)
elsif @skill.element_set.include?(HP_C)
@actor.hp -= Integer(@skill.sp_cost / rate)
elsif @skill.element_set.include?(HP_P_C)
@actor.hp -= Integer(@skill.sp_cost * @actor.maxhp / 100 / rate)
else
@actor.sp -= Integer(@skill.sp_cost / rate)
end
# 各ウィンドウの内容を再作成
@status_window.refresh
@skill_window.refresh
@target_window.refresh
# 全滅の場合
if $game_party.all_dead?
# ゲームオーバー画面に切り替え
$scene = Scene_Gameover.new
return
end
# コモンイベント ID が有効の場合
if @skill.common_event_id > 0
# コモンイベント呼び出し予約
$game_temp.common_event_id = @skill.common_event_id
# マップ画面に切り替え
$scene = Scene_Map.new
return
end
end
# スキルを使わなかった場合
unless used
# ブザー SE を演奏
#Sound.play_buzzer
end
return
end
end
end
|