桃源星系  Taoyuan System: The Perfect Home
版本 v1.4.1   目标游戏版本 0.98a-RC8
============================================================

【安装】
把整个文件夹放进 Starsector/mods/，在启动器里勾选即可。
本模组没有任何前置模组，也不依赖 LunaLib / Nexerelin / Unknown Skies。

【它做什么】
· 在核心星区附近（默认坐标 22000, -20000）生成星系「桃源」：
    武陵   —— 宜居主星（宜居、温和气候、低重力、丰饶农田、大量有机物、超富矿脉、巨型废墟 + US 条件）
    寒渚   —— 冰矿世界（cryovolcanic，超富稀有矿脉 / 超富矿脉 / 丰富挥发物 + 冰环）
    赤霄   —— 熔岩矿世界（lava，超富稀有矿脉 / 超富矿脉 / 高温 / 稠密大气 / 构造活动）
    孤礁   —— 与跳跃点径向共线的荒芜球（默认特质：酷寒、巨型废墟、超富矿脉、超富稀有矿脉）
· 星系内另有：轨道研究站、废弃采矿哨站、熔岩观测站、轨道居住站、星冕分流器、
  免费仓库空间站（开局即可白嫖仓储）、星门、警告信标、冷冻休眠船、
  装满人之领神器的勘探母舰，以及三支友好且会巡逻的卫队（被打光后 2 游戏日重建）。
· 生成星系时清理它周围的超空间星云与风暴（一次性；与 MagicLib / FSF / HMI / HaloDynamics 等模组同一套写法）。

【怎么改参数】—— 编辑 data/config/taoyuan_settings.json
  taoyuan_name_system          星系显示名（默认 桃源）
  taoyuan_name_prime           宜居主星名（武陵）
  taoyuan_name_ice             冰矿世界名（寒渚）
  taoyuan_name_lava            熔岩世界名（赤霄）
  taoyuan_name_companion       荒芜球名（孤礁）
  taoyuan_system_x / _y        星图坐标（默认 22000 / -20000；有效范围约 x ±82000、y ±52000，超范围会被夹紧）
  taoyuan_survey_planets       true = 生成时即已勘测（默认 false，需自己派船勘测）
  taoyuan_clear_hyperspace     true = 生成时清理星系周围的超空间星云与风暴（默认 true）
  taoyuan_companion_opposite   false = 孤礁与跳跃点同侧共线（紧邻跳跃点）；true = 对侧共线（隔着恒星）
  taoyuan_companion_type       孤礁星球类型 id（默认 barren）
  taoyuan_companion_conditions 孤礁特质，逗号分隔（默认 very_cold, ruins_vast, ore_ultrarich, rare_ore_ultrarich）
  taoyuan_prime_extra_conditions   武陵追加的可选条件（默认空）
  taoyuan_ice_extra_conditions     寒渚追加的可选条件（默认 IndEvo_ArtilleryStationCondition，没装 IndEvo 自动跳过）
  taoyuan_lava_extra_conditions    赤霄追加的可选条件（默认空）
                               不存在的 id 会自动跳过并写日志；留空字符串则不加任何特质
  taoyuan_fleet_faction        卫队阵营：player / neutral / independent / derelict
  taoyuan_guard_patrol         true = 给卫队挂巡逻 AI（默认 true）
  taoyuan_guard_patrol_days    巡逻指令天数（默认 9999，越大越接近永久）
  taoyuan_guard_fleet_count    卫队舰队数量（默认 3；范围 1~8）
  taoyuan_guard_respawn_days   卫队被打光后多少游戏日重建（默认 2；0 = 永不重建）
  taoyuan_nex_no_colonize      true = 给四颗星球写 $nex_do_not_colonize，防 Nexerelin 的 NPC 殖民远征抢星球

  · 文件删掉、写坏、或缺某个键都不会出问题：缺失的项自动使用代码内默认值。
  · 这些参数只在"新建星系/开新档"时读取生效；改完请重启游戏。

【母舰战利品怎么拿到（重要）】
  本体的打捞流程**不会读取自定义实体的 cargo 容器**，只看内存里的"额外打捞"数据
  （键 $extraSpecialSalvage，由 BaseSalvageSpecial 管理）。因此把物品塞进母舰货舱，
  玩家击败/打捞它是拿不到的。
  本模组用本体 API BaseSalvageSpecial.addExtraSalvage(实体, 货舱) 把战利品挂上打捞：
  击败 / 打捞【勘探母舰】后，在打捞界面即可取得下面 13 件（每件 1 个）；其余战利品（商品、蓝图等）交给游戏本体自动生成：
    pristine_nanoforge   完好的纳米锻炉      synchrotron          同步加速器核心
    orbital_fusion_lamp  轨道聚变射灯        coronal_portal       超分流阀门
    mantle_bore          全自动地幔钻机      catalytic_core       催化核心
    soil_nanites         土壤纳米物质        biofactory_embryo    生物化工厂胚胎
    fullerene_spool      富勒烯线轴          plasma_dynamo        等离子发电机
    cryoarithmetic_engine 低温运算引擎      drone_replicator     战斗无人机复制器
    dealmaker_holosuite  全息交易撮合套件
  全部做存在性判定：某个 id 在本环境不存在时只写一行 WARN 跳过，不影响生成，也不需要前置模组。
