Files
ArachnaeSwarm/.snow/plan.md
ProjectKoi-Kalo\Kalo 988967439f feat(Flyover): 天巫集群掠食 — 空投拦截系统
新增天巫种对敌方空投袭击的自动拦截功能:
- GameComponent_DropPodInterceptor: 全局拦截状态管理与核心逻辑
- Harmony Prefix 挂钩 EdgeDrop/CenterDrop Arrive(),拦截 1-3 个运输仓
- 被拦截 Pawn 击杀(Bite)后尸体以空投仓形式落地
- 拦截时生成天巫种 FlyOver 视觉飞越 + PositiveEvent 信件通知
- 引航种新增 ARA_ToggleDropPodIntercept 自释放能力切换开关
- 前置检查:开关启用 + 天巫升空 + 敌对派系,至少保留 1 名袭击者

新增文件:
- Source/.../GameComponent_DropPodInterceptor.cs
- Source/.../Patch_DropPodIntercept.cs
- Source/.../CompAbilityEffect_ToggleDropPodIntercept.cs
- Defs/AbilityDefs/Ability_DropPodIntercept.xml

修改文件:
- ARA_PawnKinds.xml (Skyraider abilities)
- AirStrike_Keys.xml (10 localization keys)
- ArachnaeSwarm.csproj (3 Compile entries)
2026-02-17 15:54:35 +08:00

8.2 KiB
Raw Permalink Blame History

Plan: 天巫集群掠食 — 空投拦截系统

TL;DR:通过 Harmony Prefix 补丁拦截原版 EdgeDropCenterDropArrive() 方法,在敌方空投仓落地前由天巫种拦截 1-3 个运输仓。击杀后尸体仍以运输仓形式落地。使用 GameComponent 全局管理开关状态,引航种 Pawn 通过自释放 AbilityDef 切换开关。拦截时生成天巫种 FlyOver 作为视觉反馈。

架构概览

[敌方袭击触发]
IncidentWorker_RaidEnemy → Arrive(pawns, parms)
    ↓ Harmony Prefix
[新增] Patch_DropPodIntercept
    → GameComponent_DropPodInterceptor.TryIntercept()
        ├── 检查 interceptEnabled (引航种toggle)
        ├── 检查 WorldComponent_AircraftManager 有可用天巫
        ├── 验证 parms.faction.HostileTo(Player)
        ├── 随机选取 1-3 pawns → Kill → 获取 Corpse
        ├── 用 DropPodUtility.DropThingsNear 投掷尸体
        ├── FlyOver.MakeFlyOver() 生成拦截飞越视觉
        └── ReceiveLetter 通知玩家
    → 原 Arrive 继续执行(剩余 pawn 正常空投)

[引航种能力]
ArachnaeNode_Race_Skyraider → AbilityDef: ARA_ToggleDropPodIntercept
    → CompAbilityEffect_ToggleDropPodIntercept.Apply()
        → GameComponent_DropPodInterceptor.ToggleIntercept()

Steps

1. 创建全局状态管理 GameComponent_DropPodInterceptor

新文件:Source/ArachnaeSwarm/Flyover/GameComponent_DropPodInterceptor.cs

  • 继承 GameComponent,序列化字段 bool interceptEnabled
  • 属性 IsInterceptEnabled — 外部查询开关状态
  • 方法 ToggleIntercept() — 翻转开关 + ArachnaeLog.Debug
  • 方法 HasAirborneTianwu() — 查询 WorldComponent_AircraftManager:检查 GetAvailableAircraftCount(ThingDef ARA_HiveCorvette_Entity, Faction.OfPlayer) > 0(非全部冷却中即可,不消耗资源)
  • 核心方法 TryInterceptDropPods(List<Pawn> pawns, IncidentParms parms, out List<Pawn> interceptedPawns) — 完整拦截逻辑:
    • 前置条件检查(interceptEnabled && HasAirborneTianwu() && parms.faction.HostileTo(Faction.OfPlayer)
    • pawns 中随机移除 Rand.RangeInclusive(1, Mathf.Min(3, pawns.Count - 1)) 个 Pawn至少保留 1 个 pawn 正常空投,避免完全吞掉袭击)
    • 对每个被拦截的 Pawn调用 pawn.Kill(new DamageInfo(DamageDefOf.Bomb, 9999f)),收集 pawn.Corpse 到尸体列表
    • 将尸体通过 DropPodUtility.DropThingsNear(parms.spawnCenter, map, corpses, leaveSlag: true) 投掷到同一空投区域
    • 调用 SpawnInterceptionFlyOver(map, parms.spawnCenter) 生成天巫飞越视觉
    • 调用 SendInterceptionLetter(map, interceptedCount, parms.spawnCenter) 发送信件
  • 方法 SpawnInterceptionFlyOver(Map, IntVec3) — 调用 FlyOver.MakeFlyOver() 生成 ARA_HiveCorvette_Fake(复用现有视觉 FlyOver ThingDef起点从地图边缘到空投中心飞越
  • 方法 SendInterceptionLetter(Map, int count, IntVec3) — 发送自定义 LetterDefOf.PositiveEvent 信件,告知玩家拦截了多少运输仓
  • ExposeData()Scribe_Values.Look(ref interceptEnabled, "interceptEnabled", false)

2. 创建 Harmony 补丁 Patch_DropPodIntercept

新文件:Source/ArachnaeSwarm/HarmonyPatches/Patch_DropPodIntercept.cs

  • [HarmonyPatch(typeof(PawnsArrivalModeWorker_EdgeDrop), "Arrive")] — Prefix
  • [HarmonyPatch(typeof(PawnsArrivalModeWorker_CenterDrop), "Arrive")] — Prefix
  • 两个 Prefix 共用同一个静态方法 InterceptPrefix(List<Pawn> pawns, IncidentParms parms)
  • Prefix 逻辑:获取 Current.Game.GetComponent<GameComponent_DropPodInterceptor>(),调用 TryInterceptDropPods(pawns, parms)
  • 不 skip 原方法return true),原方法继续用被修改过的 pawns 列表正常空投剩余敌人

