Project1

标题: 事件脚本偷懒大法,再也不怕脚本框太短了! [打印本页]

作者: taroxd    时间: 2014-2-21 21:27
标题: 事件脚本偷懒大法,再也不怕脚本框太短了!
本帖最后由 taroxd 于 2014-7-12 15:12 编辑

本脚本不适合事件党食用。

RUBY 代码复制
  1. module Taroxd end
  2.  
  3. module Taroxd::Eval
  4.   SCRIPT_ABBR_LIST = {
  5.   #--------------------------------------------------------------------------
  6.   # ● 导入本脚本后,在事件脚本/战斗公式中可以使用如下的简称。
  7.   #--------------------------------------------------------------------------
  8.   # 简称    全称
  9.     'V' => '$game_variables',
  10.     'S' => '$game_switches',
  11.     'N' => '$game_actors',
  12.     'A' => '$game_actors',
  13.     'P' => '$game_party',
  14.     'G' => '$game_party.gold',
  15.     'E' => '$game_troop'
  16.   #--------------------------------------------------------------------------
  17.   # 同时,对应的小写字母作为局部变量也是可用的。
  18.   # (a、v 在战斗公式中依然保持原本的意义)
  19.   # 因此,请不要拿这些大写字母单独作为常量或者方法名。
  20.   #--------------------------------------------------------------------------
  21.   # 脚本出错时,会得到更加精确的报错位置。
  22.   # 技能公式出错时不会掩盖错误(rescue)。
  23.   #--------------------------------------------------------------------------
  24.   # 将技能公式中的 self 设为了技能的目标。
  25.   #--------------------------------------------------------------------------
  26.   # 此外,在窗口中的信息里面,#{expression} 会被替换成表达式的值,
  27.   # 就和 ruby 中的双引号字符串一样。同时上述简称也是可用的。
  28.   # 但是,这个功能并不完整,因此请务必保证 expression 中的花括号{}成对出现。
  29.   # 像 #{'}'} 这样的表达式虽然 Ruby 里是可用的,但是这里不行。
  30.   # 如果想要禁用这个功能,请在#号前面打上反斜杠。如 \#{1} 会被替换为 #{1}
  31.   # 而 \\#{1} 会被替换为 \1
  32.   #--------------------------------------------------------------------------
  33.   }
  34.   #--------------------------------------------------------------------------
  35.   # ● 处理脚本用的正则表达式
  36.   #--------------------------------------------------------------------------
  37.   SCRIPT_ABBR_RE =
  38.     /(?<!::|\.)\b(?:#{SCRIPT_ABBR_LIST.keys.join('|')})\b(?! *[(@$\w])/
  39.   module_function
  40.   #--------------------------------------------------------------------------
  41.   # ● 对脚本的处理
  42.   #--------------------------------------------------------------------------
  43.   def process_script(script)
  44.     script.gsub(SCRIPT_ABBR_RE, SCRIPT_ABBR_LIST)
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 执行脚本
  48.   #--------------------------------------------------------------------------
  49.   def eval(script, *args)
  50.     v = $game_variables
  51.     s = $game_switches
  52.     n = $game_actors
  53.     a = $game_actors
  54.     p = $game_party
  55.     g = $game_party.gold
  56.     e = $game_troop
  57.     script = process_script(script)
  58.     if args.empty?
  59.       instance_eval(script, __FILE__, __LINE__)
  60.     else
  61.       Kernel.eval(script, *args)
  62.     end
  63.   end
  64.   #--------------------------------------------------------------------------
  65.   # ● 混入模块
  66.   #--------------------------------------------------------------------------
  67.   Game_BattlerBase.send :include, self
  68.   Game_Character.send   :include, self
  69.   Game_Interpreter.send :include, self
  70.   Window_Base.send      :include, self
  71. end
  72.  
  73. class RPG::UsableItem::Damage
  74.   #--------------------------------------------------------------------------
  75.   # ● 根据参数执行计算公式
  76.   #--------------------------------------------------------------------------
  77.   def eval(a, b, v)
  78.     value = Taroxd::Eval.eval(@formula, b.formula_binding(a, b, v))
  79.     value > 0 ? value * sign : 0
  80.   end
  81. end
  82.  
  83. class Game_BattlerBase
  84.   #--------------------------------------------------------------------------
  85.   # ● 执行计算公式的环境
  86.   #--------------------------------------------------------------------------
  87.   def formula_binding(a, b, v)
  88.     s = $game_switches
  89.     n = $game_actors
  90.     p = $game_party
  91.     g = $game_party.gold
  92.     e = $game_troop
  93.     binding
  94.   end
  95. end
  96.  
  97. class Window_Base < Window
  98.   #--------------------------------------------------------------------------
  99.   # ● 对 #{} 的处理
  100.   #--------------------------------------------------------------------------
  101.   alias convert_escape_characters_without_eval convert_escape_characters
  102.   def convert_escape_characters(text)
  103.     convert_escape_characters_without_eval(text)
  104.     .gsub(/\e?#(?<bracket>\{([^{}]|\g<bracket>)*\})/) do |code|
  105.       next code if code.slice!(0) == "\e"
  106.       eval(code[1..-2])
  107.     end
  108.   end
  109. end

作者: 双黄连2_副本2    时间: 2014-2-21 22:56
感谢分享!这样打脚本就不用记那么多单词了!(←_←偷懒)
作者: taroxd    时间: 2014-3-15 13:24
本帖最后由 taroxd 于 2014-7-8 20:48 编辑

自用版在此:https://rpg.blue/thread-367691-1-1.html

配合群组中置顶的脚本,可以实现 P[0](索引队伍) 、P - 1000 (损失金钱)等更为便捷的用法
作者: 怒首苍穹    时间: 2014-3-17 22:56
说得很好!给我这种脚本渣提供了宝贵的资源啊。必须赞一个!

不过“S[5] = true if P[0].hp > E[0].hp”这一段我还是没看明白呀....
作者: 机械守护者    时间: 2014-3-22 07:55
怒首苍穹 发表于 2014-3-17 22:56
说得很好!给我这种脚本渣提供了宝贵的资源啊。必须赞一个!

不过“S[5] = true if P[0].hp > E[0].hp”这 ...

如果if后的成立,就执行前面的
作者: taroxd    时间: 2014-7-8 20:51
2014.07.08
重大更新。偷懒程度更高,使用范围更广,功能大幅增强。

感谢 @晴兰 在技术讨论区给予的帮助。




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