Project1

标题: 自动战斗与技能冷却脚本的问题? [打印本页]

作者: salt    时间: 2024-4-26 09:35
标题: 自动战斗与技能冷却脚本的问题?
为一些技能增加冷却时间之后
角色的自动战斗出现了空过的毛病
角色有行动次数追加
但因为复读同一个技能导致空过
请问如何去解决呢QAQ
RUBY 代码复制
  1. =begin #-----------------------------------------------------------------------
  2.  
  3. ●スキル技能冷卻【RGSS3 by Declare War】
  4.  
  5. スキルに技能冷卻をつける
  6.  
  7. 技能的备注栏里写<冷却时间:n> <クールタイム:n>
  8. 使用一次后n回合内不能使用
  9.  
  10. 【事件指令】
  11. $game_temp.loss_cool_time(n)       # 敌我全体CD减少
  12. $game_temp.actor_loss_cool_time(n) # 我方全体CD减少
  13. $game_temp.enemy_loss_cool_time(n) # 敌方全体CD减少
  14.  
  15. 【使用规定】
  16. 不需要注明版权和使用报告,自由加工,禁止转载和发布
  17.  
  18. 【版本信息】
  19. v1.2 -提高并用性
  20. v1.1 -从敌人的角度也能适应技能冷却。
  21. v1.0 -公开
  22.  
  23. =end #-------------------------------------------------------------------------
  24. class RPG::Skill < RPG::UsableItem
  25.   #--------------------------------------------------------------------------
  26.   # ● 定数
  27.   #--------------------------------------------------------------------------
  28.   COOL_TIME = /<冷却时间:(\d+)>/
  29.   #--------------------------------------------------------------------------
  30.   # ● 技能CD的取得
  31.   #--------------------------------------------------------------------------
  32.   def cool_time
  33.     return @cool_time if @cool_time != nil
  34.     @cool_time = note =~ COOL_TIME ? $1.to_i + 1 : false
  35.   end
  36. end
  37.  
  38. class << BattleManager
  39.   #--------------------------------------------------------------------------
  40.   # ● 战斗结束(别名)
  41.   #--------------------------------------------------------------------------
  42.   alias cool_time_battle_end battle_end
  43.   def battle_end(result)
  44.     $game_temp.cool_time_variables_initialize
  45.     cool_time_battle_end(result)
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 回合结束(别名)
  49.   #--------------------------------------------------------------------------
  50.   alias cool_time_turn_end turn_end
  51.   def turn_end
  52.     $game_temp.loss_cool_time
  53.     cool_time_turn_end
  54.   end
  55. end
  56.  
  57. class Game_Temp
  58.   #--------------------------------------------------------------------------
  59.   # ● 实例变量
  60.   #--------------------------------------------------------------------------
  61.   attr_accessor :cool_time
  62.   #--------------------------------------------------------------------------
  63.   # ● 对象初始化(别名)
  64.   #--------------------------------------------------------------------------
  65.   alias cool_time_initialize initialize
  66.   def initialize
  67.     cool_time_initialize
  68.     cool_time_variables_initialize
  69.   end
  70.   #--------------------------------------------------------------------------
  71.   # ● 技能冷却的变量的初始化
  72.   #--------------------------------------------------------------------------
  73.   def cool_time_variables_initialize
  74.     @cool_time = Hash.new{|h, k| h[k] = Hash.new(0)}
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 技能冷卻減少
  78.   #--------------------------------------------------------------------------
  79.   def loss_cool_time(n = 1)
  80.     @cool_time.each{|k, v| v.keys.each{|key| v[key] -= n}}  
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # ● 只有角色技能CD减少
  84.   #--------------------------------------------------------------------------
  85.   def actor_loss_cool_time(n = 1)
  86.     @cool_time.each{|k, v| v.keys.each{|key| v[key] -= n} if k.actor?}  
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 敌人技能CD减少
  90.   #--------------------------------------------------------------------------
  91.   def enemy_loss_cool_time(n = 1)
  92.     @cool_time.each{|k, v| v.keys.each{|key| v[key] -= n} if k.enemy?}  
  93.   end
  94.  
  95. end
  96.  
  97. class Game_BattlerBase
  98.   #--------------------------------------------------------------------------
  99.   # ● 技能的可用条件检查(别名)
  100.   #--------------------------------------------------------------------------
  101.   alias cool_time_skill_conditions_met? skill_conditions_met?
  102.   def skill_conditions_met?(skill)
  103.     return false if skill_cooling?(skill)
  104.     cool_time_skill_conditions_met?(skill)
  105.   end
  106. end
  107.  
  108. class Game_Battler < Game_BattlerBase
  109.  
  110.   #--------------------------------------------------------------------------
  111.   # ● 技能CD取得
  112.   #--------------------------------------------------------------------------
  113.   def cool_time
  114.     $game_temp.cool_time[self]
  115.   end
  116.  
  117.   #--------------------------------------------------------------------------
  118.   # ● 技能是否CD中
  119.   #--------------------------------------------------------------------------
  120.   def skill_cooling?(skill)
  121.     skill.cool_time && cool_time[skill.id] > 0
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # ● 技能/道具的使用(别名)
  125.   #--------------------------------------------------------------------------
  126.   alias cool_time_use_item use_item
  127.   def use_item(item)
  128.     count_cool_time(item)
  129.     cool_time_use_item(item)
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 技能CD的通用
  133.   #--------------------------------------------------------------------------
  134.   def count_cool_time(skill)
  135.     return if !($game_party.in_battle && RPG::Skill === skill)
  136.     return if !skill.cool_time
  137.     $game_temp.cool_time[self][skill.id] = skill.cool_time
  138.   end
  139.  
  140. end   
  141. class Window_BattleSkill < Window_SkillList
  142.   #--------------------------------------------------------------------------
  143.   # ● 绘制技能使用成本(alias)
  144.   #--------------------------------------------------------------------------
  145.   alias cool_time_draw_skill_cost draw_skill_cost
  146.   def draw_skill_cost(rect, skill)
  147.     return draw_cool_time(rect, skill) if @actor.skill_cooling?(skill)
  148.     cool_time_draw_skill_cost(rect, skill)
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● 技能冷却的绘制
  152.   #--------------------------------------------------------------------------
  153.   def draw_cool_time(rect, skill)
  154.     change_color(text_color(27), false)
  155.     draw_text(rect, "CD#{@actor.cool_time[skill.id]}", 2)
  156.   end  
  157. end

作者: 魔法丶小肉包    时间: 2024-4-26 20:16
按照道理来说,并不会存在这种问题
所以你可以全局查找一下以下4个方法,看看有没有别的脚本重定义过
skill_conditions_met?
usable?
usable_skills
make_action_list