【Industrial Evolution（IndEvo）兼容】
  寒渚默认会追加一个可选条件：IndEvo_ArtilleryStationCondition（"人之领轨道防御平台"）。
  该条件由 IndEvo 自己处理：它的 ArtilleryStationPlacer 会在轨道上搭建防御平台
  （会开火、可打捞的人之领遗留物）。
  · 没装 IndEvo 时：本模组只写一行 INFO 日志并跳过，不影响生成（已做存在性判定，无任何硬依赖）。
  · 不想要它：把 taoyuan_ice_extra_conditions 设为空字符串，或换成别的条件 id（逗号分隔可写多个）。
  · 想挂到别的星球：用 taoyuan_prime_extra_conditions / taoyuan_lava_extra_conditions；
    孤礁（荒芜球）用自己的 taoyuan_companion_conditions 键。
  ⚠️ 注意：我们的星球是"仅有条件、没有人口/工业"的市场，IndEvo 是否愿意在这种市场上加工业未经实测；
     若 IndEvo 日志显示它拒绝生成，可把条件改挂到先驱者空间站市场，或改成玩家殖民后再触发。
【生成时机（为什么这样设计）】
  桃源是在"星区生成阶段"就通过本体接口 SectorProcGenPlugin 建好的，而不是等星区生成完再补。
  这样本体的星云/深渊清理、以及会改星区尺度的模组（例如 Wide Horizons）都能正确给它定位、留白，
  不会出现"系统位置被别的地形/风暴盖住"的情况。
  卫队舰队放在 procgen 之后（那时创建舰队才安全）；超空间星云/风暴在生成星系时一次清掉；另外每次读档会做一次缺件修补。
  整套流程只用本体 API，不依赖任何前置模组。
【可选模组联动 —— 装了就多出功能，不装完全正常】
· Unknown Skies：US_* 条件存在则采用，不存在自动跳过；并写 $US_skipSystem，
  避免它的自动修补器按行星类型改写本星系手搓的条件。
· Nexerelin：写 $nex_do_not_colonize（Nexerelin 的 ColonyTargetValuator 读它），
  NPC 殖民远征不会来抢这四颗星球。没装时该键只是一条普通记忆，无副作用。

【为什么不支持 LunaLib 设置面板】
  本模组的脚本由游戏内置的 ScriptStore 现场编译，而它的类加载器明确禁止脚本使用反射与文件访问
  （日志会报 "SecurityException: File access and reflection are not allowed to scripts"）。
  因此既不能反射调用 LunaLib 的 API，也不能直接读文件——只能走游戏自身的 JSON 读取接口，
  也就是上面的 taoyuan_settings.json。这样也顺便保证：任何人都能直接用，不需要装任何前置模组。

【与 Wide Horizons 的兼容性（重要）】
  Wide Horizons 会用它的 WHHyperspaceTerrainPlugin 覆盖本体的超空间地形插件（见其 data/campaign/terrain.json），
  并接管风暴系统（它自己的 setStormsEnabled / getTilePreferStorm，日志里会打印
  "Storm system patched (visuals+audio disabled)"）。这种情况下本模组在生成时做的星云/风暴清理可能看不到效果：
  被清掉的是本体瓦片，而你画面上的风暴是 WH 画的。
  解决办法（二选一）：
    · LunaLib 设置 → Wide Horizons → 「星系」标签 → 「禁用超空间风暴」改为 On（默认 Off，全局开关）；
    · 或者不装/禁用 Wide Horizons，本模组的生成时清理在纯本体 + Nexerelin 环境下有效。
【排查问题】
· 日志前缀是「桃源:」——在 starsector.log 里搜索它可见生成/地形清理/卫队等信息。
· 例如：桃源: 已载入 data/config/taoyuan_settings.json
        桃源: 设置已载入（配置文件=true） 星系名=桃源 坐标=(22000.0, -20000.0) 卫队阵营=player 巡逻=true 生成时清理超空间地形=true
        桃源: 已清理星系周围超空间星云与风暴（半径 …）
        桃源: 星系生成完成 @ (22000.0, -20000.0)
        桃源: 荒芜球 taoyuan_barren_sentinel 已生成：基准=… 方位=… 度 …
· 提示「未找到 data/config/taoyuan_settings.json」是正常的，表示正在用代码内默认值。

【修改源码的注意事项】
· 本模组是源码形式（没有 .jar），游戏启动时会用内置 janino 逐文件编译。
  请保持 Java 6/7 语法风格：不要用 lambda、钻石运算符、try-with-resources、字符串 switch；
  泛型推断较弱，从 List 取元素请写成 (Type) list.get(i)；
  **绝对不要使用 java.lang.reflect.* 或直接读写文件（会被脚本类加载器拒绝，模组直接加载失败）**；
  每个文件的 import 必须齐全（游戏是逐文件编译的，一个文件缺 import 会导致整个模组加载失败）。
· 星系 id 为 taoyuan_system、实体 id 为 taoyuan_*；改动 id 会让老存档认不出该星系。
  位置、显示名等改动只对"新开的档"生效。
· 卫队是普通舰队：数量不足时会按 taoyuan_guard_respawn_days（默认 2 游戏日）补建，
  直到达到 taoyuan_guard_fleet_count（默认 3 支）；设为 0 则表示打掉就永远不再补。
