查看: 12278|回复: 60

[RMVA发布] [VA]自动发动技能——10-28完成体

[复制链接]
梦石
0
星屑
80
在线时间
132 小时
注册时间
2014-5-7
回帖
143
发表于 2015-8-17 09:19:14 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 Silentever 于 2015-10-30 14:28 编辑

2015-10-28   最终更新
2015-10-09   更新:修复BUG,写法优化,追加无视行动限制的自发技能,追加简化定义
                      删除:自发技能使用成功分歧判定(感觉没什么用处)
2015-09-19   追加功能:追加last_act定义,追加自发技能使用成功分歧判定
2015-09-12   追加功能:支持让敌人也使用自发技能,追加地图自发技能,追加目标对象的选择机制




此脚本的功能是让战斗成员在通常行动以外可以追加额外行动,做出了可以根据特定条件发动的自动技能。灵感是来自世界树迷宫跟第七龙神这一类的RPG游戏,像是在战斗开始的时候一定几率发动的全体攻击,或战斗结束时恢复一定程度的HP之类的技能让人印象深刻。不过这东西的潜力远比原本预期的功能要高,能用来做什么还得看使用者的想象力了。

基础说明:
需要在脚本内相应的时机中填入“Ask[ID] = {各种参数}”。战斗过程中会判断填入的技能是否有成功发动,并且执行。
举个例子来说,如果填入“Ask[3] = { '时机'=>'战斗开始', '几率'=>'50', '条件'=>'state?(2)' }”,会在战斗开始,玩家输入前让所有学会了3号技能、持有2号状态、通过50%随机判定的成员执行该技能。默认数据库中3号是连续攻击,2号状态是剧毒,会变成中毒的成员有50%的几率使用连续攻击。
概念就是这种用几率跟条件去判断是否执行的技能。具体请看脚本内的详细说明。

【新手向】条件设置的写法基本上可以参考这里的内容,个人认为容易理解并实用:http://rpg.blue/thread-307316-1-1.html
与上面不同的地方是无法指定一个对象(B),并且指定使用者的时候不需要在前面加任何东西:写“atk”的时候会直接获取使用者的攻击力(不过防御力则需要加上“self.”)。

另外,可以联动我的另一个脚本“技能开关”,被关闭的技能不会发动:https://rpg.blue/thread-383392-1-1.html

