# 首页

## What's Ren'Rs

Ren'Rs 是一款使用 Rust 制作的视觉小说框架！使用 Lua 作为编程语言，本代码皆在做那种每一步都清晰可见的源代码，不像 renpy 那种自带了许多毫无作用的语法，它的每一步都清晰可见，没有任何会令你感到疑惑的代码！

本引擎里面的所有源代码均清晰可见，没有 renpy 那么多关键字，只有一些非常简单的函数可随时供调用！与此同时，所有函数均一教就会，非常简单！

有可能默认的变量不足以让各位实现自己那套好看的特效，这里推荐使用 MDN 去学习一些 CSS 的相关知识！CSS 的相关知识可以很好的操控 Ren'Rs 里面的几乎所有的控件样式！

自然，如果各位并不想学，使用默认的即可！

## Why Ren'Rs

### 摘要

Ren'Rs 是一款免费+跨平台的视觉小说引擎，它可以让你轻松组合文字、图片和声音，制作你的视觉小说或者生活模拟游戏！

Ren'Rs 允许各位使用 CSS 自定义控件属性，与 Ren'Py 不同的是，它采用的是超高速运行时！采用了 Rust 作为首选编程语言，系统内置 Webview 作为框架，简直是性能天花板。

> Ren'Rs 的 99% 功能均可以在 Lua 中实现，如果你非要使用那 1% 的功能，这里也非常欢迎各位直接修改源代码以实现！

它如同 RenPy 那样允许各位定义高度复杂的 UI、高度复杂的游戏逻辑等等。如果你的项目需要。

### 开源许可证

Ren'Rs 采用的 Apache 2.0 许可证开源！可以用于商业或者非商业项目里，你无需向作者支付任何费用。（当然，少量的捐助也能帮助到作者！）

Ren'Rs 没有遥测，没有网络共享，各位可以将其随时随地到处分发，甚至二次开发并且闭源。（但还是需要在帮助文档里面进行鸣谢的啦。）

它可以被任何形式的传播，并且可用于你的独立工作室或者你的商业团队。

任何人都可以为其贡献自己的代码！我们欢迎全世界所有人为其提交 Pull Request！

### 跨平台

它非常支持跨平台开发！它主要可以运行在如下设备上：

1. Windows 7+(x86\_64、arm64、i686)
2. macOS 10.10+(x86\_64、aarch64)
3. Linux(x86\_64、aarch64)
4. Android(x86\_64、aarch64、armv7)
5. iOS(x86\_64、aarch64)
6. Web(Chrome、FireFox、Safari)

只有你想不到，没有它做不到的！目前所有主流平台均能被其打包并编译。

Ren'Rs 在各个系统上的要求是：

1. Windows: 内置 EGWebview2
2. macOS: 内置 WKWebview/XCode
3. Linux: 需要手动安装 libwebkit2gtk-4.1
4. Android: 内置 Webview 运行时
5. iOS: 内置 Webview 运行时
6. Web：浏览器即可运行

Ren'Py 支持在这些系统上随时运行！

但是开发的话，目前只支持 PC，Android 的开发工具目前还没有，iOS 的目前也还没有。。

得益于 Rust 出色的跨平台优势，各位可以利用 Github Actions 在自己这台机器上打包出每个平台不同的包！【甚至 Android、iOS】

编译出来之后，各位就可以直接在当前操作系统上面跑了！它仅仅只依赖 Webview，不依赖别的任何类库。

但是，请注意，如果各位要是想直接使用 Web 去跑的话，一定要做好以下的打算：

1. 购买一个域名（或者直接用 github pages）
2. 纯前端无需后端，也就是说无需服务器。。
3. 做好 AES Key 被盗的打算。

这里，我是给各位一个非常紧张的打算，那就是，能不打包 Web 端的就不打包 Web 端的。因为在 Web 端，很容易被别人按 F12 打开开发者平台，随后下载各位的 .rrs 文件，再盗走各位的 AES Key，再然后直接破解各位的源代码！！！（想想都觉得可怕。。）

