Project1

标题: 关于Taroxd使用目标扩展脚本 [打印本页]

作者: 青茗    时间: 2017-2-16 14:01
标题: 关于Taroxd使用目标扩展脚本
Taroxd使用目标扩展脚本已在下方列举。
我希望会脚本的人能多给我举一些该脚本的相关例子。
就像
                     例1:存活队员中 hp 最小者。
                   <target>
                        select: alive?
                        min_by: hp_rate
                   </target>
这种例子即可。
万分感谢。




  1. #--------------------------------------------------------------------------
  2. # ● require Taroxd基础设置
  3. #    设置技能、物品的使用目标。
  4. #--------------------------------------------------------------------------
  5. #
  6. # 使用方法:
  7. #   在技能/物品的备注栏写下类似于下面例子的备注。
  8. #   备注后,若效果范围为单体,则我方选择目标时只能从设置的目标中选择,
  9. #     敌人使用技能时随机选择其中一个。
  10. #   若效果范围为全体,则目标就是设置的目标。
  11. #   若效果范围为随机目标,则从设置的目标中随机选出指定的个数。
  12. #
  13. #   该脚本不影响菜单中使用技能/物品。
  14. #
  15. #   用 a 指代使用者,b 或 self 指代目标。
  16. #
  17. #   例1:存活队员中 hp 最小者。
  18. #   <target>
  19. #     select: alive?
  20. #     min_by: hp_rate
  21. #   </target>
  22. #
  23. #   例2:所有 hp 大于 50 的队员
  24. #   <target>
  25. #     select: hp > 50
  26. #   </target>
  27. #
  28. #   例3:除自己之外的全体队友
  29. #   <target>
  30. #     select: alive? && b != a
  31. #   </target>
  32. #
  33. #   例4:无视生死
  34. #   <target></target>
  35. #
  36. #--------------------------------------------------------------------------

  37. # 模块方法用于解析备注栏中的备注
  38. # 实例方法用于战斗中技能目标的选择
  39. module Taroxd::TargetExt

  40.   RE_OUTER = /<target>(.*?)<\/target>/mi # 整体设置
  41.   SEPARATOR = ':'                        # 每一行中的分隔符

  42.   # 实例方法,用于选择目标的窗口中

  43.   # 返回可以选择的所有目标
  44.   def targets_to_select
  45.     []
  46.   end

  47.   # 返回设置的目标
  48.   # 若 actor 未初始化,或没有设置目标,返回 nil
  49.   def selectable_targets
  50.     actor = BattleManager.actor
  51.     return unless actor
  52.     item = actor.input.item
  53.     return unless item
  54.     item.get_targets(actor, targets_to_select)
  55.   end

  56.   # 由于父类可能未定义,不调用 super
  57.   def enable?(battler)
  58.     !selectable_targets || selectable_targets.include?(battler)
  59.   end

  60.   def current_item_enabled?
  61.     super && enable?(targets_to_select[index])
  62.   end

  63.   # 模块方法,用于读取备注

  64.   def self.parse_note(note)
  65.     note =~ RE_OUTER ? parse_settings($1) : false
  66.   end

  67.   private

  68.   # lambda do |battlers, a|
  69.   #   battlers.select { |b| b.instance_eval { alive? && b != a } }
  70.   # end
  71.   def self.parse_settings(settings)
  72.     eval %(
  73.       lambda do |battlers, a|
  74.         battlers#{extract_settings(settings)}
  75.       end
  76.     )
  77.   end

  78.   def self.extract_settings(settings)
  79.     settings.each_line.map { |line|
  80.       method, _, block = line.partition(SEPARATOR).map(&:strip)
  81.       if method.empty?
  82.         ''
  83.       elsif block.empty?
  84.         ".#{method}"
  85.       else
  86.         ".#{method} { |b| b.instance_eval { #{block} } }"
  87.       end
  88.     }.join
  89.   end

  90. end

  91. class RPG::UsableItem < RPG::BaseItem

  92.   # 缓存并返回生成的 lambda。
  93.   # 如果不存在,返回 nil。
  94.   def get_target_lambda
  95.     @get_target = Taroxd::TargetExt.parse_note(@note) if @get_target.nil?
  96.     @get_target if @get_target
  97.   end

  98.   # 返回目标的数组。a:使用者。
  99.   # 如果没有设置,返回 nil。
  100.   def get_targets(a, battlers = nil)
  101.     return unless get_target_lambda
  102.     battlers ||= (for_friend? ? a.friends_unit : a.opponents_unit).members
  103.     Array(get_target_lambda.call(battlers, a))
  104.   end

  105. end

  106. class Game_Action

  107.   def_chain :targets_for_opponents do |old|
  108.     targets = item.get_targets(@subject)
  109.     if !targets
  110.       old.call
  111.     elsif item.for_random?
  112.       Array.new(item.number_of_targets) { random_target(targets) }
  113.     elsif item.for_one?
  114.       num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
  115.       target = if @target_index < 0
  116.         random_target(targets)
  117.       else
  118.         eval_smooth_target(opponents_unit, @target_index)
  119.       end
  120.       Array.new(num, target)
  121.     else
  122.       targets
  123.     end
  124.   end

  125.   def_chain :targets_for_friends do |old|
  126.     targets = item.get_targets(@subject)
  127.     if !targets
  128.       old.call
  129.     elsif item.for_user?
  130.       [subject]
  131.     else
  132.       if item.for_one?
  133.         if @target_index < 0
  134.           [random_target(targets)]
  135.         else
  136.           [eval_smooth_target(friends_unit, @target_index)]
  137.         end
  138.       else
  139.         targets
  140.       end
  141.     end
  142.   end

  143.   private

  144.   def eval_smooth_target(unit, index)
  145.     unit[index] || unit[0]
  146.   end

  147.   def random_target(targets)
  148.     tgr_rand = rand * targets.sum(&:tgr)
  149.     targets.each do |target|
  150.       tgr_rand -= target.tgr
  151.       return target if tgr_rand < 0
  152.     end
  153.     targets.first
  154.   end
  155. end

  156. class Game_BattlerBase
  157.   # 如果设置了目标,必须存在目标才可使用
  158.   def_and :usable_item_conditions_met? do |item|
  159.     targets = item.get_targets(self)
  160.     !targets || !targets.empty?
  161.   end
  162. end

  163. class Game_Battler < Game_BattlerBase
  164.   # 如果设置了目标,删除是否死亡的测试
  165.   def_chain :item_test do |old, user, item|
  166.     if item.get_target_lambda
  167.       return true if $game_party.in_battle
  168.       return true if item.for_opponent?
  169.       return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
  170.       return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
  171.       return true if item_has_any_valid_effects?(user, item)
  172.       false
  173.     else
  174.       old.call(user, item)
  175.     end
  176.   end
  177. end

  178. class Window_BattleActor < Window_BattleStatus

  179.   include Taroxd::TargetExt

  180.   def targets_to_select
  181.     $game_party.battle_members
  182.   end

  183.   def draw_actor_name(actor, x, y, width = 112)
  184.     change_color(hp_color(actor), enable?(actor))
  185.     draw_text(x, y, width, line_height, actor.name)
  186.   end
  187. end

  188. class Window_BattleEnemy < Window_Selectable

  189.   include Taroxd::TargetExt

  190.   def targets_to_select
  191.     $game_troop.alive_members
  192.   end

  193.   def draw_item(index)
  194.     enemy = $game_troop.alive_members[index]
  195.     change_color(normal_color, enable?(enemy))
  196.     name = enemy.name
  197.     draw_text(item_rect_for_text(index), name)
  198.   end

  199. end