[fold=代码]
  1. #==============================================================================
  2. #
  3. # 自发技能 by Silentever(夜光云)
  4. #    (自动发动技能)
  5. #
  6. #    2015-10-28 更新:修复BUG,最终版
  7. #    2015-10-09 更新:修复BUG,写法优化,追加无视行动限制的自发技能,追加简化定义
  8. #                     删除:自发技能使用成功分歧判定
  9. #    2015-09-19 更新:追加:last_act定义,自发技能使用成功分歧判定
  10. #    2015-09-12 更新:修复BUG,支持让敌人也使用自发技能,追加地图自发技能,追加对象选择机制
  11. #    2015-08-17 发布
  12. #
  13. #==============================================================================
  14. # ▼ 设定
  15. #    填入【 Ask[ID] = { '参数名' => '算法' (用','分开) } 】
  16. #
  17. #  ID.......技能ID。对指定的技能无任何要求(可以发动任何技能)。
  18. #
  19. #  参数列表:
  20. #    几率...发动几率(0~100),不填写时为默认100。
  21. #           只要是返回数字,可以用变量计算;超出范围不会出错请安心。
  22. #    条件...发动先置条件(返回true/false),不填写时为默认true(无先置条件)。
  23. #    时机...限定发动的时机,详细在下面1。
  24. #    范围...设置方法请看下面2。
  25. #    强制...设定为true的场合,技能将会无视此脚本设置的条件与学会条件以外的,
  26. #           任何技能的常规发动条件(MP不足,行动不能等)。
  27. #
  28. #  例子:
  29. #    Ask[1] = {}                         => 使用1号技能(没有任何参数用空'{}')
  30. #    Ask[2] = { '几率' => '50' }         => 50%几率使用2号技能
  31. #    Ask[3] = { '条件' => 'luk > 50' }   => 幸运高于50(不包括等于)使用3号技能
  32. #    Ask[4] = { '条件' => 'state?(2)',
  33. #               '几率' => '100 - @state_turns[2] * 10'}
  34. #        => 持有2号状态的情况下,以(100-2号状态剩余回合数*10)的几率发动
  35. #
  36. #  填写时请把所有的参数跟其内容用 '' 或 "" 号包封。
  37. #  【注意】使用自发技能的第一个先置条件是学会(不论升级或特性添加),
  38. #  有必要让想让使用该技能的角色学会;另外敌人必须使用特性添加技能才能使用
  39. #  技能的使用会受到基础使用条件的限制(MP不足,使用场合不符,角色无法行动等)。
  40. #   
  41. #  补充:
  42. #  1) 重复添加相同的ID技能,【没办法】重复使用,写在后面的内容会覆盖先前的内容。
  43. #  2) 同一个时机中有复数自发技能行动角色时,会根据行动速度进行排列。
  44. #  3) 只能在战斗中使用,关于地图技能请看下面。
  45. #  4) 填写时注意使用全部半角的标点符号。
  46. #
  47. #
  48. #  ■【时机】(2015-10-09 更新中自发技能从发动时机分离)
  49. #  在参数中加入【 '时机' => '战斗开始, 战斗结束' 】
  50. #  可以把自发技能的使用锁定在后面填入的时机中。以上例子是把时机限定在了战斗开始跟结束。
  51. #  因为不填写时会每个时机都使用一次,因此【强烈】建议填写。
  52. #
  53. #  时机与以往不变:
  54. #    战斗开始,战斗结束  => 敌人出现时,胜利或逃跑后
  55. #    回合开始,回合结束  => 全部选择好行动后,回合正式开始的时候,以及回合结束
  56. #    行动前,行动后      => 自己进行主要行动(使用技能/道具)的前后
  57. #    受伤前,受伤后      => 自己成为技能/道具的对象,效果处理前/后
  58. #  直接把以上部分直接输入,用 , 分开。
  59. #
  60. #
  61. #  ■【范围】
  62. #  因为这部分比较复杂,慎入。注意在最后全部都用 '' 或 "" 号包封。
  63. #  不填写时,会自动选择对象(遵守原使用范围)。
  64. #  设置对象群体时,将会无视技能本身的使用范围。
  65. #
  66. #  设置时,可以放3部分,用“,”互相分开。其中1号是必须放在最前,其余可以随意排序。
  67. #  1) 范围的对象群体。用“+”追加,“-”排除。此外必须在每个运算符号前后留个空格。
  68. #     self是使用者自己。last是最后一个对象。重复加入会复数处理效果。
  69. #     最后一个对象指最后一次输入指令时选择的对象索引(每个角色独立)。
  70. #  2) 定成“max或min : 比较数值 : 采取数量”,不填写数量时当作1处理。
  71. #     会从范围中选择该数量的,持有最高/最低指定数值的单位。
  72. #  3) 用代码进行计算返回true/false,从范围选择所有符合条件的单位。
  73. #     计算代码可以使用跟伤害公式一样的变量:a=使用者,b=单独对象,v=游戏变量。
  74. #     不存在可选对象时,技能不发动。
  75. #
  76. #  例子:
  77. #  Ask[5] = { '范围' => 'self + last' }
  78. #      => 将目标对象锁定成自身与自身的最后对象
  79. #  Ask[6] = { '范围' => 'party - self, max:hp:2' }
  80. #      => 在玩家队伍成员中,除使用者以外,选择HP最高的2个角色
  81. #  Ask[7] = { '范围' => 'troop, b.state?(10)' }
  82. #      => 从敌群中选择所有持有10号状态的成员
  83. #  Ask[8] = { '范围' => 'allies, b.state?(1), max:mhp' }
  84. #      => 从持有1号状态的同伴中选择HP上限最高的1个成员(敌人使用会选择敌人)
  85. #  Ask[9] = { '范围' => 'party + self, min:hp:3, b.hp > 0' }
  86. #      => 从HP高于0的玩家队伍以及自身中选取3个HP最低的成员。
  87. #         注意角色使用的场合会把自身计算2此,因此会占有2个对象,并受到2次技能效果。
  88. #
  89. #
  90. #  ■【仅限伤害处理】
  91. #  仅在伤害处理可以使用user与item。
  92. #  User...攻击使用者的单位(敌人)。在对象组中填入“user”可以指定该单位做对象。
  93. #  Item...攻击单位所使用的技能。
  94. #  此外,受到伤害之后还能调用“dmg(:hp)”等变量获得伤害量,
  95. #
  96. #  例子2:
  97. #  Ask[10] = { '时机' => '受伤前',
  98. #              '范围' => 'user' }
  99. #      => 对攻击单位使用技能10号反击。
  100. #  Ask[11] = { '时机' => '受伤后',
  101. #              '条件' => 'dmg(:hp) >= 20' }
  102. #      => 受到20HP以上的伤害时发动(限伤害后)。
  103. #
  104. #  其他方法(限定在受伤后使用):
  105. #    dmg( )    => 获取伤害量,括号中填入种类“:hp”,“:mp”或“:tp”
  106. #    drn( )    => 获取吸收量,括号中填入“:hp”或“:mp”
  107. #    missed?   => 是否击中(输出true/false)
  108. #    evaded?   => 是否被回避(输出true/false)
  109. #    critical? => 是否暴击成功(输出true/false)
  110. #
  111. #
  112. #  ■【追加定义:party/troop/allies/oppons】
  113. #  为了方便输入简化了队伍与敌群的变量名。
  114. #
  115. #  party    => 获取玩家队伍(数组)
  116. #  party(1) => 获取队伍中首位的角色(角色)
  117. #  troop    => 获取全体敌群(数组)
  118. #  troop(1) => 获取1号敌人(敌人)
  119. #
  120. #  allies    => 获取使用者的同伴,角色的场合玩家队伍,敌人的场合敌群
  121. #  allies(1) => 获取同伴1号
  122. #  oppons    => 获取使用者的对手,角色的场合敌群,敌人的场合玩家队伍
  123. #  oppons(1) => 获取对手1号
  124. #
  125. #
  126. #  ■【追加定义:last_act】
  127. #  获取玩家输入的行动指令,玩家在游戏中输入攻击行动,可以通过此方法获取。
  128. #  注意获取的是行动而不是技能(道具的使用也是行动)。
  129. #  只有重新输入行动后才会更新,因此会保留到下次战斗。
  130. #  因为这个行动不会被执行所以没有修改的意义。
  131. #  具体参考Game_Action。
  132. #
  133. #  方法预览:
  134. #  last_act.attack?     => 是否普通攻击(true/false)
  135. #  last_act.guard?      => 是否防御(true/false)
  136. #
  137. #  last_act.skill?      => 是否技能(true/false)
  138. #  last_act.skill?(id)  => 是否为id号技能(true/false)
  139. #
  140. #  last_act.item?       => 是否道具(true/false)
  141. #  last_act.item?(id)   => 是否为id号道具(true/false)
  142. #
  143. #  last_act.valid?      => 判断角色是否可以执行该行动(true/false)
  144. #  last_act.item        => 获取行动的技能或使用道具(对象物品)
  145. #
  146. #------------------------------------------------------------------------------
  147. #
  148. # ▼ 地图发动的自发技能
  149. #    使用【 Msk[ID] = { '参数名' => '算法' (用','分开) } 】
  150. #    注意参数与战斗用的设置不一定相同。
  151. #
  152. #  频率...发动频率,玩家每行走此数值的步数使用1次。不填入不会发动。
  153. #         默认系统中20步会算作1回合(参考用)。
  154. #  条件...同战斗设置。
  155. #  范围...同战斗设置。注意在地图上不存在$game_troop。
  156. #  显示...是否显示使用消息,填入true会弹出对话框,否则无任何提示。
  157. #
  158. #==============================================================================
  159. module AutoSkill; Ask, Msk = {}, {}
  160. #==============================================================================
  161. # ● 请在这里填写技能设置;没有填写限制。
  162. #==============================================================================






  163. #------------------------------------------------------------------------------
  164. end # Do not remove
  165. #==============================================================================
  166. # ▼ 脚本内容:不可编辑
  167. #==============================================================================
  168. class Game_Battler < Game_BattlerBase
  169.   #--------------------------------------------------------------------------
  170.   include AutoSkill
  171.   Ask.each_value {|s| s.default = ''}
  172.   Msk.each_value {|s| s.default = ''}
  173.   
  174.   # NewMethods: 追加简易定义
  175.   def party(n = nil)
  176.     return $game_party.members unless n
  177.     return $game_party.members[n] end
  178.   def troop(n = nil)
  179.     return $game_troop.members unless n
  180.     return $game_troop.members[n] end
  181.   def allies(n = nil)
  182.     return party(n) if actor?
  183.     return troop(n) if enemy?; end
  184.   def oppons(n = nil)
  185.     return party(n) if enemy?
  186.     return troop(n) if actor?; end
  187.    
  188.   def dmg(type = :hp); eval "@result_log.#{type.to_s}_damage" end
  189.   def drn(type = :hp); eval "@result_log.#{type.to_s}_drain" end
  190.   def missed?;   @result_log.missed end
  191.   def evaded?;   @result_log.evaded end
  192.   def critical?; @result_log.critical end
  193.    
  194.   def user; @attack_user end
  195.   def item; @attack_item end
  196.   def last
  197.     return allies(last_act.target_index) if last_act.item.for_friend?
  198.     return oppons(last_act.target_index) if last_act.item.for_opponent?
  199.   end
  200.   
  201.   # NewMethod: 最后一个主要行动
  202.   def last_act; @last_act; end
  203.   def set_last_action
  204.     @last_act = current_action if !current_action.is_a? Game_AutoAction
  205.   end
  206.   # AliasMethod: 记录战斗结果
  207.   attr_reader :result_log
  208.   def set_result_log
  209.     @result_log = @result.clone end
  210.   # AliasMethod: 初始化
  211.   alias :initialize_ask :initialize
  212.   def initialize; initialize_ask
  213.     @last_act = Game_Action.new(self)
  214.     @result_log = Game_ActionResult.new(self) end
  215.   
  216.   # NewMethod: 自发技能处理
  217.   def proc_auto_skill(timing = nil, user = nil, item = nil)
  218.     return unless SceneManager.scene_is?(Scene_Battle)
  219.     @attack_user, @attack_item = user, item
  220.     Ask.each {|i, v| skill = $data_skills[i]
  221.       next unless skills.include?(skill)
  222.       set_auto_skill(i, v, timing)}
  223.   end
  224.   
  225.   # NewMethod: 自发技能设置
  226.   def set_auto_skill(i, v, t)
  227.     return unless v['时机'].empty? or v['时机'].split(',').map{|s|s.strip}.include?(t)
  228.     return unless v['几率'].empty? or eval(v['几率']).to_i > rand(100)
  229.     return unless v['条件'].empty? or eval(v['条件'])
  230.     action = Game_AutoAction.new(self, eval(v['强制']), i)
  231.     unless make_auto_targets(action, v['范围']).empty?
  232.       @actions.insert(0, action)
  233.       BattleManager.autoskill_users.push(self)
  234.   end end
  235.   
  236.   # NewMethod: 设置行动对象
  237.   def make_auto_targets(action, scope)
  238.     if !scope.empty?; scope = scope.split(',')
  239.       unit = []; scope.shift.split(' ').each_with_index{|s, i|
  240.         @oper = '+' unless @oper; if i % 2 == 1; @oper = s; next end
  241.         unit.push(eval(s)) if @oper['+']
  242.         unit.reject!{|bat| [eval(s)].flatten.include?(bat)} if @oper['-']
  243.         unit.flatten!}; remove_instance_variable :@oper
  244.       if requir = scope.reject{|s| s[/max|min/]}[0]; unit.select!{|member|
  245.         a, b, v = self, member, $game_variables; eval requir}; end
  246.       if prior = scope.find{|s| s[/max|min/]}; prior = prior.split(':').map{|s|s.strip}
  247.         unit = unit.sort_by(&prior[1].to_sym); n = eval(prior[2]) rescue n = 1
  248.         unit = unit.first(n) if prior[0]['min']
  249.         unit = unit.last(n)  if prior[0]['max']
  250.       end end
  251.     return action.auto_targets = unit if unit
  252.     return action.auto_targets = [:rand]
  253.   end
  254.   
  255.   # NewMethod: 地图技能
  256.   def proc_map_skill
  257.     return unless SceneManager.scene_is?(Scene_Map)
  258.     Msk.each {|i, v| skill = $data_skills[i]
  259.       h = {}; v.each {|i, v| h[i] = v.split(',').map{|s| s.strip}}
  260.       next unless skills.include?(skill)
  261.       next unless usable?(skill)
  262.       next unless h['步数'].empty? or $game_party.steps % eval(h['步数']) == 0
  263.       next unless h['条件'].empty? or eval(h['条件'])
  264.       pay_skill_cost(skill)
  265.       item.effects.each {|effect| item_global_effect_apply(effect)} if
  266.         eval(h['消息'])
  267.       make_auto_targets(action, h['范围']).each {|target|
  268.         skill.repeats.times {target.item_apply(self, skill)}}}
  269.   end
  270.   #--------------------------------------------------------------------------
  271. end
  272. #==============================================================================
  273. class Game_Actor < Game_Battler
  274.   #--------------------------------------------------------------------------
  275.   # AliasMethod: 地图画面上回合结束的处理
  276.   alias :turn_end_on_map_ask :turn_end_on_map
  277.   def turn_end_on_map; turn_end_on_map_ask
  278.     proc_map_skill end
  279.   #--------------------------------------------------------------------------
  280. end
  281. #==============================================================================
  282. class Game_Enemy < Game_Battler
  283.   #--------------------------------------------------------------------------
  284.   # NewMethod: 获取技能实例的数组
  285.   def skills
  286.     added_skills.sort.collect {|id| $data_skills[id] }
  287.   end
  288.   #--------------------------------------------------------------------------
  289. end
  290. #==============================================================================
  291. class Game_Action
  292.   #--------------------------------------------------------------------------
  293.   # 判断用定义
  294.   def guard?; item == $data_skills[subject.guard_skill_id] end
  295.   def skill?(id = 0)
  296.     return item == $data_skills[id] if id > 0
  297.     return item.is_a?(RPG::Skill) end
  298.   def item?(id = 0)
  299.     return item == $data_items[id] if id > 0
  300.     return item.is_a?(RPG::Item) end
  301.   #--------------------------------------------------------------------------
  302. end
  303. #==============================================================================
  304. class Game_AutoAction < Game_Action
  305.   #--------------------------------------------------------------------------
  306.   attr_accessor :auto_action
  307.   attr_accessor :auto_targets
  308.   
  309.   # 初始化对象
  310.   def initialize(subject, forcing, skill_id)
  311.     super(subject, forcing)
  312.     set_skill(skill_id) end
  313.    
  314.   # 清除
  315.   def clear; super
  316.     @auto_action = false
  317.     @auto_targets = [] end

  318.   # 生成目标数组
  319.   def make_targets
  320.     return super if @auto_targets.include?(:rand)
  321.     return @auto_targets end
  322.    
  323.   # 目标为队友
  324.   def targets_for_friends
  325.     @target_index = rand(subject.friends_unit.members.size) if
  326.       @auto_targets.include?(:rand)
  327.     super end
  328.   #--------------------------------------------------------------------------
  329. end
  330. #==============================================================================
  331. class Scene_Battle < Scene_Base
  332.   #--------------------------------------------------------------------------
  333.   # AliasMethod: 更新画面
  334.   alias :update_ask :update
  335.   def update; update_ask
  336.     BattleManager.terminate unless process_autoskill
  337.   end
  338.   
  339.   # AliasMethod: 开始队伍指令的选择
  340.   alias :start_party_command_selection_ask :start_party_command_selection
  341.   def start_party_command_selection
  342.     return if BattleManager.judge_win_loss
  343.     start_party_command_selection_ask
  344.   end
  345.   
  346.   # AliasMethod: 回合开始
  347.   alias :turn_start_ask :turn_start
  348.   def turn_start; turn_start_ask
  349.     all_battle_members.each {|battler| battler.set_last_action}
  350.     check_auto_skills(all_battle_members, '回合开始')
  351.   end
  352.   
  353.   # AliasMethod: 回合结束
  354.   alias :turn_end_ask :turn_end
  355.   def turn_end
  356.     check_auto_skills(all_battle_members, '回合结束')
  357.     turn_end_ask end
  358.   
  359.   # OverWrite: 处理战斗行动
  360.   def process_action
  361.     return if scene_changing?
  362.     if !@subject || !@subject.current_action
  363.       @subject = BattleManager.next_subject end
  364.     return turn_end unless @subject
  365.     return unless @subject
  366.     check_auto_skills([@subject], '行动前')
  367.     process_action_b
  368.     process_action_end unless @subject.current_action
  369.     check_auto_skills([@subject], '行动后')
  370.   end
  371.    
  372.   # NewMethod: 处理战斗行动
  373.   def process_action_b
  374.     if @subject.current_action
  375.       @subject.current_action.prepare
  376.       if @subject.current_action.valid?
  377.         @status_window.open
  378.         execute_action
  379.       end
  380.       @subject.remove_current_action
  381.     end
  382.   end
  383.   
  384.   # NewMethod: 处理自动技能
  385.   def process_autoskill
  386.     return false if BattleManager.autoskill_users.empty?
  387.     @log_window.wait
  388.     last_subject = @subject if @subject
  389.     @subject = BattleManager.autoskill_users.shift
  390.     @using_auto_skill = true
  391.     process_action_b
  392.     @subject = last_subject if last_subject
  393.     @using_auto_skill = false
  394.     return true
  395.   end
  396.   
  397.   # AliasMethod: 使用技能/物品
  398.   alias :use_item_ask :use_item
  399.   def use_item
  400.     if @using_auto_skill
  401.       use_item_ask
  402.     else; use_item_no_autoskill end
  403.   end
  404.    
  405.   # NewMethod: 使用非自发技能/物品
  406.   def use_item_no_autoskill
  407.     item = @subject.current_action.item
  408.     @log_window.display_use_item(@subject, item)
  409.     @subject.use_item(item)
  410.     refresh_status
  411.     targets = @subject.current_action.make_targets.compact
  412.     show_animation(targets, item.animation_id)
  413.     check_auto_skills(targets, '受伤前', @subject, item)
  414.     targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  415.     check_auto_skills(targets, '受伤后', @subject, item)
  416.   end
  417.   
  418.   # AliasMethod: 应用技能/物品效果
  419.   alias :apply_item_effects_ask :apply_item_effects
  420.   def apply_item_effects(target, item)
  421.     apply_item_effects_ask(target, item)
  422.     target.set_result_log
  423.   end
  424.   
  425.   # NewMethod: 使用自发技能
  426.   def check_auto_skills(subjects = [], *args)
  427.     subjects.each {|subject| subject.proc_auto_skill(*args) if subject}
  428.     while process_autoskill
  429.   end end
  430.   #--------------------------------------------------------------------------
  431. end
  432. #==============================================================================
  433. module BattleManager
  434.   #--------------------------------------------------------------------------
  435.   class << self
  436.     alias :battle_start_ask :battle_start
  437.     alias :on_encounter_ask :on_encounter; end
  438.    
  439.   # AliasMethod: 战斗开始
  440.   def self.battle_start
  441.     @battle_result = nil
  442.     battle_start_ask
  443.     SceneManager.scene.check_auto_skills($game_party.members+$game_troop.members, '战斗开始')
  444.     on_encounter_ask
  445.     if @preemptive
  446.       $game_message.add(sprintf(Vocab::Preemptive, $game_party.name))
  447.     elsif @surprise
  448.       $game_message.add(sprintf(Vocab::Surprise, $game_party.name))
  449.     end
  450.     wait_for_message
  451.   end
  452.   
  453.   # AliasMethod: 遇敌时的处理
  454.   def self.on_encounter; end
  455.   
  456.   # OverWrite: 胜利时的处理
  457.   def self.process_victory
  458.     play_battle_end_me
  459.     replay_bgm_and_bgs
  460.     $game_message.add(sprintf(Vocab::Victory, $game_party.name))
  461.     display_exp
  462.     gain_gold
  463.     gain_drop_items
  464.     gain_exp
  465.     battle_end(0)
  466.     return true
  467.   end
  468.   
  469.   # OverWrite: 中止时的处理
  470.   def self.process_abort
  471.     replay_bgm_and_bgs
  472.     battle_end(1)
  473.     return true
  474.   end
  475.   
  476.   # OverWrite: 全灭时的处理
  477.   def self.process_defeat
  478.     $game_message.add(sprintf(Vocab::Defeat, $game_party.name))
  479.     wait_for_message
  480.     replay_bgm_and_bgs if @can_lose
  481.     battle_end(2)
  482.     return true
  483.   end
  484.   
  485.   # OverWrite: 战斗结束 > 结果(0:胜利 1:撤退 2:全灭)
  486.   def self.battle_end(result)
  487.     @phase = nil
  488.     @battle_result = result
  489.     $game_party.on_battle_end
  490.     $game_troop.on_battle_end
  491.     SceneManager.scene.check_auto_skills($game_party.members, '战斗结束')
  492.   end
  493.   
  494.   # NewMethod: 退出管理器
  495.   def self.terminate
  496.     return unless @battle_result
  497.     revive_battle_members if @battle_result == 2 && @can_lose
  498.     @event_proc.call(@battle_result) if @event_proc
  499.     SceneManager.return
  500.     SceneManager.goto(Scene_Gameover) if @battle_result == 2 && !@can_lose
  501.     SceneManager.exit if $BTEST
  502.   end
  503.   
  504.   # NewMethod: 自发技能行动列表
  505.   def self.autoskill_users
  506.     @autoskill_users ||= []
  507.     @autoskill_users.each {|battler| battler.make_speed }
  508.     @autoskill_users.sort! {|a,b| b.speed - a.speed }
  509.     return @autoskill_users
  510.   end
  511.   #--------------------------------------------------------------------------
  512. end
  513. #==============================================================================
  514. # ▼ END
  515. #==============================================================================