虽然目前并不支持直接在本地进行交叉编译，但是可以随时查阅本教程的【打包发布】一栏，各位可以随时按照教程上面所写，创建 Github 账号，下载 Git，随后使用我们的官方 Github Actions 即可顺利跨平台编译成功啦！！

### 简单脚本

在 Ren'Rs 里，你只需要写一点简单的 Lua 脚本，即可成功运行程序！

```lua
local BG_BEACH = Image("assets/image/bg_beach.png", "image/png")
local JACK_HAPPY = Image("assets/image/jack_happy.png", "image/png")
local Jack = Character("Jack", {color = "#FF0000"})
function Start()
	Scene(BG_BEACH, "dissolve")
	Say(Jack, "Hello, I am Jack, how are you?")
	Show(JACK_HAPPY, "dissolve")
	Say("", "The Sky is blue, the ground is green.")
	Say(Jack, "Hi, let's to play busketball!")
	Say("", '"Ok, I am Coming!", you said.')
end
```

上述我们定义了一个非常简单的脚本，它里面仅仅只说了几段话。但是学过 Ren'Py 的小伙伴应该都知道这些是什么意思，那我就不多赘述啦。

如你所见，我们的变量都定义在顶部，变量名随时都可以定义。我们还附赠一个非常实用的 Lua 教程送给大家！在这里各位可以了解到 Lua 的设计理念和 Lua 的基本语法。

各位可以用自己喜欢的任何脚本编辑器去编写 Lua 脚本！我们还提供了一个官方的 Github Actions 用于自主编译并打包我们的 Ren'Rs！极大的方便了各位直接跨平台分发应用！

## 功能

我们如同 RenPy 那样，为各位提供了所有简便的操作，包括但不限于：

1. 主菜单提供了更多精美的选项，各位可以随时在里面跑自己的预定义的界面。
2. 所有自定义的功能，可以随时禁用或者启用！
3. 毫无冗余的逻辑，毫无内置的条例，任何动效、动画均在 Lua 脚本中有自定义了。
4. 自带回滚、快进、回退、保存。
5. 支持键盘、鼠标、手柄无缝操作。
6. 背景音乐、音效、隐藏文字等功能都有。
7. 支持 gif、mp4 等动图和视频，还有 mp3、wav 的音效，甚至 apng 的极小无损比例的图片！（RenPy 做不到）
8. 内部均采用绝对定位！在绝对精准的 1920x1080 设计稿上！各位只需要按照自己的定位去实现即可。

如同我上面说过的，在这里，99% 的功能你均可以只需要写 Lua 即可实现，只是还有 1% 的功能可能需要自己修改前端源代码实现。。但是我估计那 1% 的功能各位很可能根本就用不到。。

### 定制化

创作者可以在任何地方嵌入自己的任何脚本，还有任何可控制的语句！无需写任何 Python 代码，只需要写一点简单的 Lua 代码即可嵌入到任何剧情、动效、视觉里面！将给予各位最棒的体验！

样式系统基于 Web 的 CSS，如果各位目前还暂时没有学过这个样式语言的话，建议各位先去 MDN 查询一下！（毕竟就算是 RenPy 这种小型的 DSL 语言里面也同样涉及了许多的仿 CSS 的语句去样式！）

如果你需要在游玩过程中改变一点样式，但是需要使用到 if-else，不好意思，我们目前可能暂时不支持 if-else 语法。。。

但是我们这里支持 If 函数！并且我们还有 MoreThen、LessThen、MoreEqualThen、LessEqualThen、EqualThen、AndThen、OrThen、NotThen、XorThen 等等一系列支持 If 语句的内置函数！各位完全可以自主写很多的这种语法！

我们提供了图灵完备的语法。甚至还可以在线随时随地翻译我们的视觉小说！

我们提供了自定义设置的国家翻译脚本，我们不在代码层面限制各位，我们觉得给每一个国家都设置一个翻译语言是非常棒的一件事！各位完全可以看我们的示例项目，里面就有 translate.lua 给各位做参考。非常方便。

