Project1
标题:
关于使用某些技能不消耗回合,使用者可以再次行动一次?
[打印本页]
作者:
shengfeng
时间:
2019-2-2 20:30
标题:
关于使用某些技能不消耗回合,使用者可以再次行动一次?
怎么能实现!
作者:
骷髅岛遗老
时间:
2019-4-24 21:56
# coding: utf-8
#===============================================================================
# ■ [hzm]メモ欄拡張共通部分さん+ for RGSS3
#-------------------------------------------------------------------------------
# 2014/09/27 Ru/むっくRu
#-------------------------------------------------------------------------------
# データベースのメモ欄の情報を読み取るための共通処理.
# メモ欄の各行に特定もフレーズがついたものだけを取得します.
#
# 鳥小屋.txtのメモ欄を使うスクリプト群を使う場合に必須になります.
# (※スクリプト名の頭に[hzm]が付いているスクリプト)
#-------------------------------------------------------------------------------
# 【注意】
# 「[hzm]メモ欄拡張共通部分 for RGSS3」の機能を内包しています.
# このスクリプトを導入する場合は,
# [hzm]メモ欄拡張共通部分 for RGSS3は導入しないでください.
#-------------------------------------------------------------------------------
# 【旧バージョン([hzm]メモ欄拡張共通部分 for RGSS3)からの仕様変更点】
# ・メモ欄のヘッダ文字([hzm])の他にも複数指定することを可能に
# 指定のメソッドを呼び出すことで,
# [hzm]以外のヘッダ文字をつけたものを認識させることを可能に.
# (僕が)派生スクリプトを作りやすくするのが目的.
#
# ・同一項目の複数記述に正式対応
# [hzm]属性耐性:炎,50
# [hzm]属性耐性:水,100
# みたいに同じ項目を複数書いても使えるようになります.
# ※注意:別にこのスクリプトに属性耐性の機能があるわけではないです
#
#-------------------------------------------------------------------------------
# 【更新履歴】
# 2014/09/27 キャッシュが存在しない場合に再生成するように変更
# 2012/06/04 バージョンチェック用メソッド名修正
# 2012/06/04 [hzm]メモ欄拡張共通部分 for RGSS3から派生
#-------------------------------------------------------------------------------
#===============================================================================
# ↓ 以下、スクリプト部 ↓
#===============================================================================
# 旧スクリプト導入時にエラー処理を行う
raise "「[hzm]メモ欄拡張共通部分 for RGSS3」が導入されています.\n「[hzm]メモ欄拡張共通部分 for RGSS3」は既に不要なので,\n削除してください." if defined?(HZM_VXA::Note)
module HZM_VXA
module Note2
# ● デフォルトのマークフレーズ
# (※変更しないでください)
DEFAULT_MARK = '[hzm]'
# ● 「[hzm]メモ欄拡張共通部分 for RGSS3」との互換性を保持するか?
USE_OLD_STYLE = true
end
end
module HZM_VXA
module Note2
#---------------------------------------------------------------------------
# ● メモスクリプトのバージョン
# .区切りの3つの数字で表現
# 1桁目:メジャーバージョン(仕様変更=互換性破たん時に変更)
# 2桁目:マイナーバージョン(機能追加時に変更)
# 3桁目:パッチバージョン(不具合修正時に変更)
#---------------------------------------------------------------------------
VERSION = '3.0.0'
#---------------------------------------------------------------------------
# ● バージョン比較処理
#---------------------------------------------------------------------------
def self.check_version?(version_str)
version = version2array(VERSION)
req_version = version2array(version_str)
# メジャーバージョンが要求と一致するか?
return false unless version[0] == req_version[0]
# マイナーバージョンが要求より低くないか?
return false unless version[1] >= req_version[1]
true
end
#---------------------------------------------------------------------------
# ● バージョン文字列の分解
#---------------------------------------------------------------------------
def self.version2array(version_str)
version_str.split('.').map{|n| n.to_i}
end
#---------------------------------------------------------------------------
# ● ヘッダマーク配列
#---------------------------------------------------------------------------
@header_mark = []
#---------------------------------------------------------------------------
# ● ヘッダマークの取得
#---------------------------------------------------------------------------
def self.header_mark
@header_mark
end
#---------------------------------------------------------------------------
# ● ヘッダマークの追加
#---------------------------------------------------------------------------
def self.add_header_mark(mark_str)
@header_mark.push(mark_str) unless @header_mark.include?(mark_str)
end
#---------------------------------------------------------------------------
# ● メモ欄の内容を解析
#---------------------------------------------------------------------------
def self.setup
add_header_mark(DEFAULT_MARK)
list = [
$data_actors,
$data_classes,
$data_skills,
$data_items,
$data_weapons,
$data_armors,
$data_enemies,
$data_states,
$data_tilesets,
]
list.each do |data|
data.each do |d|
d.hzm_vxa_note2_init if d
end
end
end
#---------------------------------------------------------------------------
# ■ メモ欄を持つクラスに追加するメソッド類
#---------------------------------------------------------------------------
module Utils
#-------------------------------------------------------------------------
# ● メモ欄のチェック
#-------------------------------------------------------------------------
def hzm_vxa_note2_init
hzm_vxa_note2_clear
self.note.split(/\r?\n/).each do |line|
HZM_VXA::Note2.header_mark.each do |mark|
next unless line.index(mark) == 0
l = line.sub!(mark, '')
if l =~ /^([^\:]+)\:(.+)$/
hzm_vxa_note2_add(mark, $1, $2)
else
hzm_vxa_note2_add(mark, l, '')
end
end
end
end
#-------------------------------------------------------------------------
# ● メモ欄情報の追加
#-------------------------------------------------------------------------
def hzm_vxa_note2_add(mark, key, str)
# 文字列として保存
@hzm_vxa_note2_str[mark][key] ||= []
@hzm_vxa_note2_str[mark][key].push(str.to_s)
# カンマ区切りのデータとして保存
@hzm_vxa_note2_data[mark][key] ||= []
data = str.split(/\s*\,\s*/).map do |d|
if d =~ /^\-?\d+$/
d.to_i
elsif d =~ /^\-?\d+\.\d+$/
d.to_f
else
d.to_s
end
end
@hzm_vxa_note2_data[mark][key].push(data)
end
#-------------------------------------------------------------------------
# ● メモ欄情報の削除
#-------------------------------------------------------------------------
def hzm_vxa_note2_clear
@hzm_vxa_note2_str = {}
@hzm_vxa_note2_data = {}
HZM_VXA::Note2.header_mark.each do |mark|
@hzm_vxa_note2_str[mark] = {}
@hzm_vxa_note2_data[mark] = {}
end
end
#-------------------------------------------------------------------------
# ● メモ内容取得
#-------------------------------------------------------------------------
def hzm_vxa_note2_match(mark, keys)
hzm_vxa_note2_matches(mark, keys).last
end
def hzm_vxa_note2_match_str(mark, keys)
hzm_vxa_note2_matches_str(mark, keys).last
end
def hzm_vxa_note2_matches(mark, keys)
mark ||= HZM_VXA::Note2::DEFAULT_MARK
ret = []
keys.each do |key|
ret += self.hzm_vxa_note2_data[mark][key] if self.hzm_vxa_note2_data[mark].include?(key)
end
ret
rescue => e
puts "#{$!} - #{$@}"
end
def hzm_vxa_note2_matches_str(mark, keys)
mark ||= HZM_VXA::Note2::DEFAULT_MARK
ret = []
keys.each do |key|
ret += self.hzm_vxa_note2_str[mark][key] if self.hzm_vxa_note2_str[mark].include?(key)
end
ret
end
def hzm_vxa_note2_data
hzm_vxa_note2_init unless @hzm_vxa_note2_data
@hzm_vxa_note2_data
end
def hzm_vxa_note2_str
hzm_vxa_note2_init unless @hzm_vxa_note2_str
@hzm_vxa_note2_str
end
end
end
end
# メモ欄を持つクラスに機能追加
class RPG::BaseItem
include HZM_VXA::Note2::Utils
end
class RPG::Tileset
include HZM_VXA::Note2::Utils
end
# メモ解析
if true
class << DataManager
alias hzm_vxa_note2_init init
def init
hzm_vxa_note2_init
HZM_VXA::Note2.setup
end
end
end
# 旧スクリプトとの互換性保持
if HZM_VXA::Note2::USE_OLD_STYLE
module HZM_VXA
module Note
#-------------------------------------------------------------------------
# ● メモスクリプトのバージョン
#-------------------------------------------------------------------------
VERSION = 2.20
#-------------------------------------------------------------------------
# ● バージョンチェック機構
#-------------------------------------------------------------------------
def self.check_version(n)
(n >= 2 and n < 3)
end
end
end
module HZM_VXA
module Note2
module Utils
#-----------------------------------------------------------------------
# ● メモ内容取得
#-----------------------------------------------------------------------
def hzm_vxa_note_match(keys)
hzm_vxa_note2_match(HZM_VXA::Note2::DEFAULT_MARK, keys)
end
def hzm_vxa_note(key)
hzm_vxa_note2_match(HZM_VXA::Note2::DEFAULT_MARK, [key])
end
#-----------------------------------------------------------------------
# ● メモ内容(単一文字列)取得
#-----------------------------------------------------------------------
def hzm_vxa_note_str_match(keys)
hzm_vxa_note2_match_str(HZM_VXA::Note2::DEFAULT_MARK, keys)
end
def hzm_vxa_note_str(key)
hzm_vxa_note2_match_str(HZM_VXA::Note2::DEFAULT_MARK, [key])
end
end
end
end
end
复制代码
# coding: utf-8
#===============================================================================
# ■ [hzm]ターン消費無しスキルさん+ for RGSS3
# ※ このスクリプトには「[hzm]メモ欄拡張共通部分さん+ for RGSS3」が必要です
# 「[hzm]メモ欄拡張共通部分 for RGSS3」では動作しません
#-------------------------------------------------------------------------------
# 2014/06/22 Ru/むっくRu
#-------------------------------------------------------------------------------
# 【機能1:不消耗回合的技能/道具】
# 不耗用当前回合,选择后即时发动技能。
# 在「资料库」的「技能」「备注栏」中填入以下内容。
#
# [hzm]ターン消費無し:n
# 或者
# [hzm]即発動:n
#
# n 的部分請代換為1以上的數值(例:[hzm]ターン消費無し:1)
# 表示一回合中,此技能只能使用 n 次。
# (省略 :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
复制代码
两个分开的脚本,前一个是后一个的前置,有一个小毛病是有时候会导致这个技能一回合可以用无数次(脚本本身那个限制次数功能无效),不知道是不是跟我其他脚本有冲突
作者:
Nil2018
时间:
2019-4-25 12:25
#==============================================================================
#
# ▼ Yanfly Engine Ace - 即时使用 v1.03
# -- 最后更新: 2012.07.17
# -- 使用难度: 普通
# -- 需要脚本: 无
#
#==============================================================================
$imported = {} if $imported.nil?
$imported["YEA-InstantCast"] = true
#==============================================================================
# ▼ Updates
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 2012.07.17 - Instant doesn't take up a turn if a characterh as additional
# actions/can attack twice.
# 2012.01.12 - Anti-crash methods implemented.
# 2011.12.26 - Bug Fixed: If actor gets stunned while doing an instant cast,
# the actor will not be reselected.
# 2011.12.21 - Started Script and Finished.
#
#==============================================================================
# ▼ 介绍
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 即时使用技能/物品的效果为:角色可以立即使用该技能/武器,并且不会消耗本回合的
# 行动次数。只要该角色有足够的释放条件(例如mp、tp)就可以无限使用.
# 即时使用功能重回RPG Maker VX Ace.以下为即时使用的一些改动:
#
# 1) 对于多行动数的角色,例如连续技,只有在第一个动作是即时使用时才会成功使用即
# 时使用效果.就算第二个或之后的行动为即时使用,该技能也不会触发即时使用效果.
#
# 2) 任何即时使用的技能/物品都会自动瞬时触发,包括即时使用技能中的连锁技能.
#
# 3) 如果敌人使用了一个即时使用的技能,其在使用后会额为获得一次行动机会.
#
#==============================================================================
# ▼ 安装方式
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 打开脚本编辑器,将本脚本拷贝/复制到一个在▼ 插件脚本之下▼ Main之上的新
# 脚本页/槽中.记得保存你的工程以使脚本生效.
#
# -----------------------------------------------------------------------------
# 技能备注 - 在数据库-技能中可以使用的备注.
# -----------------------------------------------------------------------------
# <即时使用>
# 使该技能变成即时使用技能.使用后在战斗阶段开始前会立即使用该技能.
#
# -----------------------------------------------------------------------------
# 物品备注 - 在数据库-物品中可以使用的备注.
# -----------------------------------------------------------------------------
# <即时使用>
# 使该物品变成即时使用物品.使用后在战斗阶段开始前会立即使用该技能.
#
#==============================================================================
# ▼ 兼容性
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# 本脚本仅为RPG Maker VX Ace编写.极不可能在无任何修改的情况下运行于RPG Maker VX.
#
# 本脚本和 Yanfly Engine Ace - 战斗系统 v1.00+ 互相兼容.
# 请将本脚本放在其之下.
#
#==============================================================================
# ▼ 编辑以下内容可能会出现电脑损坏、死机,电脑主人脑袋爆炸、昏迷、死亡或口臭
# 所以编辑了后果自负。
#==============================================================================
module YEA
module REGEXP
module USABLEITEM
INSTANT = /<(?:INSTANT|即时使用)>/i
end # USABLEITEM
end # REGEXP
end # YEA
#==============================================================================
# ¡ DataManager
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# alias method: load_database
#--------------------------------------------------------------------------
class <<self; alias load_database_instant load_database; end
def self.load_database
load_database_instant
load_notetags_instant
end
#--------------------------------------------------------------------------
# new method: load_notetags_instant
#--------------------------------------------------------------------------
def self.load_notetags_instant
groups = [$data_skills, $data_items]
for group in groups
for obj in group
next if obj.nil?
obj.load_notetags_instant
end
end
end
end # DataManager
#==============================================================================
# ¡ RPG::UsableItem
#==============================================================================
class RPG::UsableItem < RPG::BaseItem
#--------------------------------------------------------------------------
# public instance variables
#--------------------------------------------------------------------------
attr_accessor :instant
#--------------------------------------------------------------------------
# common cache: load_notetags_instant
#--------------------------------------------------------------------------
def load_notetags_instant
@instant = false
#---
self.note.split(/[\r\n]+/).each { |line|
case line
#---
when YEA::REGEXP::USABLEITEM::INSTANT
@instant = true
#---
end
} # self.note.split
#---
end
end # RPG::UsableItem
#==============================================================================
# ¡ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# new method: check_instant_action
#--------------------------------------------------------------------------
def check_instant_action
@backup_actions_instant = []
@actions.each { |action|
next unless action
if action.item.nil?
@backup_actions_instant.push(action.dup)
next
end
unless action.item.instant
@backup_actions_instant.push(action.dup)
action.clear
end
}
end
#--------------------------------------------------------------------------
# new method: restore_instant_action
#--------------------------------------------------------------------------
def restore_instant_action
@backup_actions_instant.each_index { |i|
@actions[i] = @backup_actions_instant[i]
}
@backup_actions_instant.clear
i = 0
@actions.each { |action| if action.item.nil?; break; end; i += 1 }
@action_input_index = i
end
end # Game_Actor
#==============================================================================
# ¡ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# new method: add_extra_action
#--------------------------------------------------------------------------
def add_extra_action
action_list = enemy.actions.select {|a| action_valid?(a) }
return if action_list.empty?
rating_max = action_list.collect {|a| a.rating }.max
rating_zero = rating_max - 3
action_list.reject! {|a| a.rating <= rating_zero }
action = Game_Action.new(self)
action.set_enemy_action(select_enemy_action(action_list, rating_zero))
@actions.push(action)
end
end # Game_Enemy
#==============================================================================
# ¡ Scene_Battle
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# alias method: next_command
#--------------------------------------------------------------------------
alias scene_battle_next_command_instant next_command
def next_command
if instant_action?
perform_instant_action
else
scene_battle_next_command_instant
end
end
#--------------------------------------------------------------------------
# new method: instant_action?
#--------------------------------------------------------------------------
def instant_action?
return false if BattleManager.actor.nil?
return false if BattleManager.actor.input.nil?
action = BattleManager.actor.input.item
return false if action.nil?
return action.instant
end
#--------------------------------------------------------------------------
# new method: perform_instant_action
#--------------------------------------------------------------------------
def perform_instant_action
hide_instant_action_windows
@subject = BattleManager.actor
@subject.check_instant_action
execute_action if @subject.current_action.valid?
process_event
loop do
@subject.remove_current_action
break if $game_troop.all_dead?
break unless @subject.current_action
@subject.current_action.prepare
execute_action if @subject.current_action.valid?
end
process_action_end
@subject.make_actions
@subject.restore_instant_action
@subject = nil
show_instant_action_windows
end
#--------------------------------------------------------------------------
# new method: hide_instant_action_windows
#--------------------------------------------------------------------------
def hide_instant_action_windows
if $imported["YEA-BattleEngine"]
@info_viewport.visible = true
@status_aid_window.hide
@status_window.show
@actor_command_window.show
end
end
#--------------------------------------------------------------------------
# new method: show_instant_action_windows
#--------------------------------------------------------------------------
def show_instant_action_windows
if $imported["YEA-BattleEngine"]
@info_viewport.visible = true
end
start_actor_command_selection
status_redraw_target(BattleManager.actor)
next_command unless BattleManager.actor.inputable?
end
#--------------------------------------------------------------------------
# new method: status_redraw_target
#--------------------------------------------------------------------------
def status_redraw_target(target)
return unless target.actor?
@status_window.draw_item($game_party.battle_members.index(target))
end
#--------------------------------------------------------------------------
# alias method: execute_action
#--------------------------------------------------------------------------
alias scene_battle_execute_action_instant execute_action
def execute_action
scene_battle_execute_action_instant
enemy_add_actions
end
#--------------------------------------------------------------------------
# new method: enemy_add_actions
#--------------------------------------------------------------------------
def enemy_add_actions
return if @subject.actor?
return if @subject.current_action.nil?
return if @subject.current_action.item.nil?
return unless @subject.current_action.item.instant
@subject.add_extra_action
end
end # Scene_Battle
#==============================================================================
#
# ▼ End of File
#
#==============================================================================
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1