konovalov-aleks/reSL
GitHub: konovalov-aleks/reSL
对 1992 年 DOS 游戏 ShortLine v1.1 的完整逆向工程复原项目,将经典游戏移植到现代跨平台环境并提供逆向学习参考。
Stars: 35 | Forks: 4
[
](https://konovalov-aleks.github.io/)
# reSL
逆向工程的 DOS 游戏 ShortLine v1.1 (DOKA 1992)
**你可以直接在浏览器中玩这款游戏:https://konovalov-aleks.github.io/**
访问 [发布页面](https://github.com/konovalov-aleks/reSL/releases/) 下载游戏。
## 当前状态
代码已完全恢复并适配了触控设备 ✅
*main* 分支包含了游戏的改进版本。
你可以在 ["original" 分支](https://github.com/konovalov-aleks/reSL/tree/original) 中看到最接近原版游戏的版本。如果你想学习逆向工程,这会很有用。每个函数都有一条注释指向原始二进制文件中该函数的偏移量——这能让你方便地将反编译器中的函数与重构后的代码进行对比。
## 项目的想法和目标:
本项目不追求任何利润,也不会用于商业目的。
该项目的目标是为了获得乐趣和经验,并将我最喜欢的童年游戏移植到现代移动平台上,使其适配触控操作。
## 为什么我选择了 v1.1,而不是最新的 v2.0?
我最初是对第二个版本进行逆向工程。但我很快意识到:
* 这个游戏与我童年时玩的有些不同。
* 而且它的运行情况更糟——没有动画,切换菜单时屏幕会闪烁。
* v2.0 是用 Pascal 编写的,使用了 BGI 库。而 v1.1 是用 TurboC 编写的,使用汇编部分来处理图形并实现一些复杂的机制(ShortLine 甚至使用了用汇编编写的协程!)。
所以,v1.1 运行得更好,而且反编译起来有趣得多。
## 与原版游戏的区别
本项目的目标是尽可能还原最初的 ShortLine,以便在现代设备上也能游玩。
因此,reSL 与原版游戏之间存在的差异皆归因于以下原因之一:
* 原版游戏是为 DOS 编写的,而 reSL 需要是跨平台的。
* 原版游戏存在 bug,不修复它们说不过去。
* 为了能够使用触控操作而进行的 UI 改进。
### 改进之处
1. 在所有菜单(主菜单、暂停菜单、记录、档案等)中支持使用鼠标/触摸。
2. 支持在没有鼠标的情况下控制游戏(长按代替鼠标右键单击,滑动代替同时按下两个鼠标按钮)。
3. 在 PC 上支持使用 `<空格>` 键代替同时按下两个鼠标按钮。
4. 建造模式下的网格线,用于简化定位,尤其是在触摸屏设备上。
5. 关闭“记录”屏幕时的动画(与其他屏幕的动画相同)。
6. 更好的错误处理(原版游戏在尝试读取损坏的存档文件时可能会崩溃或进入不可预测的状态)。([issue #17](https://github.com/konovalov-aleks/reSL/issues/17))
### 修复的原版游戏 Bug
1. 如果上一次游戏会话是在火车于第一个入口等待时停止的(黄色调度员正在显示旗帜),那么在开始新游戏时程序会卡死。
2. 加载画面会瞬间以错误的颜色绘制。
3. 如果用户在“档案”菜单中删除了最后一个文件,界面会损坏。([issue #7](https://github.com/konovalov-aleks/reSL/issues/7))
4. 如果用户删除了最后一个存档文件并运行新游戏,黄色入口永远不会出现。([issue #15](https://github.com/konovalov-aleks/reSL/issues/15))
5. 如果没有 RECORDS.TBL 文件,记录屏幕将不会被绘制 ([issue #37](https://github.com/konovalov-aleks/reSL/issues/37))
6. 如果用户在没有 'results.tbl' 文件的情况下开始新游戏,并且在中途没有任何中断(甚至没有打开暂停菜单)的情况下通关,标题栏会显示错乱 ([issue #53](https://github.com/konovalov-aleks/reSL/issues/53))
## 逆向工程过程
我反编译的文件的 MD5 哈希值:
原版游戏可以通过以下链接下载(版本 1.1):
https://www.old-games.ru/game/download/1232.html
我使用 Ghidra 作为主要工具:
https://github.com/NationalSecurityAgency/ghidra
在第一阶段,我的目标是尽可能恢复接近原始程序的代码。你可以在 ["original" 分支](https://github.com/konovalov-aleks/reSL/tree/original) 中看到该版本。
每个函数/全局变量都有一个类似 `/* 18fa:08d6 */` 的注释。这是该函数/变量在原始二进制文件中的地址。这对避免工作时产生混乱非常有帮助,对于想要将恢复的代码与反编译器中的外观进行比较的新手来说,这可能也很有趣。
在第二阶段,我将游戏适配到了触控操作,优化了代码并修复了一些遗留的问题。
## 构建 reSL
reSL 仅使用了标准的 C 和 C++ 库,以及跨平台的 SDL2 库。因此,它可以轻松地编译给许多平台,没有任何困难。本章介绍了最流行平台的构建过程。但支持的平台列表并不局限于这些。
要构建 reSL,你需要:
* 支持 C++20 的现代 C++ 编译器 (modern clang, GCC, MSVC)
* [cmake](https://cmake.org/download/)
### MacOS / Linux
打开终端应用程序并执行以下指令:
```
# 准备 build 文件夹
mkdir -p build && cd build
# 运行 cmake
cmake -DCMAKE_BUILD_TYPE=Release ..
# build 项目
cmake --build . -j4
# enjoy!
./resl
```
### Windows
1. 安装 [Microsoft Visual Studio](https://visualstudio.microsoft.com/ru/downloads/) 2022 或更新版本。
2. 打开 "X64 Native Tools Comand Prompt for VS 2022" 终端:
```
# 准备 build 文件夹
mkdir -p build && cd build
# 运行 cmake
cmake -DCMAKE_BUILD_TYPE=Release -GNinja ..
# build 项目
cmake --build . -j4
# enjoy!
resl.exe
```
### Android
1. 安装 [Android Studio](https://developer.android.com/studio)
2. 在 Android Studio 中打开项目文件 "./android-project"
3. 选择你的设备或模拟器,点击 `Run 'app'` 按钮
### iOS
*只能在 Mac 电脑上进行构建!*
1. 安装 Xcode
2. 安装 [cmake](https://cmake.org/download/)
3. 在你下载源代码的目录中打开 `Terminal`
4. 运行以下命令:
```
mkdir build_ios && cd build_ios
cmake .. -DCMAKE_TOOLCHAIN_FILE=../ios/cmake/ios.toolchain.cmake -G Xcode -DSDL2IMAGE_BACKEND_IMAGEIO=OFF -DPLATFORM=OS64COMBINED
```
5. 在 Xcode 中打开 `build_ios` 项目
6. 选择 `resl` 目标,选择你的设备或模拟器并点击 `Run` 按钮
### WebAssembly (emscripten)
1. 安装 emscripten
https://emscripten.org/docs/getting_started/downloads.html
2. 在终端中:
```
mkdir -p build && cd build
emcmake cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . -j4
```
## 法律声明:
原版游戏由 **Doka** 于 1992 年制作。
由于年代久远,现在不清楚如何联系作者以获得对其产品进行逆向工程的许可。我希望他们不介意我赋予这款游戏第二次生命并将其适配到现代平台。
**我不打算获取任何利润,这个项目只是为了好玩。还原代码中所有算法的权利属于原版游戏的作者 (Andrei Snegov, DOKA)。**
### 有趣的事实
在[游戏手册的最后一章 "Inside SHORTLINE"](https://github.com/konovalov-aleks/reSL/blob/aff51dc2464df675437e3c788970195f1f74e7df/resources/RULES.TXT#L223C1-L230C35) 中,作者计划详细描述游戏机制。但该章节始终未能完成:
这个项目似乎实现了原版游戏作者的想法。毕竟,开源代码是对算法、公式和常数的最佳描述。
](https://konovalov-aleks.github.io/)
# reSL
逆向工程的 DOS 游戏 ShortLine v1.1 (DOKA 1992)
**你可以直接在浏览器中玩这款游戏:https://konovalov-aleks.github.io/**
访问 [发布页面](https://github.com/konovalov-aleks/reSL/releases/) 下载游戏。
## 当前状态
代码已完全恢复并适配了触控设备 ✅
*main* 分支包含了游戏的改进版本。
你可以在 ["original" 分支](https://github.com/konovalov-aleks/reSL/tree/original) 中看到最接近原版游戏的版本。如果你想学习逆向工程,这会很有用。每个函数都有一条注释指向原始二进制文件中该函数的偏移量——这能让你方便地将反编译器中的函数与重构后的代码进行对比。
## 项目的想法和目标:
本项目不追求任何利润,也不会用于商业目的。
该项目的目标是为了获得乐趣和经验,并将我最喜欢的童年游戏移植到现代移动平台上,使其适配触控操作。
## 为什么我选择了 v1.1,而不是最新的 v2.0?
我最初是对第二个版本进行逆向工程。但我很快意识到:
* 这个游戏与我童年时玩的有些不同。
* 而且它的运行情况更糟——没有动画,切换菜单时屏幕会闪烁。
* v2.0 是用 Pascal 编写的,使用了 BGI 库。而 v1.1 是用 TurboC 编写的,使用汇编部分来处理图形并实现一些复杂的机制(ShortLine 甚至使用了用汇编编写的协程!)。
所以,v1.1 运行得更好,而且反编译起来有趣得多。
## 与原版游戏的区别
本项目的目标是尽可能还原最初的 ShortLine,以便在现代设备上也能游玩。
因此,reSL 与原版游戏之间存在的差异皆归因于以下原因之一:
* 原版游戏是为 DOS 编写的,而 reSL 需要是跨平台的。
* 原版游戏存在 bug,不修复它们说不过去。
* 为了能够使用触控操作而进行的 UI 改进。
### 改进之处
1. 在所有菜单(主菜单、暂停菜单、记录、档案等)中支持使用鼠标/触摸。
2. 支持在没有鼠标的情况下控制游戏(长按代替鼠标右键单击,滑动代替同时按下两个鼠标按钮)。
3. 在 PC 上支持使用 `<空格>` 键代替同时按下两个鼠标按钮。
4. 建造模式下的网格线,用于简化定位,尤其是在触摸屏设备上。
5. 关闭“记录”屏幕时的动画(与其他屏幕的动画相同)。
6. 更好的错误处理(原版游戏在尝试读取损坏的存档文件时可能会崩溃或进入不可预测的状态)。([issue #17](https://github.com/konovalov-aleks/reSL/issues/17))
### 修复的原版游戏 Bug
1. 如果上一次游戏会话是在火车于第一个入口等待时停止的(黄色调度员正在显示旗帜),那么在开始新游戏时程序会卡死。
2. 加载画面会瞬间以错误的颜色绘制。
3. 如果用户在“档案”菜单中删除了最后一个文件,界面会损坏。([issue #7](https://github.com/konovalov-aleks/reSL/issues/7))
4. 如果用户删除了最后一个存档文件并运行新游戏,黄色入口永远不会出现。([issue #15](https://github.com/konovalov-aleks/reSL/issues/15))
5. 如果没有 RECORDS.TBL 文件,记录屏幕将不会被绘制 ([issue #37](https://github.com/konovalov-aleks/reSL/issues/37))
6. 如果用户在没有 'results.tbl' 文件的情况下开始新游戏,并且在中途没有任何中断(甚至没有打开暂停菜单)的情况下通关,标题栏会显示错乱 ([issue #53](https://github.com/konovalov-aleks/reSL/issues/53))
## 逆向工程过程
我反编译的文件的 MD5 哈希值:
原版游戏可以通过以下链接下载(版本 1.1):
https://www.old-games.ru/game/download/1232.html
我使用 Ghidra 作为主要工具:
https://github.com/NationalSecurityAgency/ghidra
在第一阶段,我的目标是尽可能恢复接近原始程序的代码。你可以在 ["original" 分支](https://github.com/konovalov-aleks/reSL/tree/original) 中看到该版本。
每个函数/全局变量都有一个类似 `/* 18fa:08d6 */` 的注释。这是该函数/变量在原始二进制文件中的地址。这对避免工作时产生混乱非常有帮助,对于想要将恢复的代码与反编译器中的外观进行比较的新手来说,这可能也很有趣。
### iOS
*只能在 Mac 电脑上进行构建!*
1. 安装 Xcode
2. 安装 [cmake](https://cmake.org/download/)
3. 在你下载源代码的目录中打开 `Terminal`
4. 运行以下命令:
```
mkdir build_ios && cd build_ios
cmake .. -DCMAKE_TOOLCHAIN_FILE=../ios/cmake/ios.toolchain.cmake -G Xcode -DSDL2IMAGE_BACKEND_IMAGEIO=OFF -DPLATFORM=OS64COMBINED
```
5. 在 Xcode 中打开 `build_ios` 项目
6. 选择 `resl` 目标,选择你的设备或模拟器并点击 `Run` 按钮
### WebAssembly (emscripten)
1. 安装 emscripten
https://emscripten.org/docs/getting_started/downloads.html
2. 在终端中:
```
mkdir -p build && cd build
emcmake cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . -j4
```
## 法律声明:
原版游戏由 **Doka** 于 1992 年制作。
由于年代久远,现在不清楚如何联系作者以获得对其产品进行逆向工程的许可。我希望他们不介意我赋予这款游戏第二次生命并将其适配到现代平台。
**我不打算获取任何利润,这个项目只是为了好玩。还原代码中所有算法的权利属于原版游戏的作者 (Andrei Snegov, DOKA)。**
### 有趣的事实
在[游戏手册的最后一章 "Inside SHORTLINE"](https://github.com/konovalov-aleks/reSL/blob/aff51dc2464df675437e3c788970195f1f74e7df/resources/RULES.TXT#L223C1-L230C35) 中,作者计划详细描述游戏机制。但该章节始终未能完成:
这个项目似乎实现了原版游戏作者的想法。毕竟,开源代码是对算法、公式和常数的最佳描述。标签:AI工具, Bash脚本, BGI库, DOS游戏, TurboC, Web游戏, 云资产清单, 协程, 单机游戏, 复古游戏, 开源游戏, 快速连接, 汇编语言, 游戏源码, 移动端适配, 童年游戏, 解密, 触摸控制, 跨平台移植, 软件重构, 逆向工程, 重制版