### 兼容老旧电脑

我们的 Ren'Rs 引擎由于内部使用的是 Rust，本身内存占用极低，并且支持许多种操作系统，因此完美的可以兼容远古老旧牌电脑！包括但不限于 Windows 7、macOS 10.10 等一众老牌电脑！

并且我们使用内置的 Webview 提供出色的跨平台和低硬件设备，使得无论在哪个平台上运行的 Ren'Rs 均可无缝运行任何动效、过度动画、场景滑行、动作甚至播放视频等。

Ren'Rs 是你最完美的一个新手大礼包！它的速度极快，运行时也极快！

### 你的代码和立绘属于你自己

在这里，我们不用明文存储各位的数据，相反，我们使用了 AES 加密手段并采用了随机偏移的向量去加密各位的源代码！【请注意，这不是压缩，它的目的是做到保护各位的源代码。所有字节原本多少那么加密后就是多少，除了`填充`和`文件名`和`偏移`以外，无任何隐式的字节，所有字节数量该是多少就是多少！】

在经过了 AES 加密之后的数据！无论是任何人，还是本程序作者，在没有你的密钥的情况下根本不可能解密出你的原始数据。因此各位只要源代码在手，那么天底下没有任何人可以对你的源代码破译！！

并且，每次对源代码进行编译后的产物，均是不一样的。因为偏移是随机生成，并且偏移存在编译产物里面的文件内部分位置！既然偏移是随机的，那么产生的值肯定也是随机的。

我们会生成两个偏移 iv 值，第一个 iv 值是加密文件目录、大小、是否为二进制的，第二个 iv 值是加密文件的！但两个 iv 值均是与我们的 AES 密钥打配合的！因此各位完全无需在意这些细节！

每次编译产物都不一样，但是解密的话，只需要配合一个 AES 密钥即可对里面的二进制值进行解密！在别人未拿到各位的 AES 密钥的话，要是想直接硬破解，简直比登天还难。。。

因此，你的代码和立绘属于你自己，这句话非常的形象！不同于 zip 上密码，zip 上了密码之后，你直接把密码告诉别人，别人就能立刻解压你的文件！然而 AES 加密可不同，你的密钥编译后产生的文件将仅能被 Ren'Rs 使用！不过别人就算拿到了你的 AES 密钥，只要不通过我的解密程序，依旧会被其中的复杂度弄晕。依旧无法拿到你的该死的密钥！

通过我们提供的 Github Actions 已经 Github Secrets 的功能，我们可以很好的令各位解决跨平台打包而又不下载依赖啦！

不同的二进制可执行程序虽然大小一样大，但是各位的可执行程序内的 AES 密钥不同！加密出来的 .rrs 也不同！这样就很好的区分哪个可执行文件对应的是运行哪个加密后的文件啦！

与此同时，各位若想要实现进入 steam 售卖的话，也是利用了上述的一个 AES 密钥仅自己家的加密可执行文件！只要各位保管好自己的 AES 密钥，那么无论如何别人也无法跳出 steamwork 去外面专门跑一次各位的加密文件随后去盗取各位的视觉小说源代码！

### 编译器速度

由于我们采用了 AES 进行加密，那么肯定得有一个加密器吧，这个再我们这里统称叫编译器，用于使用我们自定义的 AES 密钥对视觉小说进行加密。那么编译器速度和体积大小如何呢？

很简单，速度和体积大小各位均不用操心！编译的话可以在 3s 内搞定，而 Rust 端的解密，则只需不到 1s 就可以搞定了。

这里我们采用的编译器语言为：Zig，这是一门新出的语言。它非常强大，编译速度非常快，使用特殊的手段将编译期间的调试信息给移除后，体积来到了几百 KB。与此同时，它的速度也是极快的！

我们采用的是流式编译的环节！如果各位的 .lua 或者是 .mp3、mp4、gif 文件过于庞大，甚至大到有几个 G，我们这也能完美的进行加密！

