零基础开发 era 游戏 #2 通识
基础术语#
本节旨在消除歧义,明确:当我们说「某个词」时,我们在表达「什么意思」。
era一般指「era 系列游戏」,详见 中文 Wiki 相关介绍。era basic制作 era 系列游戏时使用的脚本语言。
(使用这种语言编写的脚本文件即为.erb格式文件。)eramakerera 系列游戏的初代驱动引擎,能够按照 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 上。
(EE 是Enter'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 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。)
- Emuera 启动。
- 读取
./CSV/目录下,名为_default.config或_fixed.config的配置文件。- 2.1. 如果存在「默认配置文件」
_default.config,且根目录./下不存在「常规配置文件」emuera.config;则按照此配置生成emuera.config。 - 2.2. 应用「常规配置文件」
emuera.config配置文件。 - 2.3. 如果存在「修正配置文件」
_fixed.config,则按照此配置覆盖「常规配置文件」emuera.config。
- 2.1. 如果存在「默认配置文件」
- 读取并载入
./CSV/目录下,符合预设文件名的*.csv(存储数据)文件。 - 读取并载入
./ERB/目录下,符合预设文件名的*.erh(预定义变量#DIM/#DIMS以及宏定义#DEFINE)文件。 - 读取并载入
./ERB/目录下,符合预设文件名的*.erb(主要业务逻辑)文件。 - 接下来,搜索
@SYSTEM_TITLE函数并执行。
(可以近似视为启动 Emuera 默认自动CALL SYSTEM_TITLE) - 以及下图中的流程。(该图来自 Emuera 本家官方 Wiki 文档流程图部分)
(到这一步往往就开始由游戏制作者自行实现了。)

更多详情请参见《Emuera 原生游戏运行流程浅析》一文。
实际上手新建项目#
- 新建文件夹,找一个喜欢的 Emuera 版本拖进来。
- 在里面再建立两个新的文件夹,分别叫
csv和erb。 - 启动
Emuera*.exe,自动生成配置文件emuera.config。 - 这个项目就是最最最基础的 era 游戏了。(虽然没有一行代码)
此时默认显示的系统标题界面第一个按钮(开始新游戏)缺少对应的功能函数(默认为第一个事件函数
@EVENTFIRST),因此会报错関数"@EVENTFIRST"が見つかりません。
在 erb 目录下新建一个文本文档,命名为 随便你起什么名.erb,打开编辑:
@SYSTEM_TITLE
; 覆写默认的系统标题界面
PRINT 恭喜你,你创建了你的第一个 era 游戏。
QUIT保存为 UTF-8-BOM 编码格式,重新启动。
更多例程#
包含一些独立的简单小游戏,源码注释非常详细,可以运行查看效果来理解原理。
实用开发 Tips#
- 脚本
.erb文件里的「缩进」不会对代码运行造成任何影响。
你喜欢用 Tab(\t) 也好、空格也罢、哪怕完全不用缩进,都是无所谓的事。 - 但「换行」会影响,你写的脚本集(即一堆
.erb文件)本质就是一堆文本,
是 Emuera 按照每一行来切分指令、并解释后一一执行。(典型例子:SIF的判定) - 有一个语法允许将「多行命令」拼接起来视为「一行命令」执行,那就是
{/}。
被花括号{}包在里面的内容,无视其内部的缩进 & 换行,视为同一行。
(由于实现过于简陋,此时注释;也会被视为命令的一部分,所以不要在{}里面写注释。类似于不要在PRINT后面写;注释,会被打印出来,一样的道理。) - 关于文件大小写,这是一个操作系统常识:Windows 的文件系统是忽略大小写的。1
无论你的文件名是大写还是小写,只要字母都对得上,在 Windows 眼里就是同一个文件:SYSTEM_INIT.ERB、system_init.erb、sYsTeM_iNiT.eRb三者没有任何区别。
这也是你重命名文件时仅修改大小写不会生效的原因(必须改动字符才能成功修改)。 - 至于脚本
.erb文件里面的代码是否区分大小写,取决于emuera.config的配置。
设置大文字小文字の違いを無視する:YES- 忽略大小写;NO- 区分大小写。 - 未完待续……
与之相对的,MacOS 默认忽略大小写,但可以手动设置为区分大小写;Linux 永远区分大小写。
当然,Windows 也可以做到文件系统区分大小写(利用 WSL /fsutil实现),有兴趣请自行查阅相关资料。 ↩︎