作者: salt    时间: 2024-4-27 13:57
本帖最后由 salt 于 2024-4-27 14:10 编辑
魔法丶小肉包 发表于 2024-4-26 20:16
按照道理来说,并不会存在这种问题
所以你可以全局查找一下以下4个方法,看看有没有别的脚本重定义过
skill ...


确实有别的脚本定义skill_conditions_met?
请问需要如何修改?
我试着移动cd脚本位置到下面
发现还是会复读同一个有cd的技能
但那个技能并不会因为cd存在而无法使用
约等于无cd
但手动还是有cd
作者: salt    时间: 2024-5-1 00:22
魔法丶小肉包 发表于 2024-4-26 20:16
按照道理来说,并不会存在这种问题
所以你可以全局查找一下以下4个方法,看看有没有别的脚本重定义过
skill ...

  def skill_conditions_met?(skill)
    return false unless hzm_vxa_quickSkill_skill_conditions_met?(skill)
    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
作者: 魔法丶小肉包    时间: 2024-5-5 17:52
salt 发表于 2024-5-1 00:22
def skill_conditions_met?(skill)
    return false unless hzm_vxa_quickSkill_skill_conditions_met ...

你这脚本都没发完整呢,根据猜测,我觉得差不多是酱紫可以试一下,↓这段放在最下面好了
RUBY 代码复制
  1. class Game_BattlerBase
  2.   def skill_conditions_met?(skill)
  3.     return false if skill_cooling?(skill)
  4.     return false unless usable_item_conditions_met?(skill) && skill_wtype_ok?(skill) && skill_cost_payable?(skill) && !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
  5.     return true unless $game_party.in_battle
  6.     if data = skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  7.       cnt = data.first.to_i
  8.       cnt = 1  unless cnt > 0
  9.       hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
  10.       return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_skill.count(skill.id) >= cnt
  11.     end
  12.     true
  13.   end
  14. end

作者: salt    时间: 2024-5-5 20:19
魔法丶小肉包 发表于 2024-5-5 17:52
你这脚本都没发完整呢,根据猜测,我觉得差不多是酱紫可以试一下,↓这段放在最下面好了
class Game_Batt ...

放最下面试了试 并没有解决
自动战斗依旧会重复读CD状态的技能
还是空过
作者: salt    时间: 2024-5-6 00:16
本帖最后由 salt 于 2024-5-6 00:33 编辑
魔法丶小肉包 发表于 2024-5-5 17:52
你这脚本都没发完整呢,根据猜测,我觉得差不多是酱紫可以试一下,↓这段放在最下面好了
class Game_Batt ...


那个是让 物品/技能 不消耗回合立即发动
但自动战斗使用这类技能时 不消耗回合不生效
不过那个影响不大
主要还是自动战斗时一直想连发同一个技能导致的
例如这样
技能1 有8回合cd时间 但伤害最高
技能2 没有cd 但伤害低
但自动战斗好像是在确定回合开始时可用的技能然后选用
在有行动次数增加时 例如3动的情况
回合1 技能1处于可用状态 然后选择的出招就是 技能1 x3
但是技能1有cd 于是实际情况是 技能1 空过 空过
回合2 则是 技能2 x3
预期的效果是
回合1 技能1 技能2 x2
回合2 则是 技能2 x3


作者: 魔法丶小肉包    时间: 2024-5-6 11:59
本帖最后由 魔法丶小肉包 于 2024-5-6 12:19 编辑
salt 发表于 2024-5-6 00:16
那个是让 物品/技能 不消耗回合立即发动
但自动战斗使用这类技能时 不消耗回合不生效
不过那个影响不大


信息实在有限,我只能根据你说的效果来猜测,你把这段放在最下面试一下,应该来说呢,现在在自动战斗中的时候会自动判断技能是不是在冷却中,如果在冷却中就会继续判断下一个技能,直到获取到某个没有在冷却中的技能然后进行使用操作
但是如果所有技能都在冷却中的话,还是会空过的。
你先测试一下吧,如果还是不行的话请把相关脚本发发全

RUBY 代码复制
  1. class Game_BattlerBase
  2.   def skill_conditions_met?(skill)
  3.     return false unless usable_item_conditions_met?(skill) && skill_wtype_ok?(skill) && skill_cost_payable?(skill) && !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
  4.     return true unless $game_party.in_battle
  5.     if skill_cooling?(skill) && self.is_a?(Game_Actor)
  6.       return false unless auto_battle?
  7.       skills.each do |i|
  8.         if !skill_cooling?(i)
  9.           skill = i
  10.           break
  11.         end
  12.         return false if i == skills[-1]
  13.       end
  14.     end
  15.     if data = skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  16.       cnt = data.first.to_i
  17.       cnt = 1  unless cnt > 0
  18.       hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
  19.       return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_skill.count(skill.id) >= cnt
  20.     end
  21.     true
  22.   end
  23. end

作者: salt    时间: 2024-5-6 14:43
本帖最后由 salt 于 2024-5-6 14:46 编辑