复制代码
[/fold]

脚本应用:
在这里让我向大家展示一种并不包括在原本构思的用法:设置拥有每次行动前,25%几率无法行动的麻痹状态。不知道有没有人玩口袋,因为默认系统无法制作这样的状态略有些遗憾,果然还是觉得“麻痹就应该是这个样子的”。
方法是设置2个麻痹状态A、B与1个麻痹专用技能。先获得本身没有效果的麻痹A,但带有添加“麻痹技能”的特性。麻痹技能则是行动前有25的几率发动,会对使用者自己附加麻痹B状态。麻痹B就是无法行动的状态,设置效果1回合。这样在麻痹A持续的期间,每次行动前会有25%的几率无法行动(不包括自发技能的行动)。
[fold=麻痹状态]

麻痹状态

麻痹状态

麻痹状态B(幽灵状态)

麻痹状态B(幽灵状态)

麻痹技能(幽灵技能)

麻痹技能(幽灵技能)
[/fold]

麻痹麻痹的好像一直在说脏话……
像一开始说的一样,应用方法超出了预期的功能也让我吃了一惊!以上只是提供一个思路,说不定还有很多不同类型的用法。
另外想要关闭技能,可以让装备附加自发技能来达到这样的效果。

兼容性问题:
兼容性问题就请自力,脚本里面都标注了哪些内容是覆盖式的写法(搜索OverWright)




