查看: 7065|回复: 25

[原创发布] RMVA使用其他编辑器编辑脚本

[复制链接]

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2018-4-11 14:02:23 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 喵呜喵5 于 2020-2-16 22:29 编辑

这个东西对于不会写脚本的人来说基本上完全没用




snipaste_20180411_121340.png

因为 RMVA 自带的脚本编辑器功能比较鸡肋,加上不方便进行代码的版本控制等、比对检查等,所以之前一直都是在用 sublime text 或者 vscode 写代码最后打包进游戏中
想了想这东西也没必要藏着掖着,就公开出来了,具体的范例见工程:

https://pan.miaowm5.com/index.php/s/Et3EopkeKKGc9qa

一些注意事项:
在脚本中使用
  1. m5_require '文件相对当前脚本的路径'
复制代码

加载其他脚本文件,加载时会在顶层作用域执行脚本文件
脚本文件的编码要求使用 utf-8

范例工程中的 RMVA 脚本编辑器中的脚本便是打包的完整代码,代码最下方就是要干的具体事情,根据实际需要改完这里之后就再也不用管脚本编辑器了
snipaste_20190605_110143.png
大概的格式是这样:

  1. builder = Builder.new("./Src/Main.rb")
  2. #读取脚本,脚本的入口文件为 ./Src/Main.rb,返回一个 Builder 实例

  3. builder.dev
  4. #直接读取脚本运行游戏,仅建议在游戏开发时使用

  5. builder.build_data('./Release/BuildScripts.rvdata2', './Release/Scripts.rvdata2')
  6. #将脚本打包到 Release/BuildScripts.rvdata2 中并自动生成 Release/Scripts.rvdata2 文件,游戏发布时,将这两个文件覆盖 Data 文件夹下的同名文件即可发布游戏
  7. #Release目录不会自动创建

  8. builder.build_rvdata2('./Release/Scripts.rvdata2')
  9. #将脚本打包到 Release/Scripts.rvdata2 中,游戏发布时,将这个文件覆盖 Data 文件夹下的同名文件即可发布游戏

  10. builder.build_single('./Release/Scripts.txt')
  11. #将脚本打包到 Release/Scripts.txt 中,游戏发布时,可以将这个文件中的内容插入到脚本编辑器里来使用
  12. #这个功能主要在制作插件脚本时会使用到,例如下面这种创建多个 builder 实例的使用方式
  13. #Builder.new("./Battle/turn.rb").build_single('./Plugin/turn.txt').dev
  14. #Builder.new("./Map/weather.rb").build_single('./Plugin/weather.txt').dev
  15. #Builder.new("./Map/enemy.rb").build_single('./Plugin/mapEnemy.txt').dev

  16. builder.build_single('./Release/Scripts.txt', true)
  17. #build_single 的第二个参数用来控制打包出来的脚本是否还具备可读性,默认 false 为无可读性版本

  18. builder.build_single('./Release/Scripts.rvdata2')
  19. #将脚本打包到 Release/Scripts.rvdata2 中,游戏发布时,将这个文件覆盖 Data 文件夹下的同名文件即可发布游戏
  20. #和 build_rvdata2 不同,打包时所有的脚本会被打包到同一个代码页中
  21. #同样可以使用第二个参数用来控制打包出来的脚本是否具备可读性
复制代码


PS.其实我还有支持在不同作用域执行代码的 include require inject 的加强版,但想了想好像没啥没必要所以就不公开了
PS2.vscode真好用





更新日志:

V1.4
修正工程漏掉的 Window_NameInput

V1.3
不再使用 Dir.pwd 定位根目录,现在工程路径可以包含中文了
注释了打包脚本时忽略空行和 # 号开头行的代码,打包出来的文件体积增加,但错误定位的行数更精确
打包单个脚本文件时,支持设置打包结果是否有可读性
删除了打包脚本执行结束后直接 exit,让本脚本的用途更加广泛

V1.2
修正 Dev 模式下无法定位报错的问题

