# armored **Repository Path**: graviton/armored ## Basic Information - **Project Name**: armored - **Description**: No description available - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-23 - **Last Updated**: 2026-10-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Armored Strike — Web 重制 把 2010 年 Requiem Software Labs 的安卓回合制炮战游戏《Armored Strike》(v2.090) 重制成浏览器版本, 用来研究"老手游如何迁移到现代平台"。原始美术/音频来自 APK,代码全部重写。 ![主菜单](docs/screens/menu.png) **技术栈**:TypeScript + Bun(构建/开发服务器)+ Canvas 2D(无游戏引擎)+ Python/Pillow(资产管线)。 ## 快速开始 ```bash cd web bun install bun run dev # http://localhost:5173 ``` 已提取的资产(`web/public/assets/`)随仓库提交,**克隆后不需要 APK 就能直接运行**。 界面默认中文,可在 **设置 → 语言** 切到 English。 联机对战需要另开一个进程(服务器权威,和客户端共用同一份 `game/`): ```bash cd web bun run server # ws://127.0.0.1:8787 ``` 生产构建与本地预览: ```bash bun run build # -> web/dist(含资产,可直接静态托管) bun run preview # http://localhost:4173 ``` ## 操作 | 输入 | 作用 | | --- | --- | | 鼠标移动 | 瞄准(角度 + 力度由指针位置决定),虚线为弹道预测 | | 单击 | 开火;按住拖动只调整瞄准,松手不会开火 | | A / D | 驾驶坦克左右移动(消耗燃料,也是捡空投的方式) | | ← → | 角度 ±1°(Shift ±5°) | | ↑ ↓ | 力度 ±1(Shift ±5) | | Q / E | 切换武器(跳过没有弹药的) | | Tab | 打开武器库(分类浏览全部 44 件,点击选用) | | 设置 → 语言 | 中 / 英文切换(默认中文,立即生效并保存) | | 1–9 | 快捷选择武器栏最左侧的 9 个槽位(武器条同时显示 13 个) | | 滚轮 / `-` `=`(或 `[` `]`) | 缩放镜头(50%–170%,拉到最低可看到整个战场) | | R | 重开一局(会先弹出确认,防误触) | | Esc | 暂停菜单 | | M | 静音 | ## 已实现(相对原作) - 320p 逻辑分辨率、整数倍缩放,直接复用原始 8-bit 调色板 PNG 与 OGG 音效 - 可破坏地形:逐像素位图 + 爆炸挖洞 + 地表塌陷/摔落伤害 - 抛物线弹道:重力 + 风力,固定步长积分,预测线/实弹/AI 三方共用同一套积分器 - 11 种原版载具(坦克/机甲/机器人),各自独立的炮管帧数(13/15/16/17)与装甲/射程/伤害加成 - 15 张原版背景与对应地形(山地/平原/沙漠/丛林/洞穴/月球/城市/异星……),6 种地貌生成器 - 44 件武器/道具(原版 `icon_*` 全表):迫击炮、集束、空爆、跳弹、定时引信、凝固汽油、 毒气、导弹群、蜘蛛机器人、9 种空袭、修理/燃料/装甲/迷雾/破坏 - 两种军械规则:**空投补给**(普通模式)开局只有无限迫击炮,武器/燃料/HP/装甲靠降落伞箱, 开过去压上去才能拿走;**自由军械**(练习模式)44 件全开,方便试手感 - 风力开关:开启时每回合随机风向与强度(无风→飓风),关闭后所有炮弹直线飞行 - 弹道辅助开关:开启时显示完整弹道与落点环;关闭后只显示起手约 1/5 的弧线(末端淡出), 保留瞄准手感但不再直接给出落点 - CPU 会按局势挑武器(受伤先修理、近距离霰弹/导弹/蜘蛛、远距离用预测最准的特种弹, 大威力弹会留到后面),也会开车去抢最近的空投 - 练习用血量:选局界面可选 100 / 200 / 300 / 500,双方同时生效(修理与医疗箱按上限结算) - 燃料可跨回合结存(上限 150,每回合补 100),Extra Fuel 与燃料箱不再浪费 - 信息反馈:伤害飘字、`你的回合 / 敌方回合` 横幅、切武器时显示伤害/范围/弹药 - 敌方角度、力度与燃料默认隐藏;HUD 区域点击不会误开火,拖拽瞄准也不会松手就走火 - 联机房间支持可选密码(建房与加入共用密码输入框) - 主菜单新增 **快速对战**(沿用上次选局)与 **练习场**(自由军械 + 300 血 + 无风) - 军火商店:用对局赚到的钱购买额外弹药,最多存 2 个弹匣,购买量会带进后续单机对局 - 武器库面板(Tab)按迫击炮/火焰/毒气/导弹/空袭/机器人/直射/支援分类 - 设置里可重绑开火/切换武器/左右移动/重开/静音,并切换蓝橙配色(色盲友好,血条另有刻度) - 联机建房可选 HP、自由军械/空投补给、有风/无风;房间列表会显示这些规则 - 联机每回合 60 秒倒计时,超时由服务器跳过该回合;补给模式的空投箱会实时同步 - 累计型成就(击杀/树木/地形/连胜/胜场)显示进度条与 `当前/目标` - 持续效果有对应的画面:燃烧地面带上升余烬、毒气云带飘动微粒、大爆炸(雏菊/核弹)留下 烟柱;雏菊炸弹本身仍是纯爆炸,没有持续伤害 - 中文 / English 双语界面:菜单、选局、HUD、地图/载具/武器名、成就与手册全部本地化 - 可破坏/可燃烧的树木(原版 7 段受损美术),火会蔓延并烧伤坦克 - 回合制流程、风力每回合随机(CALM…HURRICANE)、三局两胜 - AI:粗搜 + 精搜,用同一积分器评分,最后加入"手抖"误差 - 爆炸粒子(闪光/冲击环/烟/火星/碎屑)、镜头缩放跟随、震屏 - HUD:血量、风力、回合、弹药、角度/力度 - 原版 MIDI 主题曲用 WebAudio 振荡器合成播放(没有采样音源) - 完整单机流程:主菜单 → 选图/选车/难度/回合数 → 战斗 → 暂停 → 结算 → 生涯记账 - 20 个成就、军衔(Recruit/Veteran/Elite)、经验与金钱,存 `localStorage`(带版本化迁移) - lite/full 内容分层(对应原作免费版与内购版),设置里有音量/音乐/震屏/玩家名开关 - 联机对战:Bun WebSocket 服务器权威回合、4 位房号/私局密码/房间列表、快照同步、 断线重连(token)、房间聊天;客户端只发送角度/力度/武器,服务端跑同一套积分器 ![战斗画面](docs/screens/battle.png) ![选局界面](docs/screens/setup.png) ![结算界面](docs/screens/results.png) ![联机房间](docs/screens/online.png) ## 尚未实现 进度与优先级见 **[docs/PLAN.md](docs/PLAN.md)**(按里程碑 M0–M6 列出已完成 / 进行中 / 未开始)。 - 观战/排行榜、联机中的载具移动、武器商店、结算奖项、按键重绑定、降落伞兵补给 ## 仓库结构 ``` . ├── inputs/ 原始 APK 存放处(不入库,见 inputs/README.md) ├── tools/ │ ├── extract_assets.py APK → web/public/assets(图片/音频/manifest) │ ├── sample_palette.py 从 15 张背景取样,生成 maps.ts 的配色 │ ├── dump_strings.py 导出 resources.arsc 字符串池(武器/载具/成就文案) │ └── shot.ts CDP 无头截图(Chrome),用于视觉回归 ├── docs/ │ ├── NOTES.md APK 逆向记录(加固、资源清单、玩法证据) │ ├── PLAN.md 重写计划:里程碑、已完成/未完成、技术债 │ └── screens/ README 截图 ├── web/ TypeScript 客户端(Bun 工程) │ ├── index.html │ ├── public/assets/ 已提交的提取产物(813 图 + 50 音频 + manifest) │ ├── server/index.ts 房间 + 权威对战 WebSocket 服务器(bun run server) │ ├── src/ │ │ ├── core/ math · assets · audio · midi · storage(localStorage 存档) │ │ ├── game/ terrain · vehicle(s) · weapons · trees · physics · ai · particles · world · maps │ │ ├── render/ renderer · terrain-view · camera · hud │ │ ├── net/ protocol.ts(消息类型)· session.ts(客户端状态机) │ │ ├── ui/ ui.ts:DOM 菜单(主菜单/选局/设置/成就/在线/帮助/暂停/结算) │ │ └── main.ts 应用状态机(menu/battle/paused/results)、输入、主循环 │ ├── scripts/ build · dev(热重建) · preview · debug-ai │ └── tests/ sim.test.ts · progress.test.ts · net.smoke.ts(bun run net-smoke) ├── pyproject.toml / uv.lock Python 侧工具依赖(Pillow) └── .editorconfig / .gitattributes / .gitignore ``` 设计要点:`game/` 目录完全不碰 DOM,`World` 可以在 Bun 里直接跑(见 `bun test`), 渲染层只读状态。以后要做服务器权威联机,可以直接把 `game/` 搬到 Bun 服务端复用。 ## 资产管线 ```bash uv sync uv run tools/extract_assets.py # 需要 inputs/Armored_Strike_v2.090.apk ``` 只读取 APK(不修改),输出到 `web/public/assets/`:`art/*.png`、`audio/*.ogg|*.mid` 以及 `manifest.json`(尺寸 + 精灵条帧矩形)。 ## 校验 ```bash cd web bun test # 31 个用例:地形/弹道/AI/回合/武器/载具/地图/生涯/存档 bun run typecheck # strict 模式类型检查 bun run build # 生产构建自检 bun run net-smoke # 双客户端联机端到端(自动拉起服务器) ``` 视觉验证(需要本机 Chrome;用 `SHOT_BROWSER=/path/to/chrome` 可覆盖): ```bash bun tools/shot.ts http://127.0.0.1:5173/ shots/title.png 2500 bun tools/shot.ts http://127.0.0.1:5173/ shots/fire.png 2000 "640,400;1100,120" 1200 ``` ## 关于原始 APK - `com.requiem.armoredStrike.cn` / v2.090 / `minSdk=2` / `©2010 Requiem Software Labs` - 纯 Java + 原生壳:真正的游戏 DEX 被 SecApk(梆梆系)加密在 `assets/bangcle_classes.jar` (473 KB、熵 8.0),`libsecexe/libsecmain.so` 只是脱壳壳;没有 Unity/UE 引擎 - 这是国内汉化 + 广告重打包版(PiPi汉化组、酷果/BigHead 广告),不是官方原包 - 细节与证据见 [docs/NOTES.md](docs/NOTES.md) - 美术/音乐版权归原作者;本项目仅用于学习交流,未用于商业用途,APK 本身不入库