RUBY 代码复制
  1. # coding: utf-8
  2. #===============================================================================
  3. # ■ [hzm]メモ欄拡張共通部分さん+ for RGSS3
  4. #-------------------------------------------------------------------------------
  5. # 2014/09/27 Ru/むっくRu
  6. #-------------------------------------------------------------------------------
  7. #  データベースのメモ欄の情報を読み取るための共通処理.
  8. #  メモ欄の各行に特定もフレーズがついたものだけを取得します.
  9. #
  10. #  鳥小屋.txtのメモ欄を使うスクリプト群を使う場合に必須になります.
  11. #  (※スクリプト名の頭に[hzm]が付いているスクリプト)
  12. #-------------------------------------------------------------------------------
  13. # 【注意】
  14. #  「[hzm]メモ欄拡張共通部分 for RGSS3」の機能を内包しています.
  15. #  このスクリプトを導入する場合は,
  16. #  [hzm]メモ欄拡張共通部分 for RGSS3は導入しないでください.
  17. #-------------------------------------------------------------------------------
  18. # 【旧バージョン([hzm]メモ欄拡張共通部分 for RGSS3)からの仕様変更点】
  19. #  ・メモ欄のヘッダ文字([hzm])の他にも複数指定することを可能に
  20. #    指定のメソッドを呼び出すことで,
  21. #    [hzm]以外のヘッダ文字をつけたものを認識させることを可能に.
  22. #    (僕が)派生スクリプトを作りやすくするのが目的.
  23. #
  24. #  ・同一項目の複数記述に正式対応
  25. #    [hzm]属性耐性:炎,50
  26. #    [hzm]属性耐性:水,100
  27. #    みたいに同じ項目を複数書いても使えるようになります.
  28. #    ※注意:別にこのスクリプトに属性耐性の機能があるわけではないです
  29. #
  30. #-------------------------------------------------------------------------------
  31. # 【更新履歴】
  32. # 2014/09/27 キャッシュが存在しない場合に再生成するように変更
  33. # 2012/06/04 バージョンチェック用メソッド名修正
  34. # 2012/06/04 [hzm]メモ欄拡張共通部分 for RGSS3から派生
  35. #-------------------------------------------------------------------------------
  36.  
  37. #===============================================================================
  38. # ↓ 以下、スクリプト部 ↓
  39. #===============================================================================
  40.  
  41. # 旧スクリプト導入時にエラー処理を行う
  42. raise "「[hzm]メモ欄拡張共通部分 for RGSS3」が導入されています.\n「[hzm]メモ欄拡張共通部分 for RGSS3」は既に不要なので,\n削除してください." if defined?(HZM_VXA::Note)
  43.  
  44. module HZM_VXA
  45.   module Note2
  46.     # ● デフォルトのマークフレーズ
  47.     #    (※変更しないでください)
  48.     DEFAULT_MARK = '[hzm]'
  49.     # ● 「[hzm]メモ欄拡張共通部分 for RGSS3」との互換性を保持するか?
  50.     USE_OLD_STYLE = true
  51.   end
  52. end
  53.  
  54. module HZM_VXA
  55.   module Note2
  56.     #---------------------------------------------------------------------------
  57.     # ● メモスクリプトのバージョン
  58.     #    .区切りの3つの数字で表現
  59.     #    1桁目:メジャーバージョン(仕様変更=互換性破たん時に変更)
  60.     #    2桁目:マイナーバージョン(機能追加時に変更)
  61.     #    3桁目:パッチバージョン(不具合修正時に変更)
  62.     #---------------------------------------------------------------------------
  63.     VERSION = '3.0.0'
  64.     #---------------------------------------------------------------------------
  65.     # ● バージョン比較処理
  66.     #---------------------------------------------------------------------------
  67.     def self.check_version?(version_str)
  68.       version     = version2array(VERSION)
  69.       req_version = version2array(version_str)
  70.       # メジャーバージョンが要求と一致するか?
  71.       return false unless version[0] == req_version[0]
  72.       # マイナーバージョンが要求より低くないか?
  73.       return false unless version[1] >= req_version[1]
  74.       true
  75.     end
  76.     #---------------------------------------------------------------------------
  77.     # ● バージョン文字列の分解
  78.     #---------------------------------------------------------------------------
  79.     def self.version2array(version_str)
  80.       version_str.split('.').map{|n| n.to_i}
  81.     end
  82.     #---------------------------------------------------------------------------
  83.     # ● ヘッダマーク配列
  84.     #---------------------------------------------------------------------------
  85.     @header_mark = []
  86.     #---------------------------------------------------------------------------
  87.     # ● ヘッダマークの取得
  88.     #---------------------------------------------------------------------------
  89.     def self.header_mark
  90.       @header_mark
  91.     end
  92.     #---------------------------------------------------------------------------
  93.     # ● ヘッダマークの追加
  94.     #---------------------------------------------------------------------------
  95.     def self.add_header_mark(mark_str)
  96.       @header_mark.push(mark_str) unless @header_mark.include?(mark_str)
  97.     end
  98.     #---------------------------------------------------------------------------
  99.     # ● メモ欄の内容を解析
  100.     #---------------------------------------------------------------------------
  101.     def self.setup
  102.       add_header_mark(DEFAULT_MARK)
  103.       list = [
  104.         $data_actors,
  105.         $data_classes,
  106.         $data_skills,
  107.         $data_items,
  108.         $data_weapons,
  109.         $data_armors,
  110.         $data_enemies,
  111.         $data_states,
  112.         $data_tilesets,
  113.       ]
  114.       list.each do |data|
  115.         data.each do |d|
  116.           d.hzm_vxa_note2_init if d
  117.         end
  118.       end
  119.     end
  120.     #---------------------------------------------------------------------------
  121.     # ■ メモ欄を持つクラスに追加するメソッド類
  122.     #---------------------------------------------------------------------------
  123.     module Utils
  124.       #-------------------------------------------------------------------------
  125.       # ● メモ欄のチェック
  126.       #-------------------------------------------------------------------------
  127.       def hzm_vxa_note2_init
  128.         hzm_vxa_note2_clear
  129.         self.note.split(/\r?\n/).each do |line|
  130.           HZM_VXA::Note2.header_mark.each do |mark|
  131.             next unless line.index(mark) == 0
  132.             l = line.sub!(mark, '')
  133.             if l =~ /^([^\:]+)\:(.+)$/
  134.               hzm_vxa_note2_add(mark, $1, $2)
  135.             else
  136.               hzm_vxa_note2_add(mark, l, '')
  137.             end
  138.           end
  139.         end
  140.       end
  141.       #-------------------------------------------------------------------------
  142.       # ● メモ欄情報の追加
  143.       #-------------------------------------------------------------------------
  144.       def hzm_vxa_note2_add(mark, key, str)
  145.         # 文字列として保存
  146.         @hzm_vxa_note2_str[mark][key] ||= []
  147.         @hzm_vxa_note2_str[mark][key].push(str.to_s)
  148.         # カンマ区切りのデータとして保存
  149.         @hzm_vxa_note2_data[mark][key] ||= []
  150.         data = str.split(/\s*\,\s*/).map do |d|
  151.           if d =~ /^\-?\d+$/
  152.             d.to_i
  153.           elsif d =~ /^\-?\d+\.\d+$/
  154.             d.to_f
  155.           else
  156.             d.to_s
  157.           end
  158.         end
  159.         @hzm_vxa_note2_data[mark][key].push(data)
  160.       end
  161.       #-------------------------------------------------------------------------
  162.       # ● メモ欄情報の削除
  163.       #-------------------------------------------------------------------------
  164.       def hzm_vxa_note2_clear
  165.         @hzm_vxa_note2_str = {}
  166.         @hzm_vxa_note2_data = {}
  167.         HZM_VXA::Note2.header_mark.each do |mark|
  168.           @hzm_vxa_note2_str[mark] = {}
  169.           @hzm_vxa_note2_data[mark] = {}
  170.         end
  171.       end
  172.       #-------------------------------------------------------------------------
  173.       # ● メモ内容取得
  174.       #-------------------------------------------------------------------------
  175.       def hzm_vxa_note2_match(mark, keys)
  176.         hzm_vxa_note2_matches(mark, keys).last
  177.       end
  178.       def hzm_vxa_note2_match_str(mark, keys)
  179.         hzm_vxa_note2_matches_str(mark, keys).last
  180.       end
  181.       def hzm_vxa_note2_matches(mark, keys)
  182.         mark ||= HZM_VXA::Note2::DEFAULT_MARK
  183.         ret = []
  184.         keys.each do |key|
  185.           ret += self.hzm_vxa_note2_data[mark][key] if self.hzm_vxa_note2_data[mark].include?(key)
  186.         end
  187.         ret
  188.       rescue => e
  189.         puts "#{$!} - #{$@}"
  190.       end
  191.       def hzm_vxa_note2_matches_str(mark, keys)
  192.         mark ||= HZM_VXA::Note2::DEFAULT_MARK
  193.         ret = []
  194.         keys.each do |key|
  195.           ret += self.hzm_vxa_note2_str[mark][key] if self.hzm_vxa_note2_str[mark].include?(key)
  196.         end
  197.         ret
  198.       end
  199.       def hzm_vxa_note2_data
  200.         hzm_vxa_note2_init unless @hzm_vxa_note2_data
  201.         @hzm_vxa_note2_data
  202.       end
  203.       def hzm_vxa_note2_str
  204.         hzm_vxa_note2_init unless @hzm_vxa_note2_str
  205.         @hzm_vxa_note2_str
  206.       end
  207.     end
  208.   end
  209. end
  210.  
  211. # メモ欄を持つクラスに機能追加
  212. class RPG::BaseItem
  213.   include HZM_VXA::Note2::Utils
  214. end
  215. class RPG::Tileset
  216.   include HZM_VXA::Note2::Utils
  217. end
  218.  
  219. # メモ解析
  220. if true
  221.   class << DataManager
  222.     alias hzm_vxa_note2_init init
  223.     def init
  224.       hzm_vxa_note2_init
  225.       HZM_VXA::Note2.setup
  226.     end
  227.   end
  228. end
  229.  
  230. # 旧スクリプトとの互換性保持
  231. if HZM_VXA::Note2::USE_OLD_STYLE
  232.   module HZM_VXA
  233.     module Note
  234.       #-------------------------------------------------------------------------
  235.       # ● メモスクリプトのバージョン
  236.       #-------------------------------------------------------------------------
  237.       VERSION = 2.20
  238.       #-------------------------------------------------------------------------
  239.       # ● バージョンチェック機構
  240.       #-------------------------------------------------------------------------
  241.       def self.check_version(n)
  242.         (n >= 2 and n < 3)
  243.       end
  244.     end
  245.   end
  246.   module HZM_VXA
  247.     module Note2
  248.       module Utils
  249.         #-----------------------------------------------------------------------
  250.         # ● メモ内容取得
  251.         #-----------------------------------------------------------------------
  252.         def hzm_vxa_note_match(keys)
  253.           hzm_vxa_note2_match(HZM_VXA::Note2::DEFAULT_MARK, keys)
  254.         end
  255.         def hzm_vxa_note(key)
  256.           hzm_vxa_note2_match(HZM_VXA::Note2::DEFAULT_MARK, [key])
  257.         end
  258.         #-----------------------------------------------------------------------
  259.         # ● メモ内容(単一文字列)取得
  260.         #-----------------------------------------------------------------------
  261.         def hzm_vxa_note_str_match(keys)
  262.           hzm_vxa_note2_match_str(HZM_VXA::Note2::DEFAULT_MARK, keys)
  263.         end
  264.         def hzm_vxa_note_str(key)
  265.           hzm_vxa_note2_match_str(HZM_VXA::Note2::DEFAULT_MARK, [key])
  266.         end
  267.       end
  268.     end
  269.   end
  270. end


