# ports_gof2 **Repository Path**: windstarry/ports_gof2 ## Basic Information - **Project Name**: ports_gof2 - **Description**: 浴火银河2的ports移植 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-15 - **Last Updated**: 2026-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 浴火银河2 HD(Galaxy on Fire 2 HD)掌机通用移植 > **来源说明**:本工程基于 star0081 的 TrimUI Smart Pro(TinaLinux 1.1.1)移植版本进行通用化改造。上游仓库:`https://github.com/star0081` > **项目定位**:将原仅适配 TrimUI 的移植改造为 **PortMaster 通用版本**,适配 aarch64 架构的通用掌机(EmuELEC 4.7-Nexus、ROCKNIX 等),不再依赖 TrimUI 专有路径(`/mnt/SDCARD/...`、`/usr/trimui/lib`)与固定块分辨率(1280×720)。启动脚本改为从 `$(dirname "$0")` 定位游戏目录,并接入 PortMaster 标准契约(`control.txt`、`sdl_resolution`、32 位运行环境 `PORT_32BIT`)。 > **状态:WIP(开发进行中)**。飞行/战斗玩法可正常运行,分辨率适配问题待修复(见"已知问题")。 仓库不包含 APK、OBB、`libgof2hdaa.so` 及 FMOD 的 `.so`,需自行放置(见安装)。 ## 适配范围 - 原版适配:TrimUI Smart Pro(TinaLinux 1.1.1,Allwinner A133P,PowerVR GE8300,1280×720) - 本通用版扩展:aarch64 通用掌机(EmuELEC 4.7-Nexus、ROCKNIX 等);实测设备屏 1024×768(4:3) - 复用机制:ARMv7 库映射、Bionic/JNI 兼容层、软浮点 ABI 转译、SDL 图形/输入/音频输出、GLES2 命令桥接 ## 64 位宿主支持(双进程 GL 桥接) 游戏本体是无源码的 32 位 ARMv7 Android 库(`libgof2hdaa.so`),aarch64 进程无法原生加载,因此采用"32 位运行时 + 64 位呈现进程"双进程架构: 1. **`gof2_runtime`(armhf 32 位 PIE)** 经 `ld-linux-armhf.so.3` 加载 `libgof2hdaa.so` 与 FMOD 运行期库; 2. **glbridge(32 位 GLES2 客户端 `libGLESv2.so.2`)** 把 GLES2 命令经本地 Unix 套接字 `/tmp/tsp-glbridge.sock` 转发给 64 位 `gof2_present`,后者独占持有真实 GL 上下文与显示面板并负责缩放; 3. **随包 armhf sysroot(`host-libs`)**:32 位 SDL2 + ALSA,服务 32 位运行时(EmuELEC 自带 32 位 SDL2 为精简构建,缺 offscreen/kmsdrm 等后端,故必须用随包 Debian SDL2); 4. **OBB 按需解包(`obb_index.c` + `puff`)**:资源从 zip 流式读取,无需整包解压到卡; 5. **OpenSL → SDL/ALSA 音频桥接(`opensl_bridge.c`)**:带 pump 线程与 `audio_lock`。 启动脚本(PortMaster 通用版)从 `control.txt` 的 `sdl_resolution` 取得真实屏分辨率,通过 `NFSMW_WIDTH/HEIGHT` 与 `TSPGL_WIDTH/HEIGHT` 分别传给 runtime 与 present;`present` 另通过 `TSPGL_WIN_WIDTH/HEIGHT`(目标覆盖)与 `TSPGL_PRESENT`(stretch/fit)控制输出窗口与缩放方式。 ## 功能特性 - 启动、闪屏、序章、进入太空 - 音效:语音(FSB5 English)、射击、UI、太空环境音;FSB 银行预读入内存(`FMOD_OPENMEMORY`) - 机库/空间站光标(Select)、列表拖拽(摇杆)、L1 = HUD 9 - 飞行中飞船摇杆、存档写入 `gof2/files/` 已知轻微问题(接受现状): - 机库背景音乐静默,其余音轨正常 ## 操作控制 | 动作 | 按键 / 轴 | |---|---| | 光标开关 | Select | | 退出 | Select + Start | | 光标(机库/空间站/菜单) | 右摇杆 / 十字键移动;A = 点按;按住 A 推摇杆 = 拖拽列表;B = 返回 | | 飞船摇杆 | 左摇杆 | | 油门 / 刹车 | 十字键 上 / 下 | | 曲速 / 加速 | 十字键 右 | | 开火 | A / R1 / R2 | | 导弹 | L2 | | HUD | L1 | | 视角前/后 | Y | | 暂停 | Start | 停靠空间站时光标自动开启,返回太空时自动关闭。完整映射见 `controls.txt`。 `GOF2_NATIVE_KEYS=1` 会在飞行中向引擎发送 Xperia 风格实体按键事件;默认关闭(引擎会把按键转成合成触摸拖拽,在站内拉摄像机)。 ## 安装 1. 将 PortMaster 通用版启动脚本 `浴火银河2.sh` 放到 `roms/ports_scripts/`(或 `roms/ports/`,视前端而定); 2. 将游戏资源目录 `gof2/` 放到 `roms/ports/gof2/`(含 `gof2_runtime`、`gof2_present`、`glbridge/`、`armhf/`、`host-libs/`、`src/`、`splash`、`controls.txt` 等); 3. 把合法获取的 APK 与 OBB 放入 `roms/ports/gof2/gamedata/`(见 `gamedata/README.txt`); 4. 在 PC 上运行 `powershell -ExecutionPolicy Bypass -File roms/ports/gof2/setup.ps1` —— 从 APK 抽取 `libgof2hdaa.so`、FMOD、`libcrypto`/`libssl` 到 `gamefiles/android-libs`; 5. 通过 PortMaster 启动「浴火银河2」。日志:`roms/ports/gof2/logs/gof2.log`。 不要改动固件 framebuffer。启动脚本为 POSIX `sh`(LF 换行,非 bash)。 ## 构建 使用 **Zig 0.13** 一键重建三件产物(`gof2_runtime` armhf / `gof2_present` aarch64 / `glbridge/libEGL.so.1` armhf): ```powershell powershell -ExecutionPolicy Bypass -File runtime/build.ps1 ``` `build.ps1` 按目标架构交叉编译并用 `Assert-Elf` 校验产物位数: - `gof2_runtime`:`-target arm-linux-gnueabihf -mcpu=cortex_a7` - `gof2_present`:`-target aarch64-linux-gnu.2.17` - `glbridge`:`-target arm-linux-gnueabihf -shared -fPIC` 前置条件:本机需安装 Zig 0.13(`https://ziglang.org/download/0.13.0/zig-windows-x86_64-0.13.0.zip`)。脚本内写死路径 `D:\PortMaster\tsp-eaprules\zig-windows-x86_64-0.13.0\zig.exe`,缺失时请安装到该路径或改用 `$env:ZIG` / 修改脚本首部。 ## 已知问题 ### 分辨率:1024×768 屏却按 1280×720 渲染(待修复) **现象**:在 1024×768(4:3)屏上进入游戏,画面仍按 1280×720(16:9)拉伸/裁切,无法满屏且比例失真。 **根因(已定位,尚未修复)**: - **主因**:`gof2/src/glbridge/server.c` 中呈现进程输出窗口被写死为 `win_w = 1280` / `win_h = 720`(与 nfsmw 修复前同源)。游戏画布(`game_w/game_h`)虽读取 `TSPGL_WIDTH/HEIGHT` 跟随 env,但输出窗口恒为 1280×720,导致 4:3 画面被拉伸到 16:9。 - **次因**:`gof2/src/runtime/screen_size.h` 将 `NFSMW_HEIGHT` 上限钳制为 `720`,导致游戏内部渲染高度恒为 720(即 1024×768 屏上约 48px 死区,并非安卓导航栏预留)。 **修复方案(参照 nfsmw 已验证做法)**: 1. 在 `gof2_present` 中移植 `resolve_win_size()`,按 `TSPGL_WIN_WIDTH/HEIGHT` → `/sys/class/graphics/fb0/virtual_size` → 兜底 1280×720 的优先级取真实面板尺寸,并在 `SDL_CreateWindow` 后用 `SDL_GL_GetDrawableSize` 重读 drawable; 2. 将 `screen_size.h` 的高度钳制由 `720` 抬到 `768`; 3. 修改后以 Zig 0.13 重建 `gof2_present` 与 `gof2_runtime`,重新部署到设备验证 `win 1024x768 (fb0 virtual_size)` 与无拉伸。 ### 大体积产物未入库 `host-libs`(30MB+)、`armhf/lib`、`gamedata`(APK/OBB)、`glbridge/*.so` 等大体积运行时产物不随源码提交,由 `build.ps1` 重建或设备端已有。 ## 资产来源 | 文件 | 说明 | |---|---| | APK HD 2.0.1 | SHA-256 见 `setup.ps1`;复制为 `gamedata/gof2.apk` | | OBB `main.47947006.net.fishlabs.gof2hdallandroid2012.obb` | 包名 `net.fishlabs.gof2hdallandroid2012` | | Native | `lib/armeabi/libgof2hdaa.so` + `libfmodex.so` + `libfmodevent.so` | ## 致谢 - 移植方案参考 NFS Most Wanted / Shadowgun 在掌机上的 glbridge、armhf、PortMaster 做法(nfsmw 分比率修复为本项目分辨率修复的原型) - FMOD Ex Event System —— Firelight Technologies(库取自 APK,不入库) - 原始 TrimUI 移植作者:**star0081** Galaxy on Fire 是 Fishlabs / Deep Silver 的商标。本项目为非官方的兼容性项目。