# RBP **Repository Path**: brutty/RBP ## Basic Information - **Project Name**: RBP - **Description**: RPG背包系统 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-18 - **Last Updated**: 2026-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: mindustry, Mod, RPG ## README # RPG 背包与装备系统(RBP) > Mindustry Java Mod:为游戏加入 RPG 式装备 **掉落 / 锻造 / 升级 / 仓库 / 穿戴** 系统,并可用原版载荷物流跑成一条自动装配流水线。本文件前半为项目说明,后半保留原模板的构建指引。 ## 📌 项目当前进度(2026-10-17) ### 已实装 - **装备数据层**:`Module` 蓝图(引擎/装甲/反应堆/武器/特殊五槽)+ 实例 `gearJson`(品质 tier / 耐久 / 词缀 / 标签);`GearRegistry` 以稳定 `long uid` 作为全局实例的**唯一真相源**,容器只持引用 ⇒ “用一个少一个” - **装备掉落方块**:可放置、可拾取、可拆除回收;`instantDeconstruct` 保证读档不残留“选不中也拆不掉”的伪方块;落到地上的装备转中立 - **生产链**:装备锻造台(白板)→ 载荷物流 → 装备升级台(逐级重 roll,**“一次一升”**:升满一级即锁定并吐出,须重新装入才能再升下一级) - **穿戴与属性**:绝对值模型,经“每单位一份动态 `StatusEntry`”落地(不改 `UnitType`、不逐件挂 status);血量直改 `maxHealth`;武器模块「改形态」(元素附魔 + 伤害/射速/射程烘焙 + 弹头染色) - **负荷预算**:`loadCost` / `capacity` 双向校验,反应堆抬容量 ⇒ 小单位上装机顺序真的有影响 - **耐久**:四条消耗通道(穿上/卸下/爆掉/战斗)**游戏内可调**(存在 `Core.settings` 里、不随存档走,单位是点数);磨光的件不上流水线,修理走升级台 - **装备仓库终端**:全局池 + 大窗面板(与背包同一套卡片骨架);自动出货按「模块 + 最低品质 + 出货编号 1..4」,受下游需求门控,多余的从装配机回收口退回 - **改造台**:全 mod **唯一**的“开背包”入口;直接用原版 `commandable` 做集结点(指挥模式下点方块再点位置);改造完自动放出(带开关) - **装配机**:单位与装备载荷双向对接,**四格缓冲**按模块归位;先装提供容量的件、再装消耗容量的件;压满 5 秒仍装不上的自动退回仓库(面板给倒计时) - **打野玩法(2026-10-11 新增,2026-10-15 重构;敌军穿装备默认关)**:① 敌方波次单位可穿装备——`EnemyGearSystem` 挂原版 `UnitCreateEvent`,按 `Core.settings` 开关 `rbp_enemy_gear`(**默认关 ⇒ 原版行为不变**)roll 一层**纯数值 buff**(复用 `RBPstatus.refreshGearStats`,不进 `GearRegistry`/背包名单);② 野怪刷怪点方块 `gear-spawn-point`(`size=2`)按营地等级 `campTier` **周期刷一波**(每波 `maxAlive` 只),怪挂 **`state.rules.waveTeam`**(而非 `derelict`——`Units.closestEnemy` 会跳过 derelict,导致炮塔打不到、野怪也不打建筑;挂 waveTeam 后玩家炮塔能索敌、野怪能反打,且 `getCap(waveTeam)` 为无限⇒不会一出生被 unitCap 秒死);**一波清空→营地自动升一级**,最高级再清空→变**废墟**停刷;③ 自定义 `WanderAI` **直接继承原版 `GroundAI`**(2026-10-17 改口径):战斗索敌/瞄准/开火全部交还原版管线(per-mount 独立瞄准,修好上一版自写“每帧 retarget + 强制 faceTarget”导致的“准头差、打不中”),mod 只加两层皮——营地附近**游荡** + 离家超 `leash` **牵绳折返**;另保留 `hit(Bullet)` 仇恨记忆(把“最近在打我的攻击者”作为候选目标插到原版索敌之前,超武器射程也不忘,仍受牵绳约束);营地方块 `underBullets=true` 免疫流弹 + `health=3200`/`armor=25` 加硬 + 缓慢自修(约 60 HP/s;溅射只判“异队”,任何免疫位都拦不住),且 `WanderAI.target()` 硬门排除把营地当目标(防 `coreCapture` 图 derelict 进索敌集合);**无配置面板**(`configurable=false`,2026-10-17 起),升级全自动,进度只看右上角常驻小号 `Lv.N` 角标(废墟变灰);④ 击杀按 `campTier`+体型**掉随机属性装备**,档位用 `min(roll,roll)` “取两次之低”⇒低档常见、顶级稀有;⑤ 背包左栏「玩法设置」面板统一开关与强度档。**营地本体留 `Team.derelict`(波次/野怪都不拆自家刷怪点),全程不改原版机制。** - **标签系统**:预设分类 + 自定义标签;“查看筛选”与“出货编号”刻意分开 - **UI**:背包与仓库宽屏两栏 / 窄屏单列,安卓自适应;卡片、详情、标签编辑两处复用同一实现;被改造单位带视觉标记(低成本粒子,不影响帧率);**2026-10-11 修复手机横/竖屏与桌面窄窗的单列自适应**(单列宽钉到 `dialogW`);**2026-10-17 结构性治好移动版头部“切换钮/标签仍被切”**:切换钮与标签 pane 原本同一行,Arc 不会压小超 pref 的 growX 格,两者 pref 一加必超列宽、右端被裁——现在拆成两行、逐格钉死 `dialogW`(弃 growX),chip 换行预算同源,两个大窗同步。 - **存档**:玩家/单位/仓库数据写平行文件 `.rbp`,与主存档隔离(mod 被移除后主存档仍正常加载);方块侧 `write/read/version` 分档,旧档必读不炸 ### 未实装 / 待办(详见 `docs/开发文档.md` 末「仍欠」) - ⏳ 词缀与套装:仅存储与显示,尚未作用于单位(护盾/回复/暴击/吸血同上) - ⏳ 独特像素图标:三个流水线方块与各装备图标仍是占位图(**自己出图**) - ⏳ 装配机退件冷却 `blockedModule` 仍是单格粒度(四件同时被拒时只挡一种) ### 已知限制 - 与载荷物流对接的方块统一 3x3 ⇒ `hitSize > 24` 的大单位进不了改造台/装配机(引擎硬限制) - 载荷往返会把小数耐久截断成 `int`(方向上是保守的:只会提前判损坏,不会免费回满) - 改造状态只对当局游戏生效(已拍板:不跨存档持久化,以免引入“单位已死 / id 回收重用”的垃圾清理问题) - 不 hook 原版机制(如 `PayloadUnloader.instantDeconstruct` 会直接销毁装备载荷)—— 这是**已拍板的边界**,不是待修 bug - 野怪的游荡靠自定义 `WanderAI`(继承原版 `GroundAI`,战斗走原逻辑),**不随存档持久**(原版读档会用 `type.createController` 复位控制器),重开后已存在的野怪会短暂回到默认 AI,直到营地重新刷怪(与“单位运行态不跨当局持久”同一边界) > 完整规格见 `docs/游戏设计文档.md`,架构与实现细节见 `docs/开发文档.md`(§2.5 类体系、§2.6 统一口径、§2.7 方块端口与持久化)。开发日志已按主题 / 月份拆分为 `docs/开发日志-2026-09.md`、`docs/开发日志-2026-10.md`。 ## ⚠️ 本地部署提示(重要) 改完代码后 **`gradlew compileJava` 不会更新游戏实际加载的 mod**。正确步骤: 1. `gradlew jar`,产物在 `build/libs/RBP-v...Desktop.jar`; 2. 复制到 Mindustry 模组目录(Windows 一般在 `%APPDATA%\Mindustry\mods\`); 3. **完全重启游戏**(mod 类在启动时加载,回主菜单不够); 4. 模组目录里 **只保留一份** RBP 包——多份会因内部 id 相同而冲突(典型症状:读档后多出选不中的方块、方块重复注册),而且游戏可能加载到旧版本; 5. 包名里的版本号来自 `mod.hjson`(构建时读取),改了 `mod.hjson` 必须**重新出包**才生效。 --- # Mindustry Java Mod 模板 一个适用于 Mindustry 的 Java 模组开发模板,同时支持 Android 和 PC 桌面端。Kotlin 版本的模组模板请参见[此处](https://github.com/Anuken/MindustryKotlinModTemplate)。 ## 🚀 关键特性 - **跨平台支持**:构建产物可同时运行于 PC 桌面端和 Android 移动端。 - **开箱即用**:预配置 Gradle 构建脚本与 GitHub Actions CI,实现自动化打包。 - **轻量依赖**:正确区分 Mindustry 核心依赖引用方式,避免将冗余 API 打包进模组。 ## 📋 前置条件 - **JDK 17**(构建和运行所必需) - **Android SDK**(仅在本地构建跨平台版本时需要) - 需安装 API Level 30 - 需安装近期版本的 Build Tools(如 30.0.1) ## 🎮 运行方法 1. 完成项目构建(参见下方构建方法)。 2. 将生成的 `.jar` 文件放入 Mindustry 的模组目录(`mods` 文件夹)中,或在游戏内的模组管理界面直接导入该文件。 3. 重启游戏或加载模组即可体验。 ## 🛠️ 构建方法 ### 1. 桌面端测试构建(仅限 PC) 此方式最快捷,但生成的文件**无法在 Android 上运行**。 1. 确保已安装 JDK 17。 2. 运行构建命令: - Windows: `gradlew jar` - Linux/Mac: `./gradlew jar` 3. 构建产物位于 `build/libs` 目录下。 ### 2. 通过 GitHub Actions 构建(推荐) 此方式无需本地配置 Android SDK,由 CI 自动构建全平台兼容版本。 1. 将本项目代码推送至你的 GitHub 仓库。 2. 每次提交代码后,在仓库的 **Actions** 标签页中查看最新的构建任务。 3. 任务成功后,在页面底部的 **Artifacts** 区域下载构建产物(通常为仓库名称的压缩包)。 4. 解压并获取其中的 `.jar` 文件,该文件可同时在 Android 和 PC 上运行。 ### 3. 本地全平台构建 适用于有 Android 开发经验、希望在本地直接打包全平台版本的开发者。 1. 下载并解压 Android SDK,设置环境变量 `ANDROID_HOME` 指向其根目录。 2. 确保安装了 API Level 30 及对应版本的 Build Tools(如 30.0.1)。 3. 将 Build Tools 目录添加到系统 `PATH` 中(例如:`$ANDROID_HOME/build-tools/30.0.1`)。 4. 运行构建命令: - Windows: `gradlew deploy` - Linux/Mac: `./gradlew deploy` 5. 构建产物位于 `build/libs` 目录下,可直接用于 Android 和 PC。 ## 📦 依赖添加说明 在添加 Mindustry、Arc 或其子模块的依赖时,**必须在 Gradle 中声明为 `compileOnly`**,绝不能使用 `implementation`。 - **`implementation`**:会将整个依赖库打包进最终的 `.jar` 文件中。对于 Mindustry 核心依赖,这会导致模组体积臃肿并引发严重的冲突问题。 - **`compileOnly`**:仅在编译时依赖该库,不会将其包含在最终产物中(因为游戏本体已经包含了这些库)。 **例外情况**:只有当你需要将一个** Mindustry 中不存在的第三方 Java 库**随模组一起打包时,才使用 `implementation`。 ## 📄 许可证 本项目为开源模组模板,具体许可证信息请查阅仓库中的 `LICENSE` 文件。