这次大概会是最后一次更新……大概。有bug请留言或通知我。

点评

严重BUG,死后要么无限技能,要么卡机  发表于 2017-1-23 17:30

评分

参与人数 9星屑 +560 收起 理由
lsu666666 + 300 精品文章
MOONLIT + 40 精品文章
阿薩男爵 + 15 塞糖
jianyulei + 20 精品文章
dorx2010 + 40 我很赞同
♂雨 + 15 精品文章
柳岳枫 + 90 精品文章
tan12345 + 20 好东西,收了。
3106345123 + 20 删除线是 [s][/s] 哦

查看全部评分

「私が来た!  私が見た!  ならば次わ買つだけのこと!」
梦石
0
星屑
723
在线时间
530 小时
注册时间
2010-6-9
回帖
668
发表于 2015-8-19 09:45:20 | 显示全部楼层
2) 使用者必须学会该技能。
这点,如果想做个全技能都可以触发的游戏,那个技能列表有点长。按我的想法,这些概率的“意外的行动”是出乎自己预料的,没办法掌控的,没学习过也是正常。
回复

使用道具 举报

梦石
0
星屑
80
在线时间
132 小时
注册时间
2014-5-7
回帖
143
 楼主| 发表于 2015-8-19 17:08:24 | 显示全部楼层
