查看: 4001|回复: 5

[RMVA发布] 事件脚本偷懒大法,再也不怕脚本框太短了!

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-21 21:27:55 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taroxd 于 2014-7-12 15:12 编辑

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

[pre lang="ruby" line="1"]

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
[/pre]

评分

参与人数 2星屑 +380 收起 理由
怪蜀黍 + 350 发布奖励
晴兰 + 30 挺好用的

查看全部评分

梦石
0
星屑
50
在线时间
196 小时
注册时间
2013-5-10
回帖
379
发表于 2014-2-21 22:56:04 | 显示全部楼层
感谢分享!这样打脚本就不用记那么多单词了!(←_←偷懒)
大前年的作品《猪刀历险记》
前年的作品《深蓝之心》
上面都是黑历史!
开学了我终于要长久潜水了!
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2014-3-15 13:24:37 | 显示全部楼层
本帖最后由 taroxd 于 2014-7-8 20:48 编辑

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

配合群组中置顶的脚本,可以实现 P[0](索引队伍) 、P - 1000 (损失金钱)等更为便捷的用法
回复

使用道具 举报

梦石
0
星屑
50
在线时间
105 小时
注册时间
2012-11-11
回帖
69
发表于 2014-3-17 22:56:09 | 显示全部楼层
说得很好!给我这种脚本渣提供了宝贵的资源啊。必须赞一个!

不过“S[5] = true if P[0].hp > E[0].hp”这一段我还是没看明白呀....
回复

使用道具 举报

史莱姆的信徒
12-B

梦石
0
星屑
53
在线时间
368 小时
注册时间
2013-8-14
回帖
909
发表于 2014-3-22 07:55:00 来自手机 | 显示全部楼层
怒首苍穹 发表于 2014-3-17 22:56
说得很好!给我这种脚本渣提供了宝贵的资源啊。必须赞一个!

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

如果if后的成立,就执行前面的

点评

多谢啦,现在差不多懂了  发表于 2014-3-23 20:38
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2014-7-8 20:51:59 | 显示全部楼层
2014.07.08
重大更新。偷懒程度更高,使用范围更广,功能大幅增强。

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

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部