joywayerandClaude Opus 5 c9786eba50 fix(bullet): _swap_and_pop 回收末尾子弹时遗留冷数据,被下一颗复用槽位的子弹继承
pre-existing bug(非本期归航引入):冷数据的搬移与擦除都写在 if idx != last 分支内,
故 idx == last(回收最后一颗子弹)时它的 _bullet_contexts[idx] 被原样留在该 key 上,
下一颗复用该槽位的普通子弹会继承整份冷数据。运行时已复现:
  after recycle: active=0 ctx_keys=[0]
  plain bullet idx=0 inherits_cold=true cold={"homing_strength":3.0,...,"pierce_remaining":7}

归航之前症状只是一次隐形的多余穿透,故长期未被发现;归航把它放大成肉眼可见的
「普通子弹拐弯追敌」,且继承 homing 的幽灵弹会持续走重选路径付出查询开销。
修法是把 erase 移出该 if(缺键时 erase 为安全 no-op),idx != last 的搬移行为一行不改。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 16:02:39 +08:00
2026-07-30 11:41:08 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-20 10:56:52 +08:00
2026-07-23 16:03:10 +08:00

Spellforge(万法熔炉)

"Noita 遇上 Brotato" —— 快节奏割草 × 深度法术编程的 Roguelite 弹幕射击游戏

Godot 4.6 (Mono) · GDScript 热路径 + C# · SoA / ECS-Lite 架构

被困异次元的"土豆工匠",捡到的不是武器,而是逻辑碎片与弹头。你要像程序员一样**"编写"你的子弹**——用核心(法杖)、修正器、触发器和逻辑门,组装出毁天灭地的魔法武器,抵御无穷波次的怪物潮。

📛 命名说明Spellforge / 万法熔炉 为当前候选名(project.godot 中工程名仍暂为 Rogue)。定稿后同步更新此处与 application/config/name


核心玩法:法术管道 (The Spell Pipeline)

武器由一个 核心 (Core) 和若干 法术节点 (Spell Node) 组成,四类节点自由排列组合,实现近乎图灵完备的武器逻辑:

类型 作用 示例
ACTION 动作 实际产生的飞行物 魔法弹、黑洞、治疗雾、召唤炮台
MODIFIER 修正 改变下一个动作 伤害+、弹道折射、多重施法、正弦轨迹
TRIGGER 触发 逻辑传递(子母弹) 击中触发、定时触发
LOGIC 逻辑门 自动化灵魂 IF_HP_LOWIF_ENEMY_CLOSELOOP

深度构建维度:

  • 拓扑构建 —— Core 不只是列表,还有 LINEAR / MATRIX(邻接加成)/ CIRCUIT(电路分叉)三种插槽拓扑
  • 逻辑寄存器 —— 史诗核心提供跨帧持久寄存器,可搭出"蓄力计数器""击杀连击"
  • 炼金共鸣 —— 特定元素法术相邻时自动质变合成(如 水属性波 + 闪电链等离子风暴

性能怪兽:得益于 SoA + Spatial Grid,支持同屏 1000+ 敌人2000+ 独立弹幕,实测 500 敌人 + 1500 子弹下模拟+渲染仅 ~0.6ms16.67ms 预算的 3.6%)。


🚀 快速上手

