零基础开发 era 游戏 #2 通识

基础术语#

本节旨在消除歧义,明确:当我们说「某个词」时,我们在表达「什么意思」。

  • era 一般指「era 系列游戏」,详见 中文 Wiki 相关介绍
  • era basic 制作 era 系列游戏时使用的脚本语言。
    (使用这种语言编写的脚本文件即为 .erb 格式文件。)
  • eramaker era 系列游戏的初代驱动引擎,能够按照 era basic 语法解释脚本指令集。
    (目前基本已经被淘汰。)
  • Emuera 一种 era 系列游戏的改进版驱动引擎(命名意为 Emulator of eramaker),能够按照基本的 era basic 语法以及新扩展的功能用法解释脚本指令集。
    • Emuera 本家 初代的 Emuera,目前已停更,最后一版发布于 2020.01.04,版本号 1824,一般文件命名格式类似 Emuera1824.exe
    • Emuera 私家改造版 只修了本家存在的 bug 的修复版,没有新功能,但更新频率相当劳模,一般文件命名格式类似 Emuera1824+v15.exe
    • EmuEra-Anchor 改进版 在私家改造版的基础上为英文语境和聚合翻译特别优化过的英语版,一般文件命名格式类似 Emuera-Anchor.exe
    • EmueraEE 改进版 在私家改造版的基础上新增许多强大的实用功能的增强版,一般文件命名格式类似 Emuera1824+v15+EMv8c+EEv17.exe。源码托管在 GitLab 上。
      EEEnter's Edition 的简称,后来另一位作者 EvilMask 也加入开发,但仍然沿用了这个命名方式。)

给初学者的寄语#

所谓 era games 由于其特性,开发流程并不复杂,本质就是写脚本。
那么被系列标题里的「零基础」这个词骗过来的朋友要问了:「什么是脚本?」

什么是脚本#

所谓脚本,就是使用一种特定的 描述性 语言,依据 一定的格式 编写的可以完成「具体任务」的 文本文件

脚本语言也是一种高级编程语言。
注意所谓的「高级」是相对于「人机交互」这个层面来说的。
你认识(能被人类理解并编辑),电脑(原本)不认识的就是 高级编程语言

脚本写出来能干嘛?计算机看得懂吗?
很遗憾,计算机并不知道你写的脚本是什么意思。所以我们还需要一个「解释器」,用来把我们写好的脚本解释 / 翻译(脚本语言 → 机器码)给计算机听。
计算机听明白了,知道「哦,是这个意思」,然后才会根据指令执行对应的动作。

谁是解释器#

在 era 游戏这个场景中,谁是解释器?
当然是「游戏引擎」啦,也就是各种版本五花八门的「Emuera」。

本文开头也提到过,其实 Emuera 是第二代的(某种程度上说)era 游戏引擎。
在 Emuera 之前,还有一个名为「eramaker」的初代 era 游戏引擎。
不过由于其十分有限的功能跟不上时代的发展,基本上已经被淘汰了。
现在提到的「era 游戏引擎」默认指功能更为成熟和强大的 Emuera。

脚本语言 era basic#

回过头来看,解释器有了,那应该解释谁?谁是脚本语言?
没错,那必须是 erb 了 —— era 游戏文件里最核心最关键的 *.erb 文本文件。
这种脚本语言叫做「era basic」(缩写就是 .erb),由之前提到的初代目 era 游戏引擎 eramaker 命名。

至于 BASIC,全称 Beginners' All-purpose Symbolic Instruction Code,意为「初学者通用符号指令代码」。这是个非常古早的编程语言,era basicera 版 BASIC 的语法设计大量参考了这种语言。年代过久无从考据,我个人猜测是因为这个原因,故而以命名致敬。

所以 era 游戏其实真正指的是「游戏制作者以 era basic 语法编写的,能被 era 游戏引擎(如 Emuera)识别并执行的脚本集」。

总结#

说白了,做 era 游戏本质就是「按照某种格式写文本」,你把它当成阉割后的(割的有点多,眉毛以下全割了)简陋版 Python 看也不是不行。
单纯使用 Python(当胶水语言用)有多简单,开发 era game 就有多简单。

没有黑 Python 的意思,生产环境如果用 Python 写业务还是要花工夫的。

那你又要问了:「照你这么说,全世界所有编程语言都是按照语法写文本啊?」
不不不不不不,文本和文本之间也是有区别的。
类型转换、作用域、命名空间、泛型、枚举、结构体、对象和类、实例化、生命周期、继承、多态、接口、回调函数、修饰符、事件循环、任务队列、数据通信、文件 IO、协程、多线程、指针、垃圾(内存)回收、异常处理、编译、包管理……

我没有用英语凸显不明觉厉吧?
以上任何一个词你去搜都真的搜得到,真的是各种语言特性吧?
不是我胡诌的、外行骗外行用的什么细分、路径、闭环、赋能、抓手、反哺、组合拳、对齐、差异化、资源倾斜、量化、反哺……之类糊弄傻逼领导的批话吧?

作为初学者,你应该问的是「era basic 有上面这些吗?」
没有?我操,太好了。

综上所述,era game 纯粹的开发本身并不是什么重点 or 难点,重点是:

  • 系统(玩法)策划:这是一个「游戏」,你的任务是把它做得「好玩」。
  • 关卡(演出)策划:所谓「引人入胜」,光让玩家打开游戏是不够的,你要勾引玩家不断玩下去*。
  • 文学(剧情)策划:包括世界观设定 & 故事展开剧本 & 人设(口上)等。