3. 创建引航种切换能力 CompAbilityEffect_ToggleDropPodIntercept

新文件:Source/ArachnaeSwarm/Abilities/CompAbilityEffect_ToggleDropPodIntercept.cs

  • CompProperties_ToggleDropPodIntercept 继承 CompProperties_AbilityEffect,包含字段:
    • string enabledMessage / disabledMessage — 开启/关闭时的消息文本 key
    • ThingDef requiredAircraftType — 需要检查的战机类型(ARA_HiveCorvette_Entity
  • CompAbilityEffect_ToggleDropPodIntercept 继承 CompAbilityEffect
    • Apply(LocalTargetInfo, LocalTargetInfo) — 获取 GameComponent_DropPodInterceptor,调用 ToggleIntercept(),发送 Messages.Message 通知当前状态
    • Valid(LocalTargetInfo[], bool) — 检查 WorldComponent_AircraftManager.HasAvailableAircraft 是否有天巫升空;无天巫时禁用能力并显示 "无可用天巫种" 提示
    • ExtraLabelMouseAttachment(LocalTargetInfo) — 返回当前状态文本("掠食巡航: 开启/关闭"

4. 创建拦截 FlyOver 视觉 ThingDef

修改现有文件 1.6/1.6/Defs/Thing_Misc/ARA_Flyover_Item.xml,新增 ARA_HiveCorvette_Intercept ThingDef

  • ARA_HiveCorvette_Fake 为模板(纯视觉 FlyOver无攻击 Comp
  • thingClass="ArachnaeSwarm.FlyOver"
  • 设置较快的 flightSpeed(拦截应该是快速掠过)
  • 可选添加 CompProperties_SendLetterAfterTicks 以在飞越后发出完成通知
  • 或直接复用 ARA_HiveCorvette_Fake defName不新建 ThingDef

5. 创建能力 XML 定义

新文件:1.6/1.6/Defs/AbilityDefs/Ability_DropPodIntercept.xml

  • AbilityDef defName: ARA_ToggleDropPodIntercept
  • label: 掠食巡航(或类似命名)
  • targetRequired: false(自释放,无需目标)
  • cooldownTicksRange: 0(无冷却,即时切换)
  • comps:
    • CompProperties_ToggleDropPodInterceptrequiredAircraftType: ARA_HiveCorvette_Entity

6. 将能力添加到引航种

查找并修改引航种 ArachnaeNode_Race_Skyraider 的能力列表定义(可能在 1.6/1.6/Defs/PawnKindDef/ARA_PawnKinds.xml 或 Race ThingDef 中),在 abilities 列表中添加 ARA_ToggleDropPodIntercept

7. 添加本地化文本

修改 1.6/1.6/Languages/ChineseSimplified/Keyed/ 下的翻译文件,添加:

  • ARA_ToggleDropPodIntercept_Label — "掠食巡航"
  • ARA_ToggleDropPodIntercept_Desc — 能力描述
  • ARA_InterceptDropPod_Enabled — "掠食巡航已启动"
  • ARA_InterceptDropPod_Disabled — "掠食巡航已关闭"
  • ARA_InterceptDropPod_LetterLabel — "天巫种拦截空投"
  • ARA_InterceptDropPod_LetterText — "天巫种在空中拦截了{0}个敌方运输仓…"
  • ARA_InterceptDropPod_NoAircraft — "没有可用的天巫种兽虫"

Verification

  1. MSBuild 编译:cd "ArachnaeSwarm\Source\ArachnaeSwarm" && MSBuild ArachnaeSwarm.csproj -p:Configuration=Release
  2. 游戏内测试流程:
    • 建造天巫种机库 → 起飞(注册战机到 WorldComponent_AircraftManager
    • 使用引航种能力开启"掠食巡航"
    • 使用 dev console 触发 Raid (EdgeDrop) → 验证 1-3 个运输仓被拦截(尸体掉落 + FlyOver 视觉 + 信件)
    • 使用 dev console 触发 Raid (CenterDrop) → 同上
    • 关闭"掠食巡航" → 再次触发空投 → 验证不拦截
    • 触发非空投袭击EdgeWalkIn → 验证不触发拦截
    • 触发友方空投 → 验证不拦截HostileTo 检查)
  3. 存档/读档测试:验证 interceptEnabled 状态持久化

Decisions

  • Harmony 挂钩点:选 PawnsArrivalModeWorker_EdgeDrop.Arrive + CenterDrop.Arrive 而非底层 DropPodUtility,因为只需响应这两种袭击到场模式,不影响其他空投场景(贸易、任务奖励等)
  • GameComponent vs MapComponent:选 GameComponent(全局,跨地图),因为用户明确说"全局管理"
  • 不消耗战机资源:只检查 HasAvailableAircraft 判断天巫是否升空,不调用 TryUseAircraft
  • 至少保留 1 个 pawnMathf.Min(3, pawns.Count - 1) 确保不会完全吞掉袭击,玩家仍需应战
  • Kill + Corpse 方案:调用 Pawn.Kill(DamageInfo) 后获取 Corpse,再通过 DropPodUtility.DropThingsNear 以运输仓形式投掷尸体,既有"被击杀"的反馈感,又能剥削敌方装备
  • 复用 ARA_HiveCorvette_Fake:优先复用现有纯视觉 FlyOver避免新增无意义 ThingDef若需要不同飞行参数再另建