负零 发表于 2015-8-19 02:45
2) 使用者必须学会该技能。
这点,如果想做个全技能都可以触发的游戏,那个技能列表有点长。按我的想法, ...

“意外的行动”应该会很有趣,但全技能都能发动会有些夸张吧……像是战士不可能突然会扔一发火球一样(至少不是所有的战士都可以)

其实说是学会,只需要在技能数组里面有那个技能就足够了,可以不让玩家看到,这样也更方便控制哪些角色会进行哪些“意外的行动”。

点评

正解。  发表于 2015-8-20 16:56
「私が来た!  私が見た!  ならば次わ買つだけのこと!」
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-8-22 10:44:38 | 显示全部楼层
目标随机决定?想要自己决定是上一个目标还是随即目标呢?


@寒冷魔王 的看法?

点评

嘛,我也不是很清楚,总之加油  发表于 2015-8-22 12:19
那个我知道啊···一开始我还想动那个地方,然后发现动了好像也没什么效果···  发表于 2015-8-22 12:16
我是说脚本的位置,看看rand在哪个函数中,起到什么作用  发表于 2015-8-22 11:46
位置?不是看id吗···  发表于 2015-8-22 11:13
其实,你想看看是不是随机,搜一下rand就行,没有就是不随机,有的话看看位置判断一下  发表于 2015-8-22 11:02
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
80
在线时间
132 小时
注册时间
2014-5-7
回帖
143
 楼主| 发表于 2015-8-22 15:00:50 | 显示全部楼层
