codengine/DasErbe

GitHub: codengine/DasErbe

经典DOS冒险游戏Das Erbe的C#/.NET现代重制版,通过逆向工程原始资源实现跨平台桌面运行并增加现代化交互改进。

Stars: 1 | Forks: 0

# 遗产

grafik

grafik

本仓库包含 **Das Erbe** 的非官方 C#/.NET 桌面重制版。运行时会从原始的 DOS 可执行文件中读取数据和文本,加载原始的 `ERBE.DAT`、`ERBE.GAM` 和 `GRAFIK` 资源,并通过 MonoGame DesktopGL 呈现游戏。 本仓库的结构如下: - `src/Game.Core` 包含游戏运行时和重制版的游戏行为。 - `src/Game.Shared` 包含共享的资源、渲染、输入、可执行文件映像和日志记录支持。 - `src/Game.Desktop` 是 MonoGame 桌面宿主。 - `Game` 是从仓库根目录运行时使用的默认原始资产根目录。 - `tools/DumpStrings` 提取原始可执行文件的字符串,用于创建翻译覆盖文件。 ## 移植说明 这是对原版游戏的逆向工程源代码移植。它力求贴近源代码,甚至存档文件格式也与 DOS 版本兼容。 添加了一些微小的便利性更改,让你可以稍微“现代化”地游玩游戏,例如悬停会改变状态栏文本。 ## 关于游戏 有关游戏的信息可以在这里找到: - [Mobygames](https://www.mobygames.com/game/12352/das-erbe/) - [adventurecorner.de](https://www.adventurecorner.de/game/2558/das-erbe) - [Werbespiel Blog](https://werbespiel.blogspot.com/2010/07/das-erbe.html) ## 新增功能 - 翻译支持 (`--language`) - 鼠标悬停与点击操作(将立即显示热点提示,无需点击即可查看,且交互不需要单独的确认点击,可通过 `--use-classic-interactions` 关闭) - 热点高亮(空格键) - DKSN 模式(将显示一些后备响应,而不是……什么都没有,`--dksn-mode`) - 来自 amiga 版本的开场音乐 - 你可以使用键盘/数字小键盘来操作游戏内的密码盘 ## 错误修复 - 修复了前往城市、返回、上楼后无法离开房间的软锁问题 - 修复了在已经拿走宣传册的情况下离开自助洗衣店时,宣传册会重新出现的视觉故障 - 修复了在自助洗衣店内保存和加载会导致视觉损坏的问题 - 修复了进入自助洗衣店时的异常/边缘情况 - 修复了图像覆盖层绘制不一致的问题 - 修复了在游戏开始时可以选择“家伙”的问题 ## 环境要求 - [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) - 一套受支持的原始 Das Erbe 游戏资产 启动时,引擎需要在资产根目录中存在 `ERBE.EXE`,并会验证受支持的可执行文件: - 大小:`50096` 字节 - MD5:`6ceee7395fd9965853e9fcfc0b227480` 其余的游戏文件(包括 `ERBE.DAT`、`ERBE.GAM` 和 `GRAFIK` 目录)必须保留其原始名称和目录结构。 ## 构建 在仓库根目录下运行以下命令: ``` dotnet build src/Game.sln ``` 翻译实用工具不是 `Game.sln` 的一部分;需要时请单独构建: ``` dotnet build tools/DumpStrings/DumpStrings.csproj ``` 在这两个命令中添加 `-c Release` 即可进行 Release 构建。 ## 运行 在仓库根目录下,使用以下命令运行桌面宿主: ``` dotnet run --project src/Game.Desktop/Game.Desktop.csproj ``` 这会将当前工作目录下的 `Game` 用作资产根目录。资产根目录的解析顺序如下: 1. `--asset-root` 2. `GAME_ASSET_ROOT` 环境变量 3. `<当前工作目录>/Game` 通过 `--asset-root` 或 `GAME_ASSET_ROOT` 提供的值必须是绝对路径。要通过 `dotnet run` 传递选项,请将它们放在 `--` 之后: ``` dotnet run --project src/Game.Desktop/Game.Desktop.csproj -- --asset-root "C:\Games\Das Erbe" --language en ``` ### 运行已构建的游戏 Debug 构建完成后,在仓库根目录下运行构建好的游戏: ``` dotnet src/Game.Desktop/bin/Debug/net10.0/Game.Desktop.dll ``` 对于 Release 构建,请使用相应的 Release 输出: ``` dotnet src/Game.Desktop/bin/Release/net10.0/Game.Desktop.dll ``` 在 Windows 上,可以直接启动生成的应用程序宿主: ``` .\src\Game.Desktop\bin\Debug\net10.0\Game.Desktop.exe ``` 将游戏选项直接传递给构建好的 DLL 或可执行文件;`--` 分隔符仅被 `dotnet run` 需要: ``` dotnet src/Game.Desktop/bin/Debug/net10.0/Game.Desktop.dll --language en ``` 从仓库根目录运行这些命令将继续使用 `Game` 作为默认资产目录。从其他工作目录启动构建好的游戏时,请提供绝对的 `--asset-root` 路径,或将 `GAME_ASSET_ROOT` 设置为绝对路径。 ### 窗口控制 按 Alt+Enter 切换无边框窗口模式。 ## 桌面命令行选项 用法:`Game.Desktop [options]` | 选项 | 含义 | | --- | --- | | `--asset-root ` | 使用该绝对路径作为原始游戏资产根目录。此选项优先于 `GAME_ASSET_ROOT` 和默认的 `Game` 目录。 | | `--log-level ` | 设置最低日志级别。可接受的值为 `trace`、`debug`、`info`、`warn` 和 `error`;默认值为 `info`。 | | `--log-file ` | 将日志写入此路径。默认值为当前工作目录下的 `logs/game.log`。 | | `--no-console-log` | 禁用控制台日志记录。文件日志记录保持启用状态。 | | `--language ` | 从资产根目录加载 `.txt` 作为翻译覆盖文件。提供名称时不带 `.txt`,例如 `--language en`。 | | `--integer-scaling ` | 当为 `true`(默认)时,将缩放限制为整数倍。当为 `false` 时,使用清晰的、连续拟合的 4:3 缩放。 | | `--use-classic-interactions` | 保留原始的双重确认交互流程。如果没有此选项,宿主将使用现代化的交互流程。 | | `--dksn-mode` | 对于没有实现的热点场景操作,显示各种德语的、特定于命令的后备响应。 | | `--mute-log-channels ` | 静音以逗号分隔的日志通道列表。此选项可重复使用;`all` 可静音所有通道。 | | `--unmute-log-channels ` | 取消静音以逗号分隔的日志通道列表。此选项可重复使用;`all` 可启用所有通道。取消静音的选择将在静音选择之后应用。 | 日志通道名称不区分大小写:`Logging`、`Program`、`Runtime`、`Input` 和 `Files`。 初始日志配置也可以通过 `LOG_MIN_LEVEL`、`LOG_CHANNELS` 和 `LOG_CONSOLE` 提供。显式的命令行日志选项会修改或覆盖这些值。`LOG_CHANNELS` 接受以逗号分隔的通道名称、`all`,以及带有 `-` 前缀的名称来禁用它们。`LOG_CONSOLE` 接受 `1`、`true`、`yes` 或 `on` 以及 `0`、`false`、`no` 或 `off`。 ## 翻译 翻译是以 UTF-8 编码存储在资产根目录顶层的文本覆盖文件。每个非空行将一个稳定的字符串标识符映射到一个带引号的值: ``` Shared_ConfirmationPrompt="Please click Yes or No!" Intro_Page1="The Environment Agency\npresents\n\nD A S E R B E" ``` 覆盖文件可以仅包含需要翻译的字符串。缺失的条目将继续使用从 `ERBE.EXE` 中提取的原始文本。键不区分大小写。值支持 `\\`、`\"`、`\n`、`\r` 和 `\t` 转义字符。请保持翻译后的字符能够在 CP437 中表示;对于无法在该字符集中进行往返转换的值,引擎将记录警告。 ### DumpStrings 翻译工具 `tools/DumpStrings` 从 `ERBE.EXE` 中提取所有已知的原始字符串,从 CP437 对其进行解码,并写入一个可直接编辑的覆盖文件。请使用与受支持游戏版本相匹配的可执行文件,因为提取器会从其 DOS MZ 映像中读取已知的偏移量。 ``` dotnet run --project tools/DumpStrings/DumpStrings.csproj -- --exe Game/ERBE.EXE --out Game/my-language.txt ``` | 选项 | 含义 | | --- | --- | | `-h`, `--help` | 显示该实用工具的命令行帮助。 | | `--exe ` | 必需。从该游戏可执行文件中读取原始字符串。该文件必须存在。 | | `--out ` | 将 UTF-8 覆盖文件写入此文件。如果省略,生成的覆盖文件将被写入标准输出。 | 创建翻译的步骤: 1. 将 `ERBE.EXE` 转储到资产根目录下的一个新的 `.txt` 文件中。 2. 翻译带引号的值,同时保留标识符和覆盖文件语法。 3. 使用文件名(不带扩展名)启动游戏:`--language my-language`。 如果缺少覆盖文件,游戏将使用原始文本。无效的行和未知的标识符将被跳过,并在 `Files` 日志通道中报告。 ## 许可证 有关 GNU General Public License v3 许可证,请参阅 [LICENSE](LICENSE)。
标签:MonoGame, 云资产清单, 冒险游戏, 游戏, 逆向工程