复制代码

作者: 魔法丶小肉包    时间: 2017-2-16 15:12
本帖最后由 魔法丶小肉包 于 2017-2-16 15:46 编辑

以下例子未测试
例1:存活队员中 剩余hp 最小者
<target>
  select: alive?
  min_by: hp
</target>
例2:存活队员中 剩余hp 最大者
<target>
  select: alive?
  max_by: hp
</target>
例3:存活队员中 hp比例 最大者
<target>
  select: alive?
  max_by: hp_rate
</target>
例4:存活队员中 剩余mp 最大者
<target>
  select: alive?
  max_by: mp
</target>
例5:存活队员中 mp比例 最大者
<target>
  select: alive?
  max_by: mp_rate
</target>
例6:存活队员中 tp比例 最大者
<target>
  select: alive?
  max_by: tp_rate
</target>
例7:存活队员中 剩余tp 最大者
<target>
  select: alive?
  max_by: tp
</target>
例8:存活队员中 剩余mp 最小者
<target>
  select: alive?
  min_by: mp
</target>
例9:存活队员中 mp比例 最小者
<target>
  select: alive?
  min_by: mp_rate
</target>
例10:存活队员中 剩余tp 最小者
<target>
  select: alive?
  min_by: tp
</target>
例11:存活队员中 tp比例 最小者
<target>
  select: alive?
  min_by: tp_rate
</target>
例12:所有 mp 大于 100 的队员
<target>
  select: mp > 100
</target>
例13:所有 tp 大于 10 的队员
<target>
  select: tp > 10
</target>
例14:除自己之外的全体hp大于600的队友
<target>
  select: alive? && b != a && hp > 600
</target>
例15:除自己之外的全体hp小于600的队友(包括死亡)
<target>
  select: b != a && hp < 600
</target>
作者: 青茗    时间: 2017-2-16 15:49
魔法丶小肉包 发表于 2017-2-16 15:12
以下例子未测试
例1:存活队员中 剩余hp 最小者

谢谢了!
作者: jianyulei    时间: 2017-2-16 23:53
我只知道<target> sample(4) </target> 技能设置全体敌人,可以在全部敌人中随机选择4个打,至今也不知道脚本是如何判断sample这句的
作者: leungzero    时间: 2020-11-30 18:48
青茗 发表于 2017-2-16 15:49
谢谢了!

如果设置了目标,必须存在目标才可使用。这段代码是什么意思?请举例。
作者: leungzero    时间: 2020-11-30 18:55
本帖最后由 leungzero 于 2020-11-30 18:58 编辑
魔法丶小肉包 发表于 2017-2-16 15:12
以下例子未测试
例1:存活队员中 剩余hp 最小者


我想设定 “死亡队友中,持有某个技能者(比如叫 亡族领域)

脚本码怎么写?




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