RUBY 代码复制
  1. # coding: utf-8
  2. #===============================================================================
  3. # ■ [hzm]ターン消費無しスキルさん+ for RGSS3
  4. # ※ このスクリプトには「[hzm]メモ欄拡張共通部分さん+ for RGSS3」が必要です
  5. #    「[hzm]メモ欄拡張共通部分 for RGSS3」では動作しません
  6. #-------------------------------------------------------------------------------
  7. # 2014/06/22 Ru/むっくRu
  8. #-------------------------------------------------------------------------------
  9. # 【機能1:ターン消費無しスキル/アイテム】
  10. #  ターンを消費せずに,選択した瞬間に発動するスキルを設定します.
  11. #  「データベース」の「スキル」の「メモ」欄に以下のように記述してください.
  12. #
  13. #  [hzm]ターン消費無し:n
  14. #  または
  15. #  [hzm]即発動:n
  16. #  
  17. #  n の部分は1以上の数値に置き換えてください(例:[hzm]ターン消費無し:1)
  18. #  この数字の部分の回数だけ,1ターン中にこのスキルを使用することができます.
  19. #  (:nの部分を省略した場合、:1と記述した場合と同じになります)
  20. #
  21. #  同様にアイテムにも設定を行うことができます.
  22. #  「データベース」の「アイテム」の「メモ」欄に同様に記述してください.
  23. #-------------------------------------------------------------------------------
  24. # 【機能2:行動順序をスキルごとに反映】
  25. #  デフォルトのシステムだと,例えば2回行動のキャラクターが
  26. #  「通常攻撃(速度補正:0)」,「防御(速度補正:2000)」の
  27. #  2つを選択した場合に,速度補正が低い側(通常攻撃)のほうに統一されてしまい,
  28. #  防御がターンの最初に発動しません.
  29. #
  30. #  このスクリプトでは,ターンの順番をキャラクターごとではなく,
  31. #  そのキャラクターの行動ごとに順番を設定することによって,
  32. #  各行動ごとの速度補正を適用できるようにします.
  33. #
  34. #  例)
  35. #  エリック
  36. #    素早さ: 30 行動:通常攻撃(速度補正:0),防御(速度補正:2000)
  37. #  スライム
  38. #    素早さ:100 行動:通常攻撃(速度補正:0)
  39. #
  40. #  ・デフォルトのシステムの場合
  41. #  スライム通常攻撃→エリック通常攻撃→エリック防御
  42. #
  43. #  ・このスクリプト導入後
  44. #  エリック防御→スライム通常攻撃→エリック通常攻撃
  45. #-------------------------------------------------------------------------------
  46. # 【更新履歴】
  47. # 2014/06/22 通常攻撃にも適用できるように
  48. # 2014/06/07 次回行動アクター取得処理が正常に動いていないのを修正v2
  49. # 2013/07/18 行動終了時に解除される行動制約ステートが解除されないのを修正
  50. # 2013/03/17 エネミーの行動ターン数指定がおかしくなるのを修正。おまけ機能追加。
  51. # 2013/02/16 ターン開始時に行動不能が解除された際にエラー落ちするのを修正
  52. # 2013/01/11 コモンイベント呼び出しでアクターを離脱させるとエラー落ちしていたのを修正
  53. # 2012/10/14 行動回数再計算ON時,エネミーが「逃げる」とエラー落ちしていたのを修正
  54. # 2012/10/09 マップ上でアイテムを使用した際にエラー落ちしていたのを修正
  55. # 2012/10/06 戦闘中にパーティ入れ替えを行った場合にエラー落ちしていたのを修正
  56. #            ステータスウィンドウの更新が正常に行われていなかったのを修正
  57. # 2012/10/05 大幅修正を行いました.
  58. #            新メモスクリプト([hzm]メモ欄拡張共通部分さん+ for RGSS3)用に変更
  59. #            行動回数の再計算機能(アクター/エネミー)を追加
  60. #            1ターン内で使用できる回数の設定を追加
  61. #            「各行動ごとに行動順を設定さん for RGSS3」の機能を内包
  62. # 2012/10/03 行動回数の再計算(暫定)を追加
  63. # 2012/06/01 エネミー用設定を追加
  64. # 2012/04/21 複数回行動するアクターが正常に動作しない不具合を修正
  65. # 2012/04/01 味方の行動不能状態を回復した際に強制終了する不具合を修正
  66. # 2012/03/28 アイテムにも対応
  67. # 2012/01/28 コモンイベント内で「戦闘行動の強制」を使用した際に強制終了するのを修正
  68. # 2012/01/28 コモンイベントの呼び出しが正常に動作しないのを少し修正
  69. # 2012/01/03 ぶっぱ
  70. #-------------------------------------------------------------------------------
  71.  
  72. #===============================================================================
  73. # ● 設定項目
  74. #===============================================================================
  75. module HZM_VXA
  76.   module QuickSkill
  77.     # ● ターン消費無し行動後に行動回数を再計算する(上級設定)
  78.     #   [効果]
  79.     #   ・エネミーも(疑似的に)ターン消費無しスキルを使用可能に
  80.     #   ・行動回数を変化させるステートを即時反映
  81.     #   [副作用]
  82.     #   ・50%の確率で行動回数増加などの設定が使用不可に
  83.     #     true  : する
  84.     #     false : しない
  85.     CHECK_ACTION_TIMES = false
  86.  
  87.     # ● オマケ機能:敵の行動パターンのターン数の仕様をVX化
  88.     #    1ターン目(最初のターン)に指定の行動をさせたい場合、
  89.     #    VX Aceでは行動パターンを0ターン目に設定する必要があります。
  90.     #    この設定方法をVX同様の仕様に変更し、
  91.     #    1ターン目の場合は1ターン目に設定できるようにします。
  92.     #    (上級設定に関係なく使用できます)
  93.     #    true  : VX仕様にする
  94.     #    false : 変更しない
  95.     ENEMY_TURN_NORMALIZE = false
  96.   end
  97. end
  98.  
  99. #===============================================================================
  100. # ↑   ここまで設定   ↑
  101. # ↓ 以下、スクリプト部 ↓
  102. #===============================================================================
  103.  
  104. raise "「[hzm]メモ欄拡張共通部分さん+ for RGSS3」を導入してください" unless defined?(HZM_VXA::Note2)
  105. raise "「[hzm]メモ欄拡張共通部分さん+ for RGSS3」のバージョンが一致しません" unless HZM_VXA::Note2.check_version?('3.0.0')
  106.  
  107. module HZM_VXA
  108.   module QuickSkill
  109.     # メモ欄から読み込む要素名の候補を設定
  110.     QUICK_KEYS = ['ターン消費無し', '即発動',  'QuickSkill']
  111.     #---------------------------------------------------------------------------
  112.     # ● QuickSkill中か?
  113.     #---------------------------------------------------------------------------
  114.     def self.quickSkill?
  115.       @quickSkill
  116.     end
  117.     #---------------------------------------------------------------------------
  118.     # ● 即時行動開始
  119.     #---------------------------------------------------------------------------
  120.     def self.start
  121.       @quickSkill = true
  122.     end
  123.     #---------------------------------------------------------------------------
  124.     # ● 即時行動終了
  125.     #---------------------------------------------------------------------------
  126.     def self.finish
  127.       @quickSkill = false
  128.       # 全てのbattlerのアクションを戻す
  129.       $game_party.hzm_vxa_quickSkill_force_action_reverse
  130.       $game_troop.hzm_vxa_quickSkill_force_action_reverse
  131.     end
  132.     #---------------------------------------------------------------------------
  133.     # ● スキル使用回数のリセット
  134.     #---------------------------------------------------------------------------
  135.     def self.reset_use_count
  136.       $game_party.hzm_vxa_quickSkill_reset_use_count
  137.       $game_troop.hzm_vxa_quickSkill_reset_use_count
  138.     end
  139.     # ターン消費無しアイテム管理対象
  140.     ITEM_COUNT_PARTY = true
  141.   end
  142. end
  143.  
  144. module BattleManager
  145.   #-----------------------------------------------------------------------------
  146.   # ● 行動順序の作成(再定義)
  147.   #-----------------------------------------------------------------------------
  148.   def self.make_action_orders
  149.     @action_battlers = []
  150.     all_actions = []
  151.     all_members = []
  152.     all_members += $game_party.members unless @surprise
  153.     all_members += $game_troop.members unless @preemptive
  154.     all_members.each do |member|
  155.       next unless member.movable?
  156.       member.make_speed
  157.       member.actions.each {|action| all_actions.push action }
  158.     end
  159.     all_actions.sort!{|a,b| b.speed - a.speed }
  160.     all_actions.each {|action| @action_battlers.push action.subject}
  161.   end
  162.   #-----------------------------------------------------------------------------
  163.   # ● 行動が未選択のアクターを先頭から探す(独自)
  164.   #-----------------------------------------------------------------------------
  165.   def self.hzm_vxa_quickSkill_can_action_actor_before(daemon)
  166.     return false unless $game_party.members.index(daemon)
  167.     for @actor_index in 0..$game_party.members.index(daemon)
  168.       actor = $game_party.members[@actor_index]
  169.       return true if actor.next_command
  170.     end
  171.     false
  172.   end
  173. end
  174.  
  175. class Game_Unit
  176.   attr_accessor :hzm_vxa_quickSkill_can_use_item
  177.   #-----------------------------------------------------------------------------
  178.   # ● 戦闘開始処理(エイリアス)
  179.   #-----------------------------------------------------------------------------
  180.   alias hzm_vxa_quickSkill_on_battle_start on_battle_start
  181.   def on_battle_start
  182.     hzm_vxa_quickSkill_on_battle_start
  183.     hzm_vxa_quickSkill_reset_use_count
  184.   end
  185.   #-----------------------------------------------------------------------------
  186.   # ● 戦闘行動の復元(独自)
  187.   #-----------------------------------------------------------------------------
  188.   def hzm_vxa_quickSkill_force_action_reverse
  189.     members.each {|member| member.hzm_vxa_quickSkill_force_action_reverse }
  190.   end
  191.   #-----------------------------------------------------------------------------
  192.   # ● スキル使用回数のリセット(独自)
  193.   #-----------------------------------------------------------------------------
  194.   def hzm_vxa_quickSkill_reset_use_count
  195.     members.each {|member| member.hzm_vxa_quickSkill_reset_use_count }
  196.     if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
  197.       @hzm_vxa_quickSkill_can_use_item ||= []
  198.       @hzm_vxa_quickSkill_can_use_item.clear
  199.     end
  200.   end
  201. end
  202.  
  203. class Game_Battler < Game_BattlerBase
  204.   #-----------------------------------------------------------------------------
  205.   # ● 行動速度の決定(エイリアス)
  206.   #-----------------------------------------------------------------------------
  207.   alias hzm_vxa_quickSkill_make_speed make_speed
  208.   def make_speed
  209.     # 空行動は削除する
  210.     @actions.reject! {|a| a == nil}
  211.     # 元の処理
  212.     hzm_vxa_quickSkill_make_speed
  213.     # アクションを速度順にソート
  214.     @actions.sort! {|a,b| b.speed - a.speed }
  215.   end
  216.   #-----------------------------------------------------------------------------
  217.   # ● スキルの使用可能条件チェック(エイリアス)
  218.   #-----------------------------------------------------------------------------
  219.   alias hzm_vxa_quickSkill_skill_conditions_met? skill_conditions_met?
  220.   def skill_conditions_met?(skill)
  221.     # 元の処理
  222.     return false unless hzm_vxa_quickSkill_skill_conditions_met?(skill)
  223.     # 戦闘中でなければOK
  224.     return true unless $game_party.in_battle
  225.     # 指定回数チェック
  226.     if data = skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  227.       cnt = data.first.to_i
  228.       cnt = 1  unless cnt > 0
  229.       hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
  230.       return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_skill.count(skill.id) >= cnt
  231.     end
  232.     true
  233.   end
  234.   #-----------------------------------------------------------------------------
  235.   # ● アイテムの使用可能条件チェック(エイリアス)
  236.   #-----------------------------------------------------------------------------
  237.   alias hzm_vxa_quickSkill_item_conditions_met? item_conditions_met?
  238.   def item_conditions_met?(item)
  239.     # 元の処理
  240.     return false unless hzm_vxa_quickSkill_item_conditions_met?(item)
  241.     # 戦闘中でなければOK
  242.     return true unless $game_party.in_battle
  243.     # 指定回数チェック
  244.     if data = item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  245.       cnt = data.first.to_i
  246.       cnt = 1  unless cnt > 0
  247.       if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
  248.         return false if cnt > 0 and $game_party.hzm_vxa_quickSkill_can_use_item.count(item.id) >= cnt
  249.       else
  250.         return false if cnt > 0 and @hzm_vxa_quickSkill_can_use_item.count(item.id) >= cnt
  251.       end
  252.     end
  253.     true
  254.   end
  255.   #-----------------------------------------------------------------------------
  256.   # ● スキル使用回数リセット(独自)
  257.   #-----------------------------------------------------------------------------
  258.   def hzm_vxa_quickSkill_reset_use_count
  259.       @hzm_vxa_quickSkill_can_use_skill ||= []
  260.       @hzm_vxa_quickSkill_can_use_skill.clear
  261.       unless HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
  262.         @hzm_vxa_quickSkill_can_use_item ||= []
  263.         @hzm_vxa_quickSkill_can_use_item.clear
  264.       end
  265.   end
  266.   #-----------------------------------------------------------------------------
  267.   # ● 戦闘行動の強制(エイリアス)
  268.   #-----------------------------------------------------------------------------
  269.   alias hzm_vxa_quickSkill_force_action force_action
  270.   def force_action(skill_id, target_index)
  271.     @hzm_vxa_quickSkill_actions = HZM_VXA::QuickSkill.quickSkill? ? @actions.clone : nil
  272.     hzm_vxa_quickSkill_force_action(skill_id, target_index)
  273.   end
  274.   #-----------------------------------------------------------------------------
  275.   # ● 戦闘行動の復元(独自)
  276.   #-----------------------------------------------------------------------------
  277.   def hzm_vxa_quickSkill_force_action_reverse
  278.     return unless @hzm_vxa_quickSkill_actions
  279.     @actions = @hzm_vxa_quickSkill_actions
  280.     @hzm_vxa_quickSkill_actions = nil
  281.   end
  282.   #-----------------------------------------------------------------------------
  283.   # ● スキル/アイテムの使用(エイリアス)
  284.   #-----------------------------------------------------------------------------
  285.   alias hzm_vxa_quickSkill_use_item use_item
  286.   def use_item(item)
  287.     # 戦闘中かどうか?
  288.     if $game_party.in_battle
  289.       # カウント可能か確認
  290.       hzm_vxa_quickSkill_reset_use_count unless @hzm_vxa_quickSkill_can_use_skill
  291.       # スキル/アイテム使用回数カウント
  292.       @hzm_vxa_quickSkill_can_use_skill.push(item.id) if item.is_a?(RPG::Skill)
  293.       if HZM_VXA::QuickSkill::ITEM_COUNT_PARTY
  294.         $game_party.hzm_vxa_quickSkill_can_use_item.push(item.id)  if item.is_a?(RPG::Item)
  295.       else
  296.         @hzm_vxa_quickSkill_can_use_item.push(item.id)  if item.is_a?(RPG::Item)
  297.       end
  298.     end
  299.     # 元の処理
  300.     hzm_vxa_quickSkill_use_item(item)
  301.   end
  302. end
  303.  
  304. class Game_Actor < Game_Battler
  305.   #-----------------------------------------------------------------------------
  306.   # ● アクションを先頭に入れ替え(独自)
  307.   #-----------------------------------------------------------------------------
  308.   def hzm_vxa_quickSkill_swapAction
  309.     tmp = @actions[0]
  310.     @actions[0] = @actions[@action_input_index]
  311.     @actions[@action_input_index] = tmp
  312.   end
  313. end
  314.  
  315. class Game_Action
  316.   #-----------------------------------------------------------------------------
  317.   # ● 行動速度の計算(エイリアス)
  318.   #-----------------------------------------------------------------------------
  319.   alias hzm_vxa_quickSkillEnemy_speed speed
  320.   def speed
  321.     # ターン消費無し行動の行動速度を最速化
  322.     item.speed = 999999 if item and item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  323.     # 元の処理
  324.     hzm_vxa_quickSkillEnemy_speed
  325.   end
  326. end
  327.  
  328. class Scene_Battle < Scene_Base
  329.   #-----------------------------------------------------------------------------
  330.   # ● 情報表示ビューポートの更新(エイリアス)
  331.   #-----------------------------------------------------------------------------
  332.   alias hzm_vxa_quickSkill_update_info_viewport update_info_viewport
  333.   def update_info_viewport
  334.     # 元の処理
  335.     hzm_vxa_quickSkill_update_info_viewport
  336.     # ターン消費無し行動中は非表示に
  337.     move_info_viewport(64)   if @hzm_vxa_quickSkill_active
  338.   end
  339.   #-----------------------------------------------------------------------------
  340.   # ● 次のコマンド入力へ(エイリアス)
  341.   #-----------------------------------------------------------------------------
  342.   alias hzm_vxa_quickSkill_next_command next_command
  343.   def next_command
  344.     # ターン消費無し行動が選択されているか確認・実行
  345.     if @hzm_vxa_quickSkill_skill and
  346.        @hzm_vxa_quickSkill_skill.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS)
  347.       # ターン消費無し行動の実行
  348.       hzm_vxa_quickSkill_run
  349.       # 行動を再選択
  350.       if BattleManager.hzm_vxa_quickSkill_can_action_actor_before(@subject) or
  351.           @subject.inputable?
  352.         @subject.prior_command
  353.         return start_actor_command_selection
  354.       end
  355.     end
  356.     # 元の処理
  357.     hzm_vxa_quickSkill_next_command
  358.   end
  359.   #-----------------------------------------------------------------------------
  360.   # ● コマンド[攻撃](エイリアス)
  361.   #-----------------------------------------------------------------------------
  362.   alias hzm_vxa_quickSkill_command_attack command_attack
  363.   def command_attack
  364.     @hzm_vxa_quickSkill_skill = $data_skills[BattleManager.actor.attack_skill_id]
  365.     hzm_vxa_quickSkill_command_attack
  366.   end
  367.   #-----------------------------------------------------------------------------
  368.   # ● スキル[決定](エイリアス)
  369.   #-----------------------------------------------------------------------------
  370.   alias hzm_vxa_quickSkill_on_skill_ok on_skill_ok
  371.   def on_skill_ok
  372.     @hzm_vxa_quickSkill_skill = @skill_window.item
  373.     hzm_vxa_quickSkill_on_skill_ok
  374.   end
  375.   #-----------------------------------------------------------------------------
  376.   # ● スキル[キャンセル](エイリアス)
  377.   #-----------------------------------------------------------------------------
  378.   alias hzm_vxa_quickSkill_on_skill_cancel on_skill_cancel
  379.   def on_skill_cancel
  380.     @hzm_vxa_quickSkill_skill = nil
  381.     hzm_vxa_quickSkill_on_skill_cancel
  382.   end
  383.   #-----------------------------------------------------------------------------
  384.   # ● アイテム[決定](エイリアス)
  385.   #-----------------------------------------------------------------------------
  386.   alias hzm_vxa_quickSkill_on_item_ok on_item_ok
  387.   def on_item_ok
  388.     @hzm_vxa_quickSkill_skill = @item_window.item
  389.     hzm_vxa_quickSkill_on_item_ok
  390.   end
  391.   #-----------------------------------------------------------------------------
  392.   # ● アイテム[キャンセル](エイリアス)
  393.   #-----------------------------------------------------------------------------
  394.   alias hzm_vxa_quickSkill_on_item_cancel on_item_cancel
  395.   def on_item_cancel
  396.     @hzm_vxa_quickSkill_skill = nil
  397.     hzm_vxa_quickSkill_on_item_cancel
  398.   end
  399.   #-----------------------------------------------------------------------------
  400.   # ● アクターコマンド選択の開始(エイリアス)
  401.   #-----------------------------------------------------------------------------
  402.   alias hzm_vxa_quickSkill_start_actor_command_selection start_actor_command_selection
  403.   def start_actor_command_selection
  404.     hzm_vxa_quickSkill_start_actor_command_selection
  405.     BattleManager.actor.make_actions unless BattleManager.actor.input
  406.   end
  407.   #--------------------------------------------------------------------------
  408.   # ● 強制された戦闘行動の処理(エイリアス)
  409.   #--------------------------------------------------------------------------
  410.   alias hzm_vxa_quickSkill_process_forced_action process_forced_action
  411.   def process_forced_action
  412.     @hzm_vxa_quickSkill_force_action = BattleManager.action_forced?
  413.  
  414.     # 元の処理
  415.     hzm_vxa_quickSkill_process_forced_action
  416.  
  417.     @hzm_vxa_quickSkill_force_action = nil
  418.   end
  419.   #-----------------------------------------------------------------------------
  420.   # ● 戦闘行動の処理(再定義)
  421.   #-----------------------------------------------------------------------------
  422.   def process_action
  423.     return if scene_changing?
  424.  
  425.     # 強制行動の場合は次回アクターを計算しない
  426.     unless @hzm_vxa_quickSkill_force_action
  427.       if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
  428.         HZM_VXA::QuickSkill.re_action_times if @hzm_vxa_quickSkill_re_action_times_flag
  429.         @hzm_vxa_quickSkill_re_action_times_flag = false
  430.       end
  431.  
  432.       BattleManager.make_action_orders
  433.       @subject = BattleManager.next_subject
  434.     end
  435.  
  436.     return turn_end unless @subject
  437.     if @subject.current_action
  438.       @subject.current_action.prepare
  439.       if @subject.current_action.valid?
  440.         @status_window.open
  441.         execute_action
  442.       end
  443.       @subject.remove_current_action
  444.     end
  445.     process_action_end unless @subject.current_action
  446.   end
  447.  
  448.   #-----------------------------------------------------------------------------
  449.   # ● ターン消費無し行動の実行(独自)
  450.   #-----------------------------------------------------------------------------
  451.   def hzm_vxa_quickSkill_run
  452.     return unless @hzm_vxa_quickSkill_skill
  453.     @hzm_vxa_quickSkill_skill = nil
  454.     # 行動の開始
  455.     HZM_VXA::QuickSkill::start
  456.     @actor_command_window.close if @actor_command_window
  457.     @hzm_vxa_quickSkill_active = true
  458.     # 行動アクター,行動内容の設定
  459.     @subject = BattleManager.actor
  460.     @subject.hzm_vxa_quickSkill_swapAction # 選んだ行動を先頭に引きずり出す
  461.     # 行動
  462.     execute_action
  463.     # イベント処理
  464.     process_event
  465.     # おわり
  466.     @subject.hzm_vxa_quickSkill_swapAction # 元の位置に戻す
  467.     HZM_VXA::QuickSkill::finish
  468.     # ウィンドウを戻す
  469.     refresh_status
  470.     @hzm_vxa_quickSkill_active = false
  471.     @actor_command_window.open if @actor_command_window
  472.     @status_window.open if @status_window
  473.     # 行動回数の再計算
  474.     HZM_VXA::QuickSkill.re_action_times if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
  475.   end
  476. end
  477.  
  478. # 行動回数の再計算用 & エネミー行動ターン数正常化 共通処理
  479. if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES or HZM_VXA::QuickSkill::ENEMY_TURN_NORMALIZE
  480.   class << BattleManager
  481.     #---------------------------------------------------------------------------
  482.     # ● ターン終了(エイリアス)
  483.     #---------------------------------------------------------------------------
  484.     alias hzm_vxa_quickSkill_turn_end turn_end
  485.     def turn_end
  486.       hzm_vxa_quickSkill_turn_end
  487.       $game_troop.hzm_vxa_quickSkill_increase_turn2
  488.     end
  489.   end
  490.  
  491.   class Game_Troop < Game_Unit
  492.     attr_reader :hzm_vxa_quickSkill_turn_count
  493.     #---------------------------------------------------------------------------
  494.     # ● クリア(エイリアス)
  495.     #---------------------------------------------------------------------------
  496.     alias hzm_vxa_quickSkill_clear clear
  497.     def clear
  498.       hzm_vxa_quickSkill_clear
  499.       @hzm_vxa_quickSkill_turn_count = HZM_VXA::QuickSkill::ENEMY_TURN_NORMALIZE ? 1 : 0
  500.     end
  501.     #---------------------------------------------------------------------------
  502.     # ● クリア(独自)
  503.     #---------------------------------------------------------------------------
  504.     def hzm_vxa_quickSkill_increase_turn2
  505.       @hzm_vxa_quickSkill_turn_count += 1
  506.     end
  507.   end
  508.  
  509.   class Game_Enemy < Game_Battler
  510.     #--------------------------------------------------------------------------
  511.     # ● 行動条件合致判定[ターン数](再定義)
  512.     #--------------------------------------------------------------------------
  513.     def conditions_met_turns?(param1, param2)
  514.       n = $game_troop.hzm_vxa_quickSkill_turn_count
  515.       if param2 == 0
  516.         n == param1
  517.       else
  518.         n > 0 && n >= param1 && n % param2 == param1 % param2
  519.       end
  520.     end
  521.   end
  522. end
  523.  
  524. # 行動回数の再計算用
  525. if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
  526.   module HZM_VXA
  527.     module QuickSkill
  528.       #-------------------------------------------------------------------------
  529.       # ● 行動回数の再計算
  530.       #-------------------------------------------------------------------------
  531.       if CHECK_ACTION_TIMES
  532.         def self.re_action_times
  533.           $game_party.hzm_vxa_quickSkill_re_action_times
  534.           $game_troop.hzm_vxa_quickSkill_re_action_times
  535.         end
  536.       end
  537.     end
  538.   end
  539.  
  540.   class Game_Unit
  541.     #---------------------------------------------------------------------------
  542.     # ● 行動回数の再計算(独自)
  543.     #---------------------------------------------------------------------------
  544.     def hzm_vxa_quickSkill_re_action_times
  545.       members.each {|member| member.hzm_vxa_quickSkill_re_action_times }
  546.     end
  547.   end
  548.  
  549.   class Game_Actor < Game_Battler
  550.     #---------------------------------------------------------------------------
  551.     # ● 行動回数の再計算
  552.     #---------------------------------------------------------------------------
  553.     if HZM_VXA::QuickSkill::CHECK_ACTION_TIMES
  554.       def hzm_vxa_quickSkill_re_action_times
  555.         action_cnt = make_action_times
  556.         @actions.push Game_Action.new(self) while @actions.size < action_cnt
  557.         @actions.pop while @actions.size > action_cnt
  558.       end
  559.     end
  560.   end
  561.  
  562.   class Game_Enemy < Game_Battler
  563.     #---------------------------------------------------------------------------
  564.     # ● 行動回数の再計算(独自)
  565.     #---------------------------------------------------------------------------
  566.     def hzm_vxa_quickSkill_re_action_times
  567.       action_cnt = make_action_times
  568.       make_actions if @actions.size < action_cnt
  569.       @actions.pop while @actions.size > action_cnt
  570.     end
  571.   end
  572.  
  573.   class Scene_Battle < Scene_Base
  574.     #---------------------------------------------------------------------------
  575.     # ● スキル/アイテムの使用(エイリアス)
  576.     #---------------------------------------------------------------------------
  577.     alias hzm_vxa_quickSkill_use_item use_item
  578.     def use_item
  579.       # 元の処理
  580.       hzm_vxa_quickSkill_use_item
  581.       # 行動回数の再計算フラグ(エネミーの場合)
  582.       item = (@subject.enemy? and @subject.current_action) ?
  583.         @subject.current_action.item : nil
  584.       @hzm_vxa_quickSkill_re_action_times_flag =
  585.         (item and item.hzm_vxa_note_match(HZM_VXA::QuickSkill::QUICK_KEYS))
  586.     end
  587.   end
  588. end



