这里是名为mika的游戏及游戏库,游戏使用python语言编写,目前还没有开始开发本体。
游戏库实现了类curses的字符界面显示,后端采用python写成,使用Pyodide运行在浏览器中。
游戏库提供了一种类tex语法的标记语言,可以方便地描述字符风格、动画、位置等内容。
\tick[:0.1]Behold\delay[:0.5], here I am!\delay[:1.0]
The {\s[bg=gray]Most {\s[fg=gold]\tick[:0.4]ALMIGHTY} and {\s[fg=red]\tick[:0.4]POWERFUL}}
{\s[bg=red]Dragon} in this Kingdom!
使用该游戏库,可以使用程序化、模块化的**,实现一个文字冒险游戏。目前可以实现文字冒险游戏的常见功能,如地图(不能实现rpg游戏的图形化地图)、人物、对话分支、对话次数决定内容、条件
- 全局宏
- 将人物的宏加上命名空间,人物自己读取宏的时候,可以省略掉命名空间。这样就可以读取其他人物设置的宏了
- 调用外部函数
- 人物和地图都可以加调用外部函数的宏,由各自的dialogue类管理。外部函数可以有参数
- 自定义字符类型
- 自定义字符弄一个命令,命令参数包括自定义字符类型和参数,具体渲染成什么,由渲染器来实现
- 半角字符
- 一个格子中可以放2个半角字符,采用自定义字符来实现。再实现自动转换成半角字符的命令
- (已更改实现方式)人物头像及表情
- 加入一个特定的绝对坐标引用,表示放头像的地方,然后头像直接使用行内的重定位显示,就不需要写单独的功能了。
- 区域性dialogue
- 将屏幕分为若干个区域,每个sentence指定要输出到的区域
- 使用模块化的yaml存储对话,编译到styleml,对话内容仍然使用styleml书写
- 使用模块的方式组织文件,每个文件包含一个yaml dict,其中的每一项表示一个「段落」,段落是若干个sentence的列表,第i个句子会获得(模块名).(段落名).(序号)的全局名称(label)
- 句子可以是一个字符串,此时它会将属性都设为默认。还可以是一个dict,这时就会根据dict中的信息自定义。dict需要一个template属性,是所有要应用的模板,如果没有的话,默认是空列表。模板是程序预设好的,可供快速生成固定的对话形式,如选择、跳转目的标签、对话次数。
- 使用template的方式实现地图(场景)
- 在一个sentence里面同步/异步地call另外一个sentence
- 前端实现
- 容许多个sentence动画同时进行
- 中断操作会尝试中断所有正在进行动画的sentence,如果存在不能中断的sentence,会跳过这些sentence
- 只有在所有sentence动画都被中断后,才能继续下一个sentence
- 接续call sentence
- call sentence时,直到return为止
- 书写系统的互相引用
- 每一种书写系统(glyphset)(至少包括组字的)实现一个渲染到格子的方式(包括默认的)。\g命令的参数先使用styleml parser解析一遍,再使用书写系统渲染器来渲染。
- 这样就可以实现单独着色组合字的不同部件了
- 修改器命令
- 类似\s的命令,使用程序来修改styleml中的字符串,例如可以用来做「拼音自动转为注音符号组合」的功能。
- 宏计算命令
- 对于每个数据类型,开放一定的操作符以供styleml使用,这样就可以用宏实现计数器、物品背包和金钱(背包和金钱不在计划内)。
- 模块引用的向上查找功能
- 实现一个模块相对路径引用的语法,使得它可以在绝对路径中向上寻找最近匹配的一级名字。这样就可以方便地引用比较远的兄弟节点。
- 考虑使用"<>"符号
- glyphwiki书写系统(glyphset)
- 使用svg引用glyphwiki上的字
- 热点
- 用来代替对话的choice选项
- 文字点击时(或使用键盘定位到时)跳转到特定场景
- 默认按源代码中的顺序排列,还可以指定像tabindex一样的东西按指定顺序排列,还可以考虑实现一个分组属性,进行二维选定。
- 结构化yaml对话
- 可递归地解析yaml对话中每个段落的内容,这样来实现自动生成选择结构等结构。