Project1
标题:
关于Taroxd使用目标扩展脚本
[打印本页]
作者:
青茗
时间:
2017-2-16 14:01
标题:
关于Taroxd使用目标扩展脚本
Taroxd使用目标扩展脚本已在下方列举。
我希望会脚本的人能多给我举一些该脚本的相关例子。
就像
例1:存活队员中 hp 最小者。
<target>
select: alive?
min_by: hp_rate
</target>
这种例子即可。
万分感谢。
#--------------------------------------------------------------------------
# ● require Taroxd基础设置
# 设置技能、物品的使用目标。
#--------------------------------------------------------------------------
#
# 使用方法:
# 在技能/物品的备注栏写下类似于下面例子的备注。
# 备注后,若效果范围为单体,则我方选择目标时只能从设置的目标中选择,
# 敌人使用技能时随机选择其中一个。
# 若效果范围为全体,则目标就是设置的目标。
# 若效果范围为随机目标,则从设置的目标中随机选出指定的个数。
#
# 该脚本不影响菜单中使用技能/物品。
#
# 用 a 指代使用者,b 或 self 指代目标。
#
# 例1:存活队员中 hp 最小者。
# <target>
# select: alive?
# min_by: hp_rate
# </target>
#
# 例2:所有 hp 大于 50 的队员
# <target>
# select: hp > 50
# </target>
#
# 例3:除自己之外的全体队友
# <target>
# select: alive? && b != a
# </target>
#
# 例4:无视生死
# <target></target>
#
#--------------------------------------------------------------------------
# 模块方法用于解析备注栏中的备注
# 实例方法用于战斗中技能目标的选择
module Taroxd::TargetExt
RE_OUTER = /<target>(.*?)<\/target>/mi # 整体设置
SEPARATOR = ':' # 每一行中的分隔符
# 实例方法,用于选择目标的窗口中
# 返回可以选择的所有目标
def targets_to_select
[]
end
# 返回设置的目标
# 若 actor 未初始化,或没有设置目标,返回 nil
def selectable_targets
actor = BattleManager.actor
return unless actor
item = actor.input.item
return unless item
item.get_targets(actor, targets_to_select)
end
# 由于父类可能未定义,不调用 super
def enable?(battler)
!selectable_targets || selectable_targets.include?(battler)
end
def current_item_enabled?
super && enable?(targets_to_select[index])
end
# 模块方法,用于读取备注
def self.parse_note(note)
note =~ RE_OUTER ? parse_settings($1) : false
end
private
# lambda do |battlers, a|
# battlers.select { |b| b.instance_eval { alive? && b != a } }
# end
def self.parse_settings(settings)
eval %(
lambda do |battlers, a|
battlers#{extract_settings(settings)}
end
)
end
def self.extract_settings(settings)
settings.each_line.map { |line|
method, _, block = line.partition(SEPARATOR).map(&:strip)
if method.empty?
''
elsif block.empty?
".#{method}"
else
".#{method} { |b| b.instance_eval { #{block} } }"
end
}.join
end
end
class RPG::UsableItem < RPG::BaseItem
# 缓存并返回生成的 lambda。
# 如果不存在,返回 nil。
def get_target_lambda
@get_target = Taroxd::TargetExt.parse_note(@note) if @get_target.nil?
@get_target if @get_target
end
# 返回目标的数组。a:使用者。
# 如果没有设置,返回 nil。
def get_targets(a, battlers = nil)
return unless get_target_lambda
battlers ||= (for_friend? ? a.friends_unit : a.opponents_unit).members
Array(get_target_lambda.call(battlers, a))
end
end
class Game_Action
def_chain :targets_for_opponents do |old|
targets = item.get_targets(@subject)
if !targets
old.call
elsif item.for_random?
Array.new(item.number_of_targets) { random_target(targets) }
elsif item.for_one?
num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
target = if @target_index < 0
random_target(targets)
else
eval_smooth_target(opponents_unit, @target_index)
end
Array.new(num, target)
else
targets
end
end
def_chain :targets_for_friends do |old|
targets = item.get_targets(@subject)
if !targets
old.call
elsif item.for_user?
[subject]
else
if item.for_one?
if @target_index < 0
[random_target(targets)]
else
[eval_smooth_target(friends_unit, @target_index)]
end
else
targets
end
end
end
private
def eval_smooth_target(unit, index)
unit[index] || unit[0]
end
def random_target(targets)
tgr_rand = rand * targets.sum(&:tgr)
targets.each do |target|
tgr_rand -= target.tgr
return target if tgr_rand < 0
end
targets.first
end
end
class Game_BattlerBase
# 如果设置了目标,必须存在目标才可使用
def_and :usable_item_conditions_met? do |item|
targets = item.get_targets(self)
!targets || !targets.empty?
end
end
class Game_Battler < Game_BattlerBase
# 如果设置了目标,删除是否死亡的测试
def_chain :item_test do |old, user, item|
if item.get_target_lambda
return true if $game_party.in_battle
return true if item.for_opponent?
return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
return true if item_has_any_valid_effects?(user, item)
false
else
old.call(user, item)
end
end
end
class Window_BattleActor < Window_BattleStatus
include Taroxd::TargetExt
def targets_to_select
$game_party.battle_members
end
def draw_actor_name(actor, x, y, width = 112)
change_color(hp_color(actor), enable?(actor))
draw_text(x, y, width, line_height, actor.name)
end
end
class Window_BattleEnemy < Window_Selectable
include Taroxd::TargetExt
def targets_to_select
$game_troop.alive_members
end
def draw_item(index)
enemy = $game_troop.alive_members[index]
change_color(normal_color, enable?(enemy))
name = enemy.name
draw_text(item_rect_for_text(index), name)
end
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