也尝试找了一些别的代码
例如这个是检测tp mp消耗
想要类比一下使用后检测cd

RUBY 代码复制
  1. #==============================================================================
  2. # ■ RGSS3 RGSS3自动战斗时多次行动的内容调整ver1.01 by星潟
  3. #------------------------------------------------------------------------------
  4. # 自动战斗时,通常会不计其他行动的成本而选择所有行动。
  5. # 导入该脚本时,每次决定行动时关于MP成本和TP成本
  6. # 从原来的MP和TP中减去,决定下一步行动。
  7. # (根据素材脚本的不同,可能会产生其他成本,
  8. #  说到底这里判定的只是默认假定的MP和TP
  9. #  关于这一点,请您谅解。)
  10. # 另外,减去的MP和TP会在行动决定后复原。
  11. # 实际上MP和TP并没有减少。
  12. #
  13. # 这个脚本请导入到vxace_sp1的正下方。
  14. #==============================================================================
  15. class Game_Actor < Game_Battler
  16.   #--------------------------------------------------------------------------
  17.   # 创建自动战斗时的战斗行动
  18.   #--------------------------------------------------------------------------
  19.   def make_auto_battle_actions
  20.     mp_auto_clone = @mp
  21.     tp_auto_clone = @tp
  22.     @actions.size.times do |i|
  23.       @actions[i] = make_action_list.max_by {|action| action.value }
  24.       if @actions[i] && @actions[i].item
  25.         i = @actions[i].item
  26.         if i.is_a?(RPG::Skill)
  27.           @mp -= skill_mp_cost(i)
  28.           @tp -= skill_tp_cost(i)
  29.         end
  30.       end
  31.     end
  32.     @mp = mp_auto_clone
  33.     @tp = tp_auto_clone
  34.   end
  35. end


作者: salt    时间: 2024-5-6 18:56
本帖最后由 salt 于 2024-5-6 19:03 编辑
魔法丶小肉包 发表于 2024-5-6 11:59
信息实在有限,我只能根据你说的效果来猜测,你把这段放在最下面试一下,应该来说呢,现在在自动战斗中的 ...


我发下工程大佬你看看
我怀疑自动战斗的行动生成的问题
就如同它不考虑蓝耗一样
不考虑使用技能后
技能是否还是可用的

Project3.7z

1.4 MB, 下载次数: 0






欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1