V1.1
移除为了调试加上去的 rgss_stop
snipaste_20190605_110143.png

评分

参与人数 4星屑 +300 赞 +4 收起 理由
唯道集虚 + 300 + 1 VSC!之前因为感觉自带的编辑器实在不好用.
shitake + 1
⑨姐姐 + 1 VSCode好用!
2256538860 + 1 塞糖

查看全部评分

梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2018-4-11 14:39:33 | 显示全部楼层
本帖最后由 shitake 于 2018-4-11 14:42 编辑

早知道你在造轮子的话 我他妈就不写了 囧囧囧

顺便 你的build_rvdata2 我就偷走了 【逃

点评

史塔克总是把一些过时玩意当发现,http://seiran.mist.so/rgss/rgssrgstorage-1-00.html  发表于 2018-4-11 21:04
本身主要是一个自用的东西,发出来更多的是[s]引狼入室[/s]抛砖引玉,如果能在回复里见到更适合自己用的思路我也能改进自己写脚本的环境  发表于 2018-4-11 15:10
因为我挪到vscode里只是为了写着舒服同时方便版本控制,没涉及到更多功能(断点调试之类),所以也不打算把整个流程弄复杂  发表于 2018-4-11 15:08
类似 webpack 的东西也有写过,但实际上在 RM 上用的时候发现意义不算特别大,这个简单版本的 m5_require 能满足需求就没继续了  发表于 2018-4-11 15:05
另外 我是觉得都正儿八经挪到IDE里写代码了 应该也不差个ruby环境 没必要利用rmva的解释器  发表于 2018-4-11 15:03
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 0 1

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2018-4-11 16:03:46 | 显示全部楼层
好东西啊,想当初放弃VA的其中一个原因就是脚本编辑器字体看不顺眼......

无耻的收了
回复

使用道具 举报

梦石
0
星屑
4623
在线时间
1207 小时
注册时间
2016-4-7
回帖
944

开拓者

发表于 2018-4-11 16:41:45 | 显示全部楼层
本帖最后由 shitake 于 2018-4-11 16:47 编辑

[fold][pre lang="ruby"]require 'fileutils'
require 'zlib'