不过解密的话，由于需要将文件全部都加载到内存里，因此如果文件过于大了的话，可能对于部分内存比较小的电脑来说是一件比较担心的事呢……不过现在的电脑内存大多数已经到了 16G 以上了！因此内存焦虑各位完全可以不必担心！

只需要使用我们的编译器进行编译，随后正常的发送到 Github Actions 编译我们的项目即可！

### 无需下载 Rust 也能进行编程！

这正是我们的 Ren'Rs 的妙处！通过直接编译通过的可执行文件以及编译器，我们可以做到本地开发，随后直接上传到 Github 并配合我们的官方 Github Actions 可以很好的编译我们的跨平台二进制产物，并链接上我们自己的 Github Secrets 更可以很好的保护我们每个人的密钥！

在 Github Actions 运行时，各位完全不需要管其中的内部构造，只需要各位稍微懂一点点的 git 知识，即可完成各位的跨平台制作！当然，如果各位要是觉得 Lua 并不能完成某些特殊的动效，急需在源代码里修改，这里当然也是完全可以的！但是如果要从源代码修改的话，可能就得借助 Node 和 Rust 去开发了。。

如果各位想本地开发的话，这里提供了一个随机的 AES 值用来给各位做开发。将会在每一个 Github Releases 目录下说明清楚当前的 AES 密钥是什么，各位即可直接使用编译器顺便链接上我们编译后的加密文件即可。

加密文件的后缀名是 .rrs 文件，各位完全可以自定义各位的 key 去编译。当与我们的 Github Releases 上的 key 保持一致时，即可顺利在本地开发。

### 与 Ren'Py 的区别

区别就是，本作使用了 Lua 作为编程语言，通过了许多内置函数和内置变量去做我们的视觉小说。不同于 Ren'Py 是用了自己的 Python DSL 语法，不仅解析是用 Python，编译也是用 Python，单单在性能上则完全不如 Ren'Rs！

Ren'Rs 使用的编程语言并不是有关于自己的 DSL，而是站在了前人的脚步上，使用了 Lua 作为自己的编程语言，它不仅图灵完备，而且极为优雅。适合每一位新手去学习！

再配合我们的 AES 加密手段，也是前人所使用的自我加密手段，使其的安全性有了极大的保障！即使它本身就是解释性语言，我们的开发团队依旧可以保证它的运行效率！因为本身的宿主语言是 Rust，这就类似于 Python 那样，直接运行 python xxx.py 那种运行效率，无需再管 Ren'Py 的 DSL 方言，又或者是需要实时进行 DSL 解析了！

## Ren'Rs 的加密与识别

Ren'Rs 采用了 AES 作为加密手段，将你的所有立绘、Lua 源代码、音乐、音效进行加密处理，随后在 Ren'Rs 里面识别！所有的立绘和源代码的知识产权属于你，任何人都无法盗用你的文案、立绘和源代码！

Ren'Rs 刚开始启动时，会在你的当前目录下开始扫描，所有的 .rrs 文件，如果未找到任何 .rrs 文件，那么会弹出【识别失败】的弹窗！

当你放入了 .rrs 文件之后，如果只找到一个，那么就直接运行这一个，反之，则列出一个文件名列表。

当你只有一个 .rrs 文件在根目录时，Ren'Rs 将会直接开始判断该 .rrs 文件的 AES 密钥是否一致！如果不一致，则弹出弹框【文件损坏或密钥错误】的弹窗！

当有很多个 .rrs 文件在根目录时，Ren'Rs 会在你开始点击其中的某一个时，才会开始判断 AES 密钥。如果判断成功了，则直接进入游戏主界面！如果判断失败，则底下会出现一个【返回】按钮。

在 Ren'Rs 刚开始运行时，如果未找到 .rrs 或者找到多个 .rrs 文件，屏幕上会有一个【刷新】按钮，你可以随时随地点击刷新去刷新你的文件列表。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://candysharkstudio.gitbook.io/ren-rs-lua-tutorial/shou-ye.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