* 社会责任感之类是任天堂那种级别才会考虑的事,你把你的 era 游戏做得能让人心甘情愿玩下去,就给你一百昏了。

而 era game 的精髓或者说「醍醐味」也在这三者,没听说过哪个 era game 是以多牛逼的算法脱颖而出的吧。

一些作品确实开拓了非常惊艳非常有创意的玩法类型。但那些玩法的可贵之处也是其创意本身,以及努力将之实现出来、把想法化作现实的行动力;而不是真的写代码本身有多难。
所有不必抱有畏难情绪,只要想做,就勇敢地去做吧!

如果你要种一棵树,最好的时机是十年前;
其次是现在。

Emuera 运行流程#

以下结论来自 Emuera 本家官方 Wiki 文档 ERH 部分 以及我亲手测试及总结的实际过程。
注意所有文本文件的字符集编码格式都应该是 Shift JIS 或者 UTF-8-BOM
强烈建议一律使用 UTF-8-BOM
(与国际接轨什么的都是其次,少出点弱智的兼容性问题爽的是你自己啊 www。)

  1. Emuera 启动。
  2. 读取 ./CSV/ 目录下,名为 _default.config_fixed.config 的配置文件。
    • 2.1. 如果存在「默认配置文件」_default.config且根目录 ./ 下不存在「常规配置文件」emuera.config;则按照此配置生成 emuera.config
    • 2.2. 应用「常规配置文件」emuera.config 配置文件。
    • 2.3. 如果存在「修正配置文件」_fixed.config,则按照此配置覆盖「常规配置文件」emuera.config
  3. 读取并载入 ./CSV/ 目录下,符合预设文件名的 *.csv(存储数据)文件。
  4. 读取并载入 ./ERB/ 目录下,符合预设文件名的 *.erh(预定义变量 #DIM/#DIMS 以及宏定义 #DEFINE)文件。
  5. 读取并载入 ./ERB/ 目录下,符合预设文件名的 *.erb(主要业务逻辑)文件。
  6. 接下来,搜索 @SYSTEM_TITLE 函数并执行。
    (可以近似视为启动 Emuera 默认自动 CALL SYSTEM_TITLE
  7. 以及下图中的流程。(该图来自 Emuera 本家官方 Wiki 文档流程图部分
    (到这一步往往就开始由游戏制作者自行实现了。)

更多详情请参见《Emuera 原生游戏运行流程浅析》一文。

实际上手新建项目#

  1. 新建文件夹,找一个喜欢的 Emuera 版本拖进来。
  2. 在里面再建立两个新的文件夹,分别叫 csverb
  3. 启动 Emuera*.exe,自动生成配置文件 emuera.config
  4. 这个项目就是最最最基础的 era 游戏了。(虽然没有一行代码)

此时默认显示的系统标题界面第一个按钮(开始新游戏)缺少对应的功能函数(默认为第一个事件函数 @EVENTFIRST),因此会报错 関数"@EVENTFIRST"が見つかりません

erb 目录下新建一个文本文档,命名为 随便你起什么名.erb,打开编辑:

@SYSTEM_TITLE
    ; 覆写默认的系统标题界面
    PRINT 恭喜你,你创建了你的第一个 era 游戏。
    QUIT

保存为 UTF-8-BOM 编码格式,重新启动。

更多例程#

包含一些独立的简单小游戏,源码注释非常详细,可以运行查看效果来理解原理。

实用开发 Tips#

  1. 脚本 .erb 文件里的「缩进」不会对代码运行造成任何影响。
    你喜欢用 Tab(\t) 也好、空格也罢、哪怕完全不用缩进,都是无所谓的事。
  2. 但「换行」会影响,你写的脚本集(即一堆 .erb 文件)本质就是一堆文本,
    是 Emuera 按照每一行来切分指令、并解释后一一执行。(典型例子:SIF 的判定)
  3. 有一个语法允许将「多行命令」拼接起来视为「一行命令」执行,那就是 { / }
    被花括号 {} 包在里面的内容,无视其内部的缩进 & 换行,视为同一行。
    (由于实现过于简陋,此时注释 ; 也会被视为命令的一部分,所以不要在 {} 里面写注释。类似于不要在 PRINT 后面写 ; 注释,会被打印出来,一样的道理。)
  4. 关于文件大小写,这是一个操作系统常识:Windows 的文件系统是忽略大小写的1
    无论你的文件名是大写还是小写,只要字母都对得上,在 Windows 眼里就是同一个文件:SYSTEM_INIT.ERBsystem_init.erbsYsTeM_iNiT.eRb 三者没有任何区别。
    这也是你重命名文件时仅修改大小写不会生效的原因(必须改动字符才能成功修改)。
  5. 至于脚本 .erb 文件里面的代码是否区分大小写,取决于 emuera.config 的配置。
    设置大文字小文字の違いを無視するYES - 忽略大小写;NO - 区分大小写。
  6. 未完待续……

  1. 与之相对的,MacOS 默认忽略大小写,但可以手动设置为区分大小写;Linux 永远区分大小写。
    当然,Windows 也可以做到文件系统区分大小写(利用 WSL / fsutil 实现),有兴趣请自行查阅相关资料。 ↩︎

lackbfun © 2021 - 2024