sacred-ritual-academy/Scripts/_hzm_for_RGSS3.1.rb
2025-03-18 19:45:34 -05:00

608 lines
28 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding: utf-8
#===============================================================================
# ■ [hzm]ターン消費無しスキルさん+ for RGSS3
# ※ このスクリプトには「[hzm]メモ欄拡張共通部分さん+ for RGSS3」が必要です
# 「[hzm]メモ欄拡張共通部分 for RGSS3」では動作しません
#    http://d.hatena.ne.jp/ru_shalm/20120103/battle
#-------------------------------------------------------------------------------
# 2014/06/22 Ru/むっくRu
#-------------------------------------------------------------------------------
# 【機能1ターン消費無しスキル/アイテム】
# ターンを消費せずに,選択した瞬間に発動するスキルを設定します.
# 「データベース」の「スキル」の「メモ」欄に以下のように記述してください.
#
# [hzm]ターン消費無し:n
# または
# [hzm]即発動:n
#
# n の部分は1以上の数値に置き換えてください[hzm]ターン消費無し:1
# この数字の部分の回数だけ1ターン中にこのスキルを使用することができます
# :nの部分を省略した場合、:1と記述した場合と同じになります
#
# 同様にアイテムにも設定を行うことができます.
# 「データベース」の「アイテム」の「メモ」欄に同様に記述してください.
#-------------------------------------------------------------------------------
# 【機能2行動順序をスキルごとに反映】
# デフォルトのシステムだと例えば2回行動のキャラクターが
# 「通常攻撃速度補正0「防御速度補正2000」の
# 2つを選択した場合に速度補正が低い側通常攻撃のほうに統一されてしまい
# 防御がターンの最初に発動しません.
#
# このスクリプトでは,ターンの順番をキャラクターごとではなく,
# そのキャラクターの行動ごとに順番を設定することによって,
# 各行動ごとの速度補正を適用できるようにします.
#
# 例)
# エリック
# 素早さ: 30 行動通常攻撃速度補正0防御速度補正2000
# スライム
# 素早さ100 行動通常攻撃速度補正0
#
# ・デフォルトのシステムの場合
# スライム通常攻撃→エリック通常攻撃→エリック防御
#
# ・このスクリプト導入後
# エリック防御→スライム通常攻撃→エリック通常攻撃
#-------------------------------------------------------------------------------
# 【更新履歴】
# 2014/06/22 通常攻撃にも適用できるように
# 2014/06/07 次回行動アクター取得処理が正常に動いていないのを修正v2
# 2013/07/18 行動終了時に解除される行動制約ステートが解除されないのを修正
# 2013/03/17 エネミーの行動ターン数指定がおかしくなるのを修正。おまけ機能追加。
# 2013/02/16 ターン開始時に行動不能が解除された際にエラー落ちするのを修正
# 2013/01/11 コモンイベント呼び出しでアクターを離脱させるとエラー落ちしていたのを修正
# 2012/10/14 行動回数再計算ON時エネミーが「逃げる」とエラー落ちしていたのを修正
# 2012/10/09 マップ上でアイテムを使用した際にエラー落ちしていたのを修正
# 2012/10/06 戦闘中にパーティ入れ替えを行った場合にエラー落ちしていたのを修正
# ステータスウィンドウの更新が正常に行われていなかったのを修正
# 2012/10/05 大幅修正を行いました.
# 新メモスクリプト([hzm]メモ欄拡張共通部分さん+ for RGSS3用に変更
# 行動回数の再計算機能(アクター/エネミー)を追加
# 1ターン内で使用できる回数の設定を追加
# 「各行動ごとに行動順を設定さん for RGSS3」の機能を内包
# 2012/10/03 行動回数の再計算(暫定)を追加
# 2012/06/01 エネミー用設定を追加
# 2012/04/21 複数回行動するアクターが正常に動作しない不具合を修正
# 2012/04/01 味方の行動不能状態を回復した際に強制終了する不具合を修正
# 2012/03/28 アイテムにも対応
# 2012/01/28 コモンイベント内で「戦闘行動の強制」を使用した際に強制終了するのを修正
# 2012/01/28 コモンイベントの呼び出しが正常に動作しないのを少し修正
# 2012/01/03 ぶっぱ
#-------------------------------------------------------------------------------
#===============================================================================
# ● 設定項目
#===============================================================================
module HZM_VXA
module QuickSkill
# ● ターン消費無し行動後に行動回数を再計算する(上級設定)
# [効果]
# ・エネミーも(疑似的に)ターン消費無しスキルを使用可能に
# ・行動回数を変化させるステートを即時反映
# [副作用]
# ・50%の確率で行動回数増加などの設定が使用不可に
# true : する
# false : しない
CHECK_ACTION_TIMES = false
# ● オマケ機能敵の行動パターンのターン数の仕様をVX化
# 1ターン目最初のターンに指定の行動をさせたい場合、
# VX Aceでは行動パターンを0ターン目に設定する必要があります。
# この設定方法をVX同様の仕様に変更し、
# 1ターン目の場合は1ターン目に設定できるようにします。
# (上級設定に関係なく使用できます)
# true : VX仕様にする
# false : 変更しない
ENEMY_TURN_NORMALIZE = false
end
end
#===============================================================================
# ↑   ここまで設定  
# ↓ 以下、スクリプト部 ↓
#===============================================================================
raise "「[hzm]メモ欄拡張共通部分さん+ for RGSS3」を導入してください" unless defined?(HZM_VXA::Note2)
raise "「[hzm]メモ欄拡張共通部分さん+ for RGSS3」のバージョンが一致しません" unless HZM_VXA::Note2.check_version?('3.0.0')
module HZM_VXA
module QuickSkill
# メモ欄から読み込む要素名の候補を設定
QUICK_KEYS = ['ターン消費無し', '即発動', 'QuickSkill']
#---------------------------------------------------------------------------
# ● QuickSkill中か
#---------------------------------------------------------------------------
def self.quickSkill?
@quickSkill
end
#---------------------------------------------------------------------------
# ● 即時行動開始
#---------------------------------------------------------------------------
def self.start
@quickSkill = true
end
#---------------------------------------------------------------------------
# ● 即時行動終了
#---------------------------------------------------------------------------
def self.finish
@quickSkill = false
# 全てのbattlerのアクションを戻す
$game_party.hzm_vxa_quickSkill_force_action_reverse
$game_troop.hzm_vxa_quickSkill_force_action_reverse
end
#---------------------------------------------------------------------------
# ● スキル使用回数のリセット
#---------------------------------------------------------------------------
def self.reset_use_count
$game_party.hzm_vxa_quickSkill_reset_use_count
$game_troop.hzm_vxa_quickSkill_reset_use_count
end
# ターン消費無しアイテム管理対象
ITEM_COUNT_PARTY = true
end
end
module BattleManager
#-----------------------------------------------------------------------------
# ● 行動順序の作成(再定義)
#-----------------------------------------------------------------------------
def self.make_action_orders
@action_battlers = []
all_actions = []
all_members = []
all_members += $game_party.members unless @surprise
all_members += $game_troop.members unless @preemptive
all_members.each do |member|
next unless member.movable?
member.make_speed
member.actions.each {|action| all_actions.push action }
end
all_actions.sort!{|a,b| b.speed - a.speed }
all_actions.each {|action| @action_battlers.push action.subject}
end
#-----------------------------------------------------------------------------
# ● 行動が未選択のアクターを先頭から探す(独自)
#-----------------------------------------------------------------------------
def self.hzm_vxa_quickSkill_can_action_actor_before(daemon)
return false unless $game_party.members.index(daemon)
for @actor_index in 0..$game_party.members.index(daemon)
actor = $game_party.members[@actor_index]
return true if actor.next_command
end
false
end
end
class Game_Unit
attr_accessor :hzm_vxa_quickSkill_can_use_item
#-----------------------------------------------------------------------------
# ● 戦闘開始処理(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_on_battle_start on_battle_start
def on_battle_start
hzm_vxa_quickSkill_on_battle_start
hzm_vxa_quickSkill_reset_use_count
end
#-----------------------------------------------------------------------------
# ● 戦闘行動の復元(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_force_action_reverse
members.each {|member| member.hzm_vxa_quickSkill_force_action_reverse }
end
#-----------------------------------------------------------------------------
# ● スキル使用回数のリセット(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_reset_use_count
members.each {|member| member.hzm_vxa_quickSkill_reset_use_count }
if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
@hzm_vxa_quickSkill_can_use_item ||= []
@hzm_vxa_quickSkill_can_use_item.clear
end
end
end
class Game_Battler < Game_BattlerBase
#-----------------------------------------------------------------------------
# ● 行動速度の決定(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_make_speed make_speed
def make_speed
# 空行動は削除する
@actions.reject! {|a| a == nil}
# 元の処理
hzm_vxa_quickSkill_make_speed
# アクションを速度順にソート
@actions.sort! {|a,b| b.speed - a.speed }
end
#-----------------------------------------------------------------------------
# ● スキルの使用可能条件チェック(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_skill_conditions_met? skill_conditions_met?
def skill_conditions_met?(skill)
# 元の処理
return false unless hzm_vxa_quickSkill_skill_conditions_met?(skill)
# 戦闘中でなければOK
return true unless $game_party.in_battle
# 指定回数チェック
if data = skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
cnt = data.first.to_i
cnt = 1 unless cnt > 0
hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_skill.count(skill.id) >= cnt
end
true
end
#-----------------------------------------------------------------------------
# ● アイテムの使用可能条件チェック(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_item_conditions_met? item_conditions_met?
def item_conditions_met?(item)
# 元の処理
return false unless hzm_vxa_quickSkill_item_conditions_met?(item)
# 戦闘中でなければOK
return true unless $game_party.in_battle
# 指定回数チェック
if data = item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
cnt = data.first.to_i
cnt = 1 unless cnt > 0
if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
return false if cnt > 0 and $game_party.hzm_vxa_quickSkill_can_use_item.count(item.id) >= cnt
else
return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_item.count(item.id) >= cnt
end
end
true
end
#-----------------------------------------------------------------------------
# ● スキル使用回数リセット(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_reset_use_count
@hzm_vxa_quickSkill_can_use_skill ||= []
@hzm_vxa_quickSkill_can_use_skill.clear
unless HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
@hzm_vxa_quickSkill_can_use_item ||= []
@hzm_vxa_quickSkill_can_use_item.clear
end
end
#-----------------------------------------------------------------------------
# ● 戦闘行動の強制(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_force_action force_action
def force_action(skill_id, target_index)
@hzm_vxa_quickSkill_actions = HZM_VXA::QuickSkill.quickSkill? ? @actions.clone : nil
hzm_vxa_quickSkill_force_action(skill_id, target_index)
end
#-----------------------------------------------------------------------------
# ● 戦闘行動の復元(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_force_action_reverse
return unless @hzm_vxa_quickSkill_actions
@actions = @hzm_vxa_quickSkill_actions
@hzm_vxa_quickSkill_actions = nil
end
#-----------------------------------------------------------------------------
# ● スキル/アイテムの使用(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_use_item use_item
def use_item(item)
# 戦闘中かどうか?
if $game_party.in_battle
# カウント可能か確認
hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
# スキル/アイテム使用回数カウント
@hzm_vxa_quickSkill_can_use_skill.push(item.id) if item.is_a?(RPG::Skill)
if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
$game_party.hzm_vxa_quickSkill_can_use_item.push(item.id) if item.is_a?(RPG::Item)
else
@hzm_vxa_quickSkill_can_use_item.push(item.id) if item.is_a?(RPG::Item)
end
end
# 元の処理
hzm_vxa_quickSkill_use_item(item)
end
end
class Game_Actor < Game_Battler
#-----------------------------------------------------------------------------
# ● アクションを先頭に入れ替え(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_swapAction
tmp = @actions[0]
@actions[0] = @actions[@action_input_index]
@actions[@action_input_index] = tmp
end
end
class Game_Action
#-----------------------------------------------------------------------------
# ● 行動速度の計算(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkillEnemy_speed speed
def speed
# ターン消費無し行動の行動速度を最速化
item.speed = 999999 if item and item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
# 元の処理
hzm_vxa_quickSkillEnemy_speed
end
end
class Scene_Battle < Scene_Base
#-----------------------------------------------------------------------------
# ● 情報表示ビューポートの更新(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_update_info_viewport update_info_viewport
def update_info_viewport
# 元の処理
hzm_vxa_quickSkill_update_info_viewport
# ターン消費無し行動中は非表示に
move_info_viewport(64) if @hzm_vxa_quickSkill_active
end
#-----------------------------------------------------------------------------
# ● 次のコマンド入力へ(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_next_command next_command
def next_command
# ターン消費無し行動が選択されているか確認・実行
if @hzm_vxa_quickSkill_skill and
@hzm_vxa_quickSkill_skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
# ターン消費無し行動の実行
hzm_vxa_quickSkill_run
# 行動を再選択
if BattleManager.hzm_vxa_quickSkill_can_action_actor_before(@subject) or
@subject.inputable?
@subject.prior_command
return start_actor_command_selection
end
end
# 元の処理
hzm_vxa_quickSkill_next_command
end
#-----------------------------------------------------------------------------
# ● コマンド[攻撃](エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_command_attack command_attack
def command_attack
@hzm_vxa_quickSkill_skill = $data_skills[BattleManager.actor.attack_skill_id]
hzm_vxa_quickSkill_command_attack
end
#-----------------------------------------------------------------------------
# ● スキル[決定](エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_on_skill_ok on_skill_ok
def on_skill_ok
@hzm_vxa_quickSkill_skill = @skill_window.item
hzm_vxa_quickSkill_on_skill_ok
end
#-----------------------------------------------------------------------------
# ● スキル[キャンセル](エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_on_skill_cancel on_skill_cancel
def on_skill_cancel
@hzm_vxa_quickSkill_skill = nil
hzm_vxa_quickSkill_on_skill_cancel
end
#-----------------------------------------------------------------------------
# ● アイテム[決定](エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_on_item_ok on_item_ok
def on_item_ok
@hzm_vxa_quickSkill_skill = @item_window.item
hzm_vxa_quickSkill_on_item_ok
end
#-----------------------------------------------------------------------------
# ● アイテム[キャンセル](エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_on_item_cancel on_item_cancel
def on_item_cancel
@hzm_vxa_quickSkill_skill = nil
hzm_vxa_quickSkill_on_item_cancel
end
#-----------------------------------------------------------------------------
# ● アクターコマンド選択の開始(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_start_actor_command_selection start_actor_command_selection
def start_actor_command_selection
hzm_vxa_quickSkill_start_actor_command_selection
BattleManager.actor.make_actions unless BattleManager.actor.input
end
#--------------------------------------------------------------------------
# ● 強制された戦闘行動の処理(エイリアス)
#--------------------------------------------------------------------------
alias hzm_vxa_quickSkill_process_forced_action process_forced_action
def process_forced_action
@hzm_vxa_quickSkill_force_action = BattleManager.action_forced?
# 元の処理
hzm_vxa_quickSkill_process_forced_action
@hzm_vxa_quickSkill_force_action = nil
end
#-----------------------------------------------------------------------------
# ● 戦闘行動の処理(再定義)
#-----------------------------------------------------------------------------
def process_action
return if scene_changing?
# 強制行動の場合は次回アクターを計算しない
unless @hzm_vxa_quickSkill_force_action
if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
HZM_VXA::QuickSkill.re_action_times if @hzm_vxa_quickSkill_re_action_times_flag
@hzm_vxa_quickSkill_re_action_times_flag = false
end
BattleManager.make_action_orders
@subject = BattleManager.next_subject
end
return turn_end unless @subject
if @subject.current_action
@subject.current_action.prepare
if @subject.current_action.valid?
@status_window.open
execute_action
end
@subject.remove_current_action
end
process_action_end unless @subject.current_action
end
#-----------------------------------------------------------------------------
# ● ターン終了(エイリアス)
#-----------------------------------------------------------------------------
alias hzm_vxa_quickSkill_turn_end turn_end
def turn_end
# 行動不能キャラの行動終了処理を実行
# (※行動順序厳密化によりステート「行動終了時」が実行されないため)
all_battle_members.each do |battler|
next if battler.movable?
@subject = battler
process_action_end
end
@subject = nil
# 元の処理
hzm_vxa_quickSkill_turn_end
# ターン中使用回数リセット
HZM_VXA::QuickSkill.reset_use_count
end
#-----------------------------------------------------------------------------
# ● ターン消費無し行動の実行(独自)
#-----------------------------------------------------------------------------
def hzm_vxa_quickSkill_run
return unless @hzm_vxa_quickSkill_skill
@hzm_vxa_quickSkill_skill = nil
# 行動の開始
HZM_VXA::QuickSkill::start
@actor_command_window.close if @actor_command_window
@hzm_vxa_quickSkill_active = true
# 行動アクター,行動内容の設定
@subject = BattleManager.actor
@subject.hzm_vxa_quickSkill_swapAction # 選んだ行動を先頭に引きずり出す
# 行動
execute_action
# イベント処理
process_event
# おわり
@subject.hzm_vxa_quickSkill_swapAction # 元の位置に戻す
HZM_VXA::QuickSkill::finish
# ウィンドウを戻す
refresh_status
@hzm_vxa_quickSkill_active = false
@actor_command_window.open if @actor_command_window
@status_window.open if @status_window
# 行動回数の再計算
HZM_VXA::QuickSkill.re_action_times if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
end
end
# 行動回数の再計算用 & エネミー行動ターン数正常化 共通処理
if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES or HZM_VXA::QuickSkill::ENEMY_TURN_NORMALIZE
class << BattleManager
#---------------------------------------------------------------------------
# ● ターン終了(エイリアス)
#---------------------------------------------------------------------------
alias hzm_vxa_quickSkill_turn_end turn_end
def turn_end
hzm_vxa_quickSkill_turn_end
$game_troop.hzm_vxa_quickSkill_increase_turn2
end
end
class Game_Troop < Game_Unit
attr_reader :hzm_vxa_quickSkill_turn_count
#---------------------------------------------------------------------------
# ● クリア(エイリアス)
#---------------------------------------------------------------------------
alias hzm_vxa_quickSkill_clear clear
def clear
hzm_vxa_quickSkill_clear
@hzm_vxa_quickSkill_turn_count = HZM_VXA::QuickSkill::ENEMY_TURN_NORMALIZE ? 1 : 0
end
#---------------------------------------------------------------------------
# ● クリア(独自)
#---------------------------------------------------------------------------
def hzm_vxa_quickSkill_increase_turn2
@hzm_vxa_quickSkill_turn_count += 1
end
end
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 行動条件合致判定[ターン数](再定義)
#--------------------------------------------------------------------------
def conditions_met_turns?(param1, param2)
n = $game_troop.hzm_vxa_quickSkill_turn_count
if param2 == 0
n == param1
else
n > 0 && n >= param1 && n % param2 == param1 % param2
end
end
end
end
# 行動回数の再計算用
if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
module HZM_VXA
module QuickSkill
#-------------------------------------------------------------------------
# ● 行動回数の再計算
#-------------------------------------------------------------------------
if CHECK_ACTION_TIMES
def self.re_action_times
$game_party.hzm_vxa_quickSkill_re_action_times
$game_troop.hzm_vxa_quickSkill_re_action_times
end
end
end
end
class Game_Unit
#---------------------------------------------------------------------------
# ● 行動回数の再計算(独自)
#---------------------------------------------------------------------------
def hzm_vxa_quickSkill_re_action_times
members.each {|member| member.hzm_vxa_quickSkill_re_action_times }
end
end
class Game_Actor < Game_Battler
#---------------------------------------------------------------------------
# ● 行動回数の再計算
#---------------------------------------------------------------------------
if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
def hzm_vxa_quickSkill_re_action_times
action_cnt = make_action_times
@actions.push Game_Action.new(self) while @actions.size < action_cnt
@actions.pop while @actions.size > action_cnt
end
end
end
class Game_Enemy < Game_Battler
#---------------------------------------------------------------------------
# ● 行動回数の再計算(独自)
#---------------------------------------------------------------------------
def hzm_vxa_quickSkill_re_action_times
action_cnt = make_action_times
make_actions if @actions.size < action_cnt
@actions.pop while @actions.size > action_cnt
end
end
class Scene_Battle < Scene_Base
#---------------------------------------------------------------------------
# ● スキル/アイテムの使用(エイリアス)
#---------------------------------------------------------------------------
alias hzm_vxa_quickSkill_use_item use_item
def use_item
# 元の処理
hzm_vxa_quickSkill_use_item
# 行動回数の再計算フラグ(エネミーの場合)
item = (@subject.enemy? and @subject.current_action) ?
@subject.current_action.item : nil
@hzm_vxa_quickSkill_re_action_times_flag =
(item and item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS))
end
end
end