module RmPack
  class RmPack
    class << self

      # @return [Array<Proc>]
      attr_reader :loaders

      def use(loader)
        @loaders = [] unless @loaders
        @loaders << loader
      end

    end

    attr_reader :excludes
    attr_reader :source
    attr_reader :output

    def initialize
      @visited = {}
      @cont = []
      @count = 0
      @files = {}
    end

    def get_requires
      until @cont.empty?
        visit(@cont.shift, @visited, @cont)
      end
    end

    def get_file_name(file)
      "\n\n# File #{file.gsub(Dir::getwd + '/', '')}\n\n"
    end

    def get_file(file)
      @files[file]
          .gsub("# encoding:utf-8\n", '')
          .strip
    end

    def init_loaders
      RmPack.loaders.map! { |loader| loader.new(self) }
    end

    def create_file
      FileUtils.mkdir_p(File.dirname(@output))
      File.open(@output, 'w')
    end

    def pack(conf)
      @source = conf[:source]
      @excludes = conf[:excludes] || []
      @output = conf[:output] || './out.rb'
      @excludes.map!{|exclude| File.expand_path(exclude, File.dirname(@source)) }
      init_loaders
      @cont << @source
      get_requires
      list = reorder(@source, @visited[@source])
      @output.include? '.rvdata2' ? out_rvdata2(list) : out_rb(list)
      puts "Finish! #{@count} files."
    end

    def out_rvdata2(list, mode = 0)
      script = []
      if mode == 0
        list.each do |file|
          file_str = get_file(file)
          next '' if file_str == ''
          @count += 1
          puts file
          script << [@count, get_file_name(file).strip.match(/# File (.*).rb/)[1], Zlib::Deflate.deflate(get_file(file).strip)]
        end
      end
      File.open(@output, "wb") { |f|
        Marshal.dump(script, f)
      }
    end

    def out_rb(list)
      create_file.write "# encoding:utf-8\n" + list.map { |file|
        file_str = get_file(file)
        next '' if file_str == ''
        @count += 1
        puts file
        get_file_name(file) + file_str
      }.reduce(:concat).strip
    end

    # @param [String] file
    # @param [Hash] visited
    # @param [Array] cont
    def visit(file, visited, cont)
      return if (visited.include? file)
      visited[file] = []
      File.open(file) do |f|
        @files[file] = f.readlines.map { |str|
          delete = false
          RmPack.loaders.each do |loader|
            if loader.match(str, f)
              depends = loader.file
              cont << depends unless cont.include? depends
              visited[file] << depends
            end
            delete =  delete || loader.delete
          end
          delete ? '' : str
        }.reduce(:concat)
      end
    end

    # @param [String] file
    # @param [Array<String>] dependency
    def reorder(file, dependency)
      return [file] if dependency == []
      dependency.map {|dep| reorder(dep, @visited[dep]) }.push(file).flatten.uniq
    end
  end

  class RequireRelativeLoader

    attr_reader :file
    attr_reader :delete

    def initialize(conf)
      @excludes = conf.excludes
      @file = ''
      @match_exp = /require_relative[^\n]*/
      @file_exp = /require_relative\s*'([^']*)'/
      @mark_exp = /require_relative\s*'[^']*'\s*\#delete\s/
      @delete = true
    end

    def add_suffix(str)
      return str + '.rb' unless str.reverse =~ /^br\./
      str
    end

    def match(str, f)
      @delete = false
      return false if str !~ @match_exp
      @delete = true
      return false if str =~ @mark_exp
      return false if str !~ @file_exp
      @file = File.expand_path(add_suffix($1), File.dirname(f))
      return false if @excludes.include? @file
      @file
    end

  end

  RmPack.use(RequireRelativeLoader)

end

def rm_pack
  RmPack::RmPack.new
end[/pre][/fold]

付一个我自己的实现 不过我的需要由外部的ruby环境
脚本id 目前只能填index了 囧
这可能小黄鸡会知道如何生成 @fux2
这篇帖子里他讲到了如何用哪个id来生成 exit_code
https://rpg.blue/forum.php?mod=v ... ght=Scripts.rvdata2

点评

.end_with? 滑稽.jpg  发表于 2018-4-11 17:28
为啥不直接正向判断0 0  发表于 2018-4-11 17:16
str.reverse =~ /^br\./ 滑稽.jpg  发表于 2018-4-11 17:01
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2018-4-11 17:16:27 | 显示全部楼层
很久很久以前……囧叔也糊过类似的东西,不过当时是考虑到加密脚本才拆开放的,原理也就是read+eval

点评

所以黄鸡快告诉我id咋算  发表于 2018-4-11 17:54
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2018-4-11 18:03:32 | 显示全部楼层
下一次改数据库吗···

点评

那个感觉和自己写个脚本装进文件正式发布删掉脚本没什么区别···  发表于 2018-4-11 18:16
数据库早有人改过了啊,导出到excel里填表  发表于 2018-4-11 18:11
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
4881
在线时间
425 小时
注册时间
2019-10-22
回帖
647
发表于 2020-2-16 14:01:35 | 显示全部楼层
本帖最后由 坏数据 于 2020-2-16 16:43 编辑

饭粒里面的main.rb 漏了 Window_NameInput这个原生的window

QQ截图20200216034007.png

用着习惯的sublime 漂亮的语法高亮 犹如搭乐高积木一般
感谢m5

点评

windows下 魔改了标题栏 theme是material color是glacier 字体是source code pro 语法高亮规则也改了些 强迫症很严重  发表于 2020-2-17 03:12
颜值党 早就看默认编辑器不顺眼了  发表于 2020-2-17 03:05
感谢提醒(哇你这界面真漂亮)  发表于 2020-2-16 21:19
















回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部