module Taroxd end
module Taroxd::Eval
SCRIPT_ABBR_LIST = {
#--------------------------------------------------------------------------
# ● 导入本脚本后,在事件脚本/战斗公式中可以使用如下的简称。
#--------------------------------------------------------------------------
# 简称 全称
'V' => '$game_variables',
'S' => '$game_switches',
'N' => '$game_actors',
'A' => '$game_actors',
'P' => '$game_party',
'G' => '$game_party.gold',
'E' => '$game_troop'
#--------------------------------------------------------------------------
# 同时,对应的小写字母作为局部变量也是可用的。
# (a、v 在战斗公式中依然保持原本的意义)
# 因此,请不要拿这些大写字母单独作为常量或者方法名。
#--------------------------------------------------------------------------
# 脚本出错时,会得到更加精确的报错位置。
# 技能公式出错时不会掩盖错误(rescue)。
#--------------------------------------------------------------------------
# 将技能公式中的 self 设为了技能的目标。
#--------------------------------------------------------------------------
# 此外,在窗口中的信息里面,#{expression} 会被替换成表达式的值,
# 就和 ruby 中的双引号字符串一样。同时上述简称也是可用的。
# 但是,这个功能并不完整,因此请务必保证 expression 中的花括号{}成对出现。
# 像 #{'}'} 这样的表达式虽然 Ruby 里是可用的,但是这里不行。
# 如果想要禁用这个功能,请在#号前面打上反斜杠。如 \#{1} 会被替换为 #{1}
# 而 \\#{1} 会被替换为 \1
#--------------------------------------------------------------------------
}
#--------------------------------------------------------------------------
# ● 处理脚本用的正则表达式
#--------------------------------------------------------------------------
SCRIPT_ABBR_RE =
/(?<!::|\.)\b(?:#{SCRIPT_ABBR_LIST.keys.join('|')})\b(?! *[(@$\w])/
module_function
#--------------------------------------------------------------------------
# ● 对脚本的处理
#--------------------------------------------------------------------------
def process_script(script)
script.gsub(SCRIPT_ABBR_RE, SCRIPT_ABBR_LIST)
end
#--------------------------------------------------------------------------
# ● 执行脚本
#--------------------------------------------------------------------------
def eval(script, *args)
v = $game_variables
s = $game_switches
n = $game_actors
a = $game_actors
p = $game_party
g = $game_party.gold
e = $game_troop
script = process_script(script)
if args.empty?
instance_eval(script, __FILE__, __LINE__)
else
Kernel.eval(script, *args)
end
end
#--------------------------------------------------------------------------
# ● 混入模块
#--------------------------------------------------------------------------
Game_BattlerBase.send :include, self
Game_Character.send :include, self
Game_Interpreter.send :include, self
Window_Base.send :include, self
end
class RPG::UsableItem::Damage
#--------------------------------------------------------------------------
# ● 根据参数执行计算公式
#--------------------------------------------------------------------------
def eval(a, b, v)
value = Taroxd::Eval.eval(@formula, b.formula_binding(a, b, v))
value > 0 ? value * sign : 0
end
end
class Game_BattlerBase
#--------------------------------------------------------------------------
# ● 执行计算公式的环境
#--------------------------------------------------------------------------
def formula_binding(a, b, v)
s = $game_switches
n = $game_actors
p = $game_party
g = $game_party.gold
e = $game_troop
binding
end
end
class Window_Base < Window
#--------------------------------------------------------------------------
# ● 对 #{} 的处理
#--------------------------------------------------------------------------
alias convert_escape_characters_without_eval convert_escape_characters
def convert_escape_characters(text)
convert_escape_characters_without_eval(text)
.gsub(/\e?#(?<bracket>\{([^{}]|\g<bracket>)*\})/) do |code|
next code if code.slice!(0) == "\e"
eval(code[1..-2])
end
end
end