chd114 发表于 2015-8-22 03:44
目标随机决定?想要自己决定是上一个目标还是随即目标呢?

单纯是个人觉得因为是自动行动所以让玩家决定对象目标不自然。也想过可以获取满足特定条件的目标,但在使用者控制的方面上还有问题,基本上也不过是个构思而已。
「私が来た!  私が見た!  ならば次わ買つだけのこと!」
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-8-25 13:48:02 | 显示全部楼层
Silentever 发表于 2015-8-21 22:00
单纯是个人觉得因为是自动行动所以让玩家决定对象目标不自然。也想过可以获取满足特定条件的目标,但在使 ...

这和我正在做的持续施法与施法延迟以及T君的一个延迟生效有一些共同之处···

不过麻痹那个我还是没太看明白···VA的技能使用效果里面的附加状态不就是可以设定几率的吗···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-8-25 13:48:36 | 显示全部楼层
Silentever 发表于 2015-8-21 22:00
单纯是个人觉得因为是自动行动所以让玩家决定对象目标不自然。也想过可以获取满足特定条件的目标,但在使 ...

这和我正在做的持续施法与施法延迟以及T君的一个延迟生效有一些共同之处···

不过麻痹那个我还是没太看明白···VA的技能使用效果里面的附加状态不就是可以设定几率的吗···