前置Godot 4.6 .NET/Mono 版(工程使用 C#,需 .NET SDK)。

# 1. 用 Godot 4.6 Mono 打开工程
#    直接打开项目根目录的 project.godot

# 2. 首次打开会自动构建 C# 程序集(Rogue.sln

# 3. 运行工程(F5
#    主场景:res://scenes/ui/splash.tscn
#    流程:Splash → 主菜单 → 战斗 → 商店 → 结算 → 排行榜

详细步骤见 docs/handbook/01_quickstart.md


🧰 技术栈与架构

  • 引擎Godot 4.6 (Mono),渲染 D3D12,物理 Jolt
  • 架构ECS-Lite —— ~35 个 Autoload 单例分层协作,EventBus + 整数 EventID 常量解耦
  • 数据布局SoAStructure of Arrays),BulletManager STRIDE=12、EnemyManager STRIDE=8,配合对象池零 GC
  • 渲染MultiMeshInstance2D 单批次绘制全部子弹/敌人,程序化着色器发光(shaders/
  • 法术虚拟机:两阶段架构 —— compile_wand()(装备/换牌时编译为 CompiledDeck+ execute_compiled()(每次施法执行线性化节点)
  • 热路径:当前跑 GDScriptcsharp/ 下 C# 管理器(BulletManagerCs / EnemyManagerCs / SpatialGridCs)为骨架,供后续迁移

📂 项目结构

daihaoRogue/
├── project.godot              工程配置(Autoload 注册、编辑器插件)
├── scenes/
│   ├── ui/                    splash / main_menu(启动与菜单)
│   └── main/                  combat_s2(主战斗场景,唯一可玩入口)
├── scripts/
│   ├── autoloads/            全局单例(EventID/EnemyManager/WaveManager…)
│   ├── core/                 基础数据结构
│   └── domain/
│       ├── spell_system/      法术虚拟机(spell_evaluator.gd 等)
│       └── combat/            游戏循环状态机
├── csharp/                   C# 热路径管理器(骨架,含 .cs)
├── data/                     ⭐ 纯数据驱动内容(JSON
│   ├── spells.json  cores.json  enemies.json  waves.json
│   └── balance.json  resonance.json  status_effects.json
├── shaders/                  子弹/敌人/地面网格程序化着色器
├── translations/            zh_CN / zh_TW / en / ja.po
├── assets/                   精灵 / UI 主题(目前几何占位)
├── addons/                   编辑器插件(见下)
├── docs/                     产品文档:设计 / 技术 / 机制 / 手册
└── docs_dev/                 开发过程 / 归档文档:开发计划 · 认证清单 · 早期草案

🎮 编辑器工具(零代码配置内容)

工程为策划/美术提供了 @tool 编辑器插件,所有游戏内容纯数据驱动(data/*.json),改内容无需碰代码:

插件 位置 功能
🎮 游戏设计器 addons/game_designer/ · 底部面板 一站式:法术 / 敌人 / 波次 / Core / 平衡 / 共鸣 / 状态 共 7 个表单页(法术为字段化表单)
Godot MCP addons/godot_mcp/ AI 辅助开发(截图 / 输入 / 场景检查服务)

修改后需 F5 重启生效(内容在 _ready() 时加载)。用法见 docs/handbook/07_game_designer.md


📖 文档导航

完整文档索引见 docs/README.md;开发/策划手册见 docs/handbook/

分类 关键文档
游戏设计 game_design.md · numerical_design.md · core_wand_design.md
技术架构 architecture_design.md · implementation_plan.md
机制细节 docs/mechanics/ —— 溯源 / 连锁 / 状态 / 召唤 / 环境场
开发计划 development_plan.mdS0S6 垂直切片) · certification_checklist.md —— 位于 docs_dev/(开发过程/归档文档)

docs/README.md 末尾附有 关键规范速查表(P6-N / ADR-**,是跨切片实现约束的权威来源。


🏗️ 开发状态

采用"骨架垂直切片" S0–S6 推进。当前主体流程已可完整游玩:

  • 完整游戏外壳:Splash → 菜单 → 战斗 → 商店 → 结算 → Endless 排行榜,含存档(A/B 局内槽)、暂停、首启难度选择(FTUE)
  • 核心战斗:法术虚拟机(LINEAR/MATRIX/CIRCUIT 三拓扑 + LOGIC + 共鸣 + 召唤/地面场)、20 波内容 + W8/W20 多阶段 Boss、精英寻路
  • 系统:难度/音量/语言设置、4 语言本地化、程序化音效、MultiMesh 渲染 + 发光着色器、纯数据驱动 + 可视化编辑器
  • 🚧 待完善:C# 热路径迁移(当前 GDScript)、正式美术/音频资源(现为几何占位 + 蜂鸣)、法术/Core/状态名的多语言化、Steam/Switch 平台认证项

详细进度与计划/代码差异见 docs_dev/development_plan.md


📄 许可

尚未指定许可证(暂为私有工程)。如需开源发布,请在根目录添加 LICENSE 并在此说明。

S
Description
No description provided
Readme
2.1 MiB
Languages
GDScript 63.3%
TypeScript 15.7%
C++ 11.6%
JavaScript 8.8%
C# 0.5%
Other 0.1%