# ports_shadowgun **Repository Path**: windstarry/ports_shadowgun ## Basic Information - **Project Name**: ports_shadowgun - **Description**: shadowgun的移植 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-17 - **Last Updated**: 2026-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Shadowgun — PortMaster 通用移植(WIP) > **来源说明**:本工程基于 star0081 的 TrimUI Smart Pro(TinaLinux 1.1.1)移植版本进行通用化改造。上游仓库:`https://github.com/star0081/D-TRIMUI_SHADOWGUN` > **项目定位**:将原仅适配 TrimUI 的移植改造为 **PortMaster 通用版本**,适配 aarch64 架构的通用掌机(EmuELEC 4.7-Nexus、ROCKNIX 等),不再依赖 TrimUI 专有路径(`/mnt/SDCARD/...`、`/usr/trimui/lib`)与固定块分辨率(1280×720)。启动脚本改为从 PortMaster 契约(`control.txt`)定位游戏目录,并接入标准 `control.txt` / `sdl_resolution` / 32 位运行环境 `PORT_32BIT`。 > **状态:WIP(开发进行中)**。仓库骨架与构建链路已就绪,实机跑通待验证。 仓库不包含 APK、OBB、`gamefiles/android-libs/*.so` 及 runtime 二进制(`shadowgun_runtime` / `shadowgun_present` / `glbridge/*.so`),需自行放置(见安装与构建)。 ## 适配范围 - 原版适配:TrimUI Smart Pro(TinaLinux 1.1.1,Allwinner A133P,PowerVR GE8300,1280×720) - 本通用版扩展:aarch64 通用掌机(EmuELEC 4.7-Nexus、ROCKNIX 等) - 游戏:Shadowgun(Madfinger,2011),Unity **5.3.8f1 IL2CPP**,GLES **2.0**,纹理 **PVRTC**,ABI 仅 **armeabi-v7a** - 复用机制:ARMv7 库映射(elf32_loader)、Bionic/JNI 兼容层(jni_unity.c)、软浮点 ABI 转译(softfp_bridge)、SDL 图形/输入/音频输出、GLES2 命令桥接(glbridge) ## 64 位宿主支持(双进程 GL 桥接) 游戏本体是无源码的 32 位 ARMv7 Android 库(`libmain.so` / `libunity.so` / `libil2cpp.so`),aarch64 进程无法原生加载,因此采用"32 位运行时 + 64 位呈现进程"双进程架构(与 gof2 / nfsmw 同源): 1. **`shadowgun_runtime`(armhf 32 位 PIE)** 经 `ld-linux-armhf.so.3` 加载三个原生 `.so` 与 FMOD 运行期库; 2. **glbridge(32 位 GLES2 客户端 `libGLESv2.so.2`)** 把 GLES2 命令经本地 Unix 套接字 `/tmp/sg-glbridge.sock` 转发给 64 位 `shadowgun_present`,后者独占持有真实 GL 上下文与显示面板并负责缩放; 3. **随包 armhf sysroot(`host-libs`)**:32 位 SDL2 + ALSA,服务 32 位运行时(EmuELEC 自带 32 位 SDL2 为精简构建,缺 offscreen/kmsdrm 等后端,故必须用随包 Debian SDL2); 4. **OBB 按需解包(`zip_obb.c` + `puff`)**:资源从 zip 流式读取,无需整包解压到卡; 5. **OpenSL → SDL/ALSA 音频桥接(`opensl_bridge.c`)**:带 pump 线程与 `audio_lock`。 启动脚本(PortMaster 通用版)优先用 `fbset` / `/sys/class/graphics/fb0/virtual_size` 实测物理屏分辨率(`DISPLAY_*` 仅兜底),通过 `NFSMW_WIDTH/HEIGHT` 与 `SG_WIDTH/HEIGHT` 分别传给 runtime 与 present;`present` 另通过 `SG_WIN_WIDTH/HEIGHT`(目标覆盖)与 `SG_PRESENT`(stretch/fit)控制输出窗口与缩放方式。 所有桥接参数统一使用 `SG_*` 前缀(Shadowgun),不再沿用 `TSP*`(TrimUI Smart Pro)——本项目已脱离仅适配 TSP 的范围,见 `runtime/glbridge/protocol.h` 的 `SG_SOCK` / `runtime/glbridge/server.c` 的 `SG_*` env 读取。 ## 操作控制 `controls.txt` 为轴/按键重映射表,无需重建即可调整。BUILD 76 已知绑定: | 动作 | 按键 | |---|---| | 移动 | 左摇杆 | | 视角 | 右摇杆 | | 射击 | R2 | | 跳跃 / 冲刺 | L1 | | 换弹 | R1 → Axis 5+ | | 瞄准(候选) | L2 → keycode R3 | | 菜单 | D-pad + A | | 退出 | Select + Start | ## 安装 1. 将 PortMaster 通用版启动脚本 `Shadowgun.sh` 放到 `roms/ports_scripts/`(或 `roms/ports/`,视前端而定); 2. 将游戏资源目录 `shadowgun/` 放到 `roms/ports/shadowgun/`(含 `shadowgun_runtime`、`shadowgun_present`、`glbridge/`、`armhf/`、`host-libs/`、`src/`、`controls.txt`、`setup.ps1` 等); 3. 把合法获取的 APK 与 OBB 放入 `roms/ports/shadowgun/gamedata/`(APK:`SHADOWGUN_1.7.0_PowerVR_RU_MOD_sign.apk`;OBB:`main.170300014.com.madfingergames.shadowgun.obb`); 4. 在 PC 上运行 `powershell -ExecutionPolicy Bypass -File roms/ports/shadowgun/setup.ps1` —— 从 APK 抽取 `libmain.so` / `libunity.so` / `libil2cpp.so` 到 `gamefiles/android-libs`,解包 OBB 到 `Android/obb/com.madfingergames.shadowgun/`; 5. 通过 PortMaster 启动「Shadowgun」。日志:`roms/ports/shadowgun/log.txt`。 不要改动固件 framebuffer。启动脚本为 `bash`(LF 换行,非 TrimUI 专版的 POSIX `sh`)。 ## 构建 使用 **Zig 0.13** 一键重建三件产物(`shadowgun_runtime` armhf / `shadowgun_present` aarch64 / `glbridge/libEGL.so.1` armhf): ```powershell powershell -ExecutionPolicy Bypass -File runtime/build.ps1 ``` `build.ps1` 按目标架构交叉编译: - `shadowgun_runtime`:`-target arm-linux-gnueabihf -mcpu=cortex_a7` - `shadowgun_present`:`-target aarch64-linux-gnu.2.17` - `glbridge`:`-target arm-linux-gnueabihf -shared -fPIC` 前置条件:本机需安装 Zig 0.13。脚本优先读取 `$env:ZIG`,其次探测 `runtime/zig-windows-x86_64-0.13.0/zig.exe` 与已知路径。 ## 已知问题 / TODO 来自 TrimUI BUILD 76 状态(star0081): 1. **精确瞄准**:BUILD 76 的 `L2 → R3` 候选瞄准需在实机确认;若引擎内置 Xbox profile 未启用瞄准,需 UI 内手动绑定或写入 `prefs.txt` / `Gamepad*`。 2. **画面比例**:游戏略超出屏幕边缘(viewport / presenter stretch 当前 640×480 → 1280×720),需调 scale/safe area,**不**动 stock framebuffer。 3. **过场视频**:`introHD.mp4` 与 in-game VideoPlayer 在掌机无 Android MediaCodec 路径;方案为 skip/stub 或外接 SDL/FFmpeg 解码。 4. **杂项**:glbridge sock/ready 已重命名为 `sg-*`(套接字 `/tmp/sg-glbridge.sock`、就绪标志 `/tmp/sg.present.ready`,见 `runtime/glbridge/protocol.h` 的 `SG_SOCK` 与 `runtime/glbridge/server.c`),避免与 NFS 同跑冲突;全部桥接标识符(宏 / 结构 / 函数 / 日志前缀 / env)已由 `TSPGL*` 统一改名为 `SG*`;部分 UI 文本(本地化)为空,影响菜单与绑定调试。 ## 资产来源 | 文件 | 说明 | |---|---| | APK `SHADOWGUN_1.7.0_PowerVR_RU_MOD_sign.apk` | SHA-256 `aa8e1863d90de72ea0fd80fdee748e6f37695cfd2703a9295da14a523c3caada` | | OBB `main.170300014.com.madfingergames.shadowgun.obb` | 包名 `com.madfingergames.shadowgun`,SHA-256 `a61516f5a0fe2b138ebcfd88ad9b065c53f6426775c4f14e16e6d3de6f9766e3` | | Native | `lib/armeabi-v7a/libmain.so` + `libunity.so` + `libil2cpp.so`(不加载 `libHellCPU.so`) | ## 致谢 - 移植方案参考 NFS Most Wanted / Galaxy on Fire 2 在掌机上的 glbridge、armhf、PortMaster 做法(nfsmw 分比率修复为本项目分辨率修复的原型) - 原始 TrimUI 移植作者:**star0081** Shadowgun 是 Madfinger Games 的商标。本项目为非官方的兼容性项目。