点评

那是使用技能附加状态,但没有状态附加状态的办法。实际上想象中的麻痹是每次行动都有25%几率当机←这样的感觉。  发表于 2015-8-26 01:07
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-8-25 15:00:33 | 显示全部楼层
本帖最后由 chd114 于 2015-8-24 22:01 编辑

  1.   end; def on_turn_start; super# - 回合开始 - 回合开始前使用的技能
  2. $game_actors[1].auto_skill(80)
  3. $game_actors[2].auto_skill(85)
复制代码
发现了BUG,这样做的话,两个角色会各自发动两次(当队伍里只有两个角色时)

点评

这个部分是Game_Actor里面,会对每个角色进行一次处理,默认是直接拿当下的角色做使用者,上面这样的写法会变成成员数相当的次数。  发表于 2015-8-26 01:23
写上的只要auto_skill,不需要指定任何对象,写上一次可以让所有学会那个技能的人用,另一方面写上2次就能让每个人用2次。  发表于 2015-8-26 01:09
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
92
在线时间
468 小时
注册时间
2011-9-1
回帖
364
发表于 2015-9-11 14:55:58 | 显示全部楼层
你这个脚本解决的我一个大难题,好赞!
男人不懂永远月经的痛,就像女人永远不懂蛋疼的痛
回复

使用道具 举报

梦石
0
星屑
92
在线时间
468 小时
注册时间
2011-9-1
回帖
364
发表于 2015-9-11 15:04:11 | 显示全部楼层
发现个BUG,如果技能是消耗特技值发动,那将无效。

点评

以修复,顺便也更新了  发表于 2015-9-12 08:39
男人不懂永远月经的痛,就像女人永远不懂蛋疼的痛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部