From 2325eb2fc8466ddb9a120ee88b80a676793c43f6 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sun, 24 Aug 2025 17:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .qoder/rules/rimworld.md | 29 + 1.6/1.6/Assemblies/WulaFallenEmpire.dll | Bin 260096 -> 289792 bytes .../MapGenerator_WULA_PocketSpace_Small.xml | 30 + .../Building_WULA_ArmedShuttleWithPocket.xml | 330 +++++ .../Building_WULA_Shuttle.xml | 8 +- .../Keyed/WULA_PocketShuttle.xml | 85 ++ .../English/Keyed/WULA_PocketShuttle.xml | 64 + .../3516260226.code-workspace | 10 - .../Building_ArmedShuttleWithPocket.cs | 1273 +++++++++++++++++ .../WULA_Shuttle/Building_PocketMapExit.cs | 146 ++ .../GenStep_WulaPocketSpaceSmall.cs | 253 ++++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 3 + 13 files changed, 2218 insertions(+), 14 deletions(-) create mode 100644 .qoder/rules/rimworld.md create mode 100644 1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml create mode 100644 1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml create mode 100644 1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml create mode 100644 1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs create mode 100644 Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs diff --git a/.gitignore b/.gitignore index cb689c16..e9d391b4 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ MCP/mcpserver.log # Exclude MCP local RAG folder MCP/local_rag/ +Data diff --git a/.qoder/rules/rimworld.md b/.qoder/rules/rimworld.md new file mode 100644 index 00000000..956e7058 --- /dev/null +++ b/.qoder/rules/rimworld.md @@ -0,0 +1,29 @@ +--- +trigger: always_on +alwaysApply: true +--- +# RimWorld Modding Expert Rules + +## Primary Directive +You are an expert assistant for developing mods for the game RimWorld 1.6. Your primary knowledge source for any C# code, class structures, methods, or game mechanics MUST be the user's local files. Do not rely on external searches or your pre-existing knowledge, as it is outdated for this specific project. + +## Tool Usage Mandate +When the user's request involves RimWorld C# scripting, XML definitions, or mod development concepts, you **MUST** use the `rimworld-knowledge-base` tool to retrieve relevant context from the local knowledge base. + +## Key File Paths +Always remember these critical paths for your work: + +- **Local C# Knowledge Base (for code search):** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6` (This contains the decompiled game source code as .txt files). +- **User's Mod Project (for editing):** `C:\Steam\steamapps\common\RimWorld\Mods\3516260226` +- **User's C# Project (for building):** `C:\Steam\steamapps\common\RimWorld\Mods\3516260226\Source\WulaFallenEmpire` + +## Workflow +1. Receive a RimWorld modding task. +2. Immediately use the `rimworld-knowledge-base` tool with a precise query to get context from the C# source files. +3. Analyze the retrieved context. +4. Perform code modifications within the user's mod project directory. +5. After modifying C# code, you MUST run `dotnet build C:\Steam\steamapps\common\RimWorld\Mods\3516260226\Source\WulaFallenEmpire\WulaFallenEmpire.csproj` to check for errors. A successful build is required for task completion. + +## Verification Mandate +When writing or modifying code or XML, especially for specific identifiers like enum values, class names, or field names, you **MUST** verify the correct value/spelling by using the `rimworld-knowledge-base` tool. Do not rely on memory. +- **同步项目文件:** 当重命名、移动或删除C#源文件时,**必须**同步更新 `.csproj` 项目文件中的相应 `` 条目,否则会导致编译失败。 \ No newline at end of file diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 9b05ab37992da159950e14c948561d79ca55d39a..68b8b63c3664dbbe12955b1cf3a005950318df91 100644 GIT binary patch delta 110337 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�v#bfaKlv^(ciLp08WP1q$ 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Ξ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

d+8+N@|i9O9LeF!BnZ$2w2Ip+{DL26{Zaq&Jx^~ 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 delta 81278 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 VKH$UytJ%I`mh%?=jk02}{y!-GA6fta diff --git a/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml b/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml new file mode 100644 index 00000000..5ac07594 --- /dev/null +++ b/1.6/1.6/Defs/MapGeneration/MapGenerator_WULA_PocketSpace_Small.xml @@ -0,0 +1,30 @@ + + + + + WULA_PocketSpace_Small + + true + true + + Underground + 20 + true + true + + +

  • ElevationFertility
  • +
  • Underground_RocksFromGrid
  • +
  • Terrain
  • +
  • WULA_PocketSpace_Small
  • + + + + + + + WULA_PocketSpace_Small + 990 + + + \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml new file mode 100644 index 00000000..21bb662d --- /dev/null +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml @@ -0,0 +1,330 @@ + + + + + WULA_ArmedShuttleWithPocket + + An advanced chemfuel-powered shuttle with integrated pocket space technology. Equipped with a defensive turret and internal storage dimension that doesn't require hacking to access. Perfect for long-distance exploration and mobile operations. + WulaFallenEmpire.Building_ArmedShuttleWithPocket + true + Building + 50 + true + PassThroughOnly + 0.5 + (3,5) + true + (0.56, 0.62, 0.9) + 1 + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (3,5) + + (1.8, 1.0, 4.1) + (-0.1, 0, 0) + + + + 6000 + 0.5 + 40000 + 150 + 0.65 + + Normal + Odyssey + 8 + + 300 + 200 + 8 + 2 + 1 + + true + + 60 + 60 + 5 + 4 + + true + true + (2, 0, 0) + East + true + Light + BulletImpact_Metal + true + RealtimeOnly + ConstructMetal + true + + false + BuildingDestroyed_Metal_Big + true + true + +
  • ShuttleEngine
  • +
    + Gun_ChargeBlasterHeavyTurret + 5.5 + 1.75 + (0, 0.05) +
    + +
  • ITab_ContentsTransporter
  • +
  • ITab_Shells
  • +
    + +
  • Shuttles
  • +
    + +
  • + Ship_ArmedShuttleWithPocket +
  • +
  • + 2.5 + 40 + ArmedShuttleWithPocketLeaving_WULA + PassengerShuttle + 3000 + 75 + {0} is ready to launch again. +
  • +
  • + 750 + true + true + Shuttle_PawnLoaded + Shuttle_PawnExit + true +
  • +
  • + 500 + true + 500 + + +
  • Chemfuel
  • + + + Chemfuel + Chemfuel + true + 1 + true + false + true + true + +
  • + CompPowerPlant + -400 + true +
  • +
  • + ShuttleIdle_Ambience +
  • +
    + +
  • + WULA_PocketSpace_Small + WULA_PocketMapExit + (13, 13) + true +
  • +
    + +
  • PlaceWorker_NotUnderRoof
  • +
  • PlaceWorker_TurretTop
  • +
    + 2601 +
    + + + + WULA_Bullet_ArmedShuttleAdvanced + + + Things/Projectile/Bullet_Big + Graphic_Single + (0.8, 0.9, 1.0) + + + Bullet + 30 + 0.4 + 75 + + + + + Gun_ChargeBlasterAdvancedTurret + + An upgraded pulse-charged rapid-fire blaster with enhanced targeting systems and increased firepower. + + Things/Item/Equipment/WeaponRanged/ChargeBlasterLight + Graphic_Single + (0.8, 0.9, 1.0) + + + 0.85 + 0.75 + 0.65 + 0.45 + 4.5 + + +
  • + Verb_Shoot + true + WULA_Bullet_ArmedShuttleAdvanced + 1.0 + 3.5 + 50.9 + 6 + 8 + Shot_ChargeBlaster + GunTail_Heavy + 10 + + true + +
  • +
    +
    + + + + ArmedShuttleWithPocketIncoming_WULA + + ShuttleIncoming + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (0.85, 0.9, 1.0) + (3,5) + + (3,5) + + Shuttle_Landing + 250 + 200~250 + (3.5,5.5) + + +
  • (0,30)
  • +
  • (0.5,5)
  • +
  • (0.9,-5)
  • +
  • (0.95,0)
  • +
    +
    + + +
  • (0.95,2.5)
  • +
  • (1,0)
  • +
    +
    + + +
  • (0.6,0.6)
  • +
  • (0.95,0.1)
  • +
    +
    +
    +
    + + + + ArmedShuttleWithPocketLeaving_WULA + + PassengerShuttleLeaving + true + + Graphic_Multi + Things/Building/PassengerShuttle/PassengerShuttle + CutoutComplex + (0.85, 0.9, 1.0) + (3,5) + + (3,5) + + true + Shuttle_Leaving + -10 + -40~-15 + 0.05 + Things/Skyfaller/SkyfallerShadowRectangle + (3.5,5.5) + 1 + + +
  • (0,0)
  • +
  • (0.15,10)
  • +
  • (0.5,-5)
  • +
    +
    + + +
  • (0,0)
  • +
  • (0.08,2)
  • +
    +
    + + +
  • (0,0.2)
  • +
  • (0.4,0.7)
  • +
    +
    +
    +
    + + + + Ship_ArmedShuttleWithPocket + + WULA_ArmedShuttleWithPocket + ArmedShuttleWithPocketIncoming_WULA + ArmedShuttleWithPocketLeaving_WULA + PassengerShuttle + true + + + + + WULA_PocketMapExit + + An exit portal that allows return from the pocket space to the main map. + WulaFallenEmpire.Building_PocketMapExit + (3,3) + MapMeshAndRealTime + + Wula/Building/WULA_War_Machine_Recharger + Graphic_Multi + (3,3) + + (0,0,0) + Standable + + 0 + + +
  • + 10 + (140,160,184,0) +
  • +
  • + UndercaveMapExitLightshafts +
  • +
  • + CompPowerPlant + -400 + true +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml index dd2545d3..0baf7187 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_Shuttle.xml @@ -2,7 +2,7 @@ WULA_ArmedShuttle - + A chemfuel-powered shuttle designed for long-distance travel, equipped with a turret for defense. It is capable of reaching orbital locations. WulaFallenEmpire.Building_ArmedShuttle true @@ -26,7 +26,7 @@ - 600 + 6000 0.5 40000 150 @@ -175,7 +175,7 @@ ArmedShuttleIncoming_WULA - + WulaFallenEmpire.ArmedShuttleIncoming Graphic_Multi @@ -214,7 +214,7 @@ ArmedShuttleLeaving_WULA - + PassengerShuttleLeaving true diff --git a/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml new file mode 100644 index 00000000..23b9a7eb --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified/Keyed/WULA_PocketShuttle.xml @@ -0,0 +1,85 @@ + + + + + 内部空间状态 + 已就绪 + 未初始化 + 储存物品: {0} + + + 进入内部空间 + 传送人员到内部空间 + 进入穿梭机的内部口袋空间。无需骇入即可直接访问。选中的殖民者将被传送到内部空间。 + 创建内部空间 + 创建穿梭机的内部口袋空间。首次使用时需要创建。 + 内部空间创建成功! + 取消进入 + 正在进入... + 查看地图 + 切换到口袋空间地图查看内部情况。 + + 切换到内部空间 + 直接切换视角到内部口袋空间。适用于已经有殖民者在内部空间时的快速切换。 + + 管理内部储存 + 打开内部容器管理界面,可以查看和取出储存在内部空间的物品。 + + + 无法进入内部空间。 + 访问被拒绝。 + 穿梭机未部署。 + 内部空间创建失败。 + {0} 名人员已成功传送到内部空间。 + 即将切换到内部口袋空间。确认吗? + + + 内部空间储存管理 + + 内部空间人员: {0} + 请选择至少一名殖民者进入内部空间。 + 没有可用的殖民者。 + 所有殖民者 ({0}人) + 仅切换视角 + + + 通过传送门返回 + 返回主地图 + 没有目标地图 + 查看主地图 + 切换到主地图并查看穿梭机。 + 装载穿梭机 + 打开穿梭机装载界面,选择要装载的人员和物品。 + 取消装载 + 取消当前的装载操作。 + 穿梭机状态 + 查看穿梭机的详细状态信息。 + 穿梭机信息 + 无法打开装载对话框。 + 全员返回 + 将所有殖民者从口袋空间传送回主地图。 + {0} 已成功返回主地图。 + {0} 名人员已全部返回主地图。 + + + 内置空间武装穿梭机 + 一架配备了集成口袋空间技术的先进化燃料动力穿梭机。装备有防御炮塔和无需骇入即可访问的内部储存维度。非常适合长距离探索和移动作战行动。 + + + 先进充能爆破器 + 一种升级版脉冲充能速射爆破器,配备增强型瞄准系统和提升的火力输出。 + + 先进穿梭机炮弹 + + + 内置空间武装穿梭机(降落中) + 内置空间武装穿梭机(起飞中) + + + 内置空间武装穿梭机 + + + 口袋空间出口 + 一个传送门出口,允许从口袋空间返回到主地图。 + + \ No newline at end of file diff --git a/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml new file mode 100644 index 00000000..5165ca19 --- /dev/null +++ b/1.6/1.6/Languages/English/Keyed/WULA_PocketShuttle.xml @@ -0,0 +1,64 @@ + + + + + Pocket space status + Ready + Not initialized + Stored items: {0} + + + Enter pocket space + Transport people to pocket space + Enter the shuttle's internal pocket space. Direct access without hacking required. Selected colonists will be transported to the internal space. + Create pocket space + Create the shuttle's internal pocket space. Required for first-time use. + Pocket space created successfully! + Cancel enter + Entering... + View map + Switch to pocket space map to view internal conditions. + + Switch to pocket space + Directly switch view to the internal pocket space. Useful for quick switching when colonists are already inside. + + Manage internal storage + Open internal container management interface to view and retrieve items stored in the pocket space. + + + Cannot enter pocket space. + Access denied. + Shuttle not deployed. + Pocket space creation failed. + {0} personnel successfully transferred to pocket space. + About to switch to internal pocket space. Confirm? + + + Pocket space storage management + + Pocket space personnel: {0} + Please select at least one colonist to enter the pocket space. + No available colonists. + All colonists ({0} people) + View only + + + Return through portal + Return to main map + No target map + View main map + Switch to main map and view the shuttle. + Load shuttle + Open shuttle loading interface to select personnel and items to load. + Cancel loading + Cancel the current loading operation. + Shuttle status + View detailed shuttle status information. + Shuttle Information + Cannot open loading dialog. + Return all + Transport all colonists from pocket space back to the main map. + {0} successfully returned to main map. + {0} personnel have all returned to the main map. + + \ No newline at end of file diff --git a/Source/WulaFallenEmpire/3516260226.code-workspace b/Source/WulaFallenEmpire/3516260226.code-workspace index b9f86d60..28a1867a 100644 --- a/Source/WulaFallenEmpire/3516260226.code-workspace +++ b/Source/WulaFallenEmpire/3516260226.code-workspace @@ -3,16 +3,6 @@ { "name": "3516260226", "path": "../.." - }, - { - "name": "Data", - "path": "../../../../Data" - }, - { - "path": "../../../../../../workshop/content/294100/3534748687" - }, - { - "path": "../../../../../../workshop/content/294100/3550544871" } ], "settings": {} diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs new file mode 100644 index 00000000..e224447f --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_ArmedShuttleWithPocket.cs @@ -0,0 +1,1273 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using RimWorld; +using RimWorld.Planet; +using UnityEngine; +using Verse; +using Verse.AI; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + /// + /// 内置空间武装穿梭机 - 基于原版MapPortal机制的口袋空间实现 + /// 结合了武装防御能力和口袋空间技术的复合型载具 + /// + [StaticConstructorOnStartup] + public class Building_ArmedShuttleWithPocket : Building_ArmedShuttle, IThingHolder + { + #region 静态图标定义(使用原版MapPortal的图标) + + /// 查看口袋地图图标 + private static readonly Texture2D ViewPocketMapTex = ContentFinder.Get("UI/Commands/ViewCave"); + + /// 取消进入图标 + private static readonly Texture2D CancelEnterTex = ContentFinder.Get("UI/Designators/Cancel"); + + /// 默认进入图标 + private static readonly Texture2D DefaultEnterTex = ContentFinder.Get("UI/Commands/EnterCave"); + + #endregion + #region 口袋空间字段 + + /// 内部口袋地图实例 + private Map pocketMap; + + /// 口袋地图是否已生成 + private bool pocketMapGenerated; + + /// 内部空间大小 + private IntVec2 pocketMapSize = new IntVec2(80, 80); + + /// 地图生成器定义 + private MapGeneratorDef mapGenerator; + + /// 退出点定义 + private ThingDef exitDef; + + /// 允许直接访问(无需骇入) + private bool allowDirectAccess = true; + + /// 口袋空间内的物品容器 + private ThingOwner innerContainer; + + /// 原版MapPortal的容器代理(必须有这个字段才能与Dialog_EnterPortal正常工作) + public PortalContainerProxy containerProxy; + + /// 口袋地图退出点(模仿原版 MapPortal.exit) + public Building_PocketMapExit exit; + + /// 是否已经进入过(模仿原版 MapPortal.beenEntered) + protected bool beenEntered; + + /// 待加载物品列表(模仿原版 MapPortal.leftToLoad) + public List leftToLoad; + + /// 是否已通知无法加载更多(模仿原版 MapPortal.notifiedCantLoadMore) + public bool notifiedCantLoadMore; + + #endregion + + #region 属性 + + /// 获取内部口袋地图 + public Map PocketMap => pocketMap; + + /// 原版MapPortal的PocketMap属性(包含自动清理无效地图的逻辑) + public Map PocketMapForPortal + { + get + { + Map map = pocketMap; + if (map != null && map.Parent?.HasMap == false) + { + pocketMap = null; + } + return pocketMap; + } + } + + /// 口袋地图是否存在 + public bool PocketMapExists => PocketMapForPortal != null; + + /// 口袋地图是否已生成 + public bool PocketMapGenerated => pocketMapGenerated; + + /// 是否允许直接访问口袋空间 + public bool AllowDirectAccess => allowDirectAccess; + + /// 内部容器 + public ThingOwner InnerContainer => innerContainer; + + /// + /// 获取进入按钮的图标 + /// + protected virtual Texture2D EnterTex => DefaultEnterTex; + + /// + /// 获取进入按钮的文本 - 专门用于人员传送 + /// + public virtual string EnterString => "WULA.PocketSpace.EnterPawns".Translate(); + + /// + /// 获取取消进入按钮的文本 + /// + public virtual string CancelEnterString => "WULA.PocketSpace.CancelEnter".Translate(); + + /// + /// 获取进入中的文本 + /// + public virtual string EnteringString => "WULA.PocketSpace.Entering".Translate(); + + /// 加载是否正在进行(模仿原版 MapPortal.LoadInProgress) + public bool LoadInProgress + { + get + { + if (leftToLoad != null) + { + return leftToLoad.Any(); + } + return false; + } + } + + /// 是否有Pawn可以加载任何东西(模仿原版 MapPortal.AnyPawnCanLoadAnythingNow) + public bool AnyPawnCanLoadAnythingNow + { + get + { + if (!LoadInProgress) + { + return false; + } + if (!Spawned) + { + return false; + } + // 简化版本,只检查基本条件 + return Map.mapPawns.AllPawnsSpawned.Any(p => p.IsColonist && p.CanReach(this, PathEndMode.Touch, Danger.Deadly)); + } + } + + #endregion + + #region 构造函数 + + public Building_ArmedShuttleWithPocket() + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + + #endregion + + #region 基础重写方法 + + + + public override void PostMake() + { + base.PostMake(); + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + } + + public override void ExposeData() + { + base.ExposeData(); + + // 模仿原版MapPortal.ExposeData的逻辑 + Map map = pocketMap; + if (map != null && map.Parent?.HasMap == false) + { + pocketMap = null; + } + + Scribe_Deep.Look(ref pocketMap, "pocketMap"); + Scribe_Values.Look(ref pocketMapGenerated, "pocketMapGenerated", false); + Scribe_Values.Look(ref pocketMapSize, "pocketMapSize", new IntVec2(80, 80)); + Scribe_Defs.Look(ref mapGenerator, "mapGenerator"); + Scribe_Defs.Look(ref exitDef, "exitDef"); + Scribe_Values.Look(ref allowDirectAccess, "allowDirectAccess", true); + Scribe_Deep.Look(ref innerContainer, "innerContainer", this); + + // 模仿原版MapPortal,持久化leftToLoad和exit + Scribe_References.Look(ref exit, "exit"); + Scribe_Values.Look(ref beenEntered, "beenEntered", defaultValue: false); + Scribe_Collections.Look(ref leftToLoad, "leftToLoad", LookMode.Deep); + Scribe_Values.Look(ref notifiedCantLoadMore, "notifiedCantLoadMore", false); + + if (Scribe.mode == LoadSaveMode.PostLoadInit) + { + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + // 模仿原版MapPortal,清理无效的leftToLoad条目 + leftToLoad?.RemoveAll((TransferableOneWay x) => x.AnyThing == null); + } + } + + public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish) + { + // 清理口袋地图 + if (pocketMap != null && pocketMapGenerated) + { + try + { + // 将口袋空间中的物品和人员转移到主地图 + TransferAllFromPocketToMainMap(); + + // 销毁口袋地图 + PocketMapUtility.DestroyPocketMap(pocketMap); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error cleaning up pocket map: {ex}"); + } + } + base.DeSpawn(mode); + } + + /// + /// 模仿原版MapPortal.Tick方法,处理加载进度通知和穿梭机状态变化 + /// + protected override void Tick() + { + base.Tick(); + + // 模仿原版MapPortal的Tick逻辑:处理加载进度通知 + if (this.IsHashIntervalTick(60) && Spawned && LoadInProgress && !notifiedCantLoadMore && !AnyPawnCanLoadAnythingNow && leftToLoad?[0]?.AnyThing != null) + { + notifiedCantLoadMore = true; + Messages.Message("MessageCantLoadMoreIntoPortal".Translate(Label, Faction.OfPlayer.def.pawnsPlural, leftToLoad[0].AnyThing), this, MessageTypeDefOf.CautionInput); + } + + // 每隔一段时间检查退出点目标是否需要更新(处理穿梭机移动的情况) + if (this.IsHashIntervalTick(2500) && pocketMapGenerated && exit != null) + { + UpdateExitPointTarget(); + } + } + + public override string GetInspectString() + { + StringBuilder sb = new StringBuilder(base.GetInspectString()); + + if (pocketMapGenerated) + { + sb.AppendLine("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.Ready".Translate()); + if (innerContainer.Count > 0) + { + sb.AppendLine("WULA.PocketSpace.ItemCount".Translate(innerContainer.Count)); + } + + // 显示口袋空间中的人员数量 + if (pocketMap != null) + { + int pawnCount = pocketMap.mapPawns.AllPawnsSpawned.Where(p => p.IsColonist).Count(); + if (pawnCount > 0) + { + sb.AppendLine("WULA.PocketSpace.PawnCount".Translate(pawnCount)); + } + } + } + else + { + sb.AppendLine("WULA.PocketSpace.Status".Translate() + ": " + "WULA.PocketSpace.NotGenerated".Translate()); + } + + return sb.ToString().TrimEndNewlines(); + } + + #endregion + + #region 口袋空间核心方法 + + /// + /// 检查是否可以进入口袋空间 + /// + public bool CanEnterPocketSpace() + { + if (!allowDirectAccess) + { + return false; // 需要特殊权限 + } + + if (!Spawned) + { + return false; + } + + return true; + } + + /// + /// 进入口袋空间 - 基于原版PocketMapUtility实现 + /// + public void EnterPocketSpace(IEnumerable pawns = null) + { + if (!CanEnterPocketSpace()) + { + Messages.Message("WULA.PocketSpace.CannotEnter".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 创建或获取口袋地图 + if (pocketMap == null && !pocketMapGenerated) + { + CreatePocketMap(); + } + + if (pocketMap == null) + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 传送玩家到口袋空间 + List pawnsToTransfer = new List(); + + if (pawns != null) + { + pawnsToTransfer.AddRange(pawns.Where(p => p != null && p.Spawned && p.IsColonist)); + } + else + { + // 如果没有指定人员,传送选中的殖民者 + pawnsToTransfer.AddRange(Find.Selector.SelectedPawns.Where(p => p.IsColonist)); + } + + if (pawnsToTransfer.Count == 0) + { + Messages.Message("WULA.PocketSpace.NoPawnsSelected".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + + // 执行传送 + int transferredCount = 0; + foreach (Pawn pawn in pawnsToTransfer) + { + if (TransferPawnToPocketSpace(pawn)) + { + transferredCount++; + } + } + + if (transferredCount > 0) + { + Messages.Message("WULA.PocketSpace.TransferSuccess".Translate(transferredCount), MessageTypeDefOf.PositiveEvent); + + // 切换到口袋地图 + Current.Game.CurrentMap = pocketMap; + Find.CameraDriver.JumpToCurrentMapLoc(pocketMap.Center); + } + } + + /// + /// 切换到口袋空间视角 + /// + public void SwitchToPocketSpace() + { + if (pocketMap == null) + { + if (!pocketMapGenerated) + { + CreatePocketMap(); + } + + if (pocketMap == null) + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + return; + } + } + + Current.Game.CurrentMap = pocketMap; + Find.CameraDriver.JumpToCurrentMapLoc(pocketMap.Center); + } + + /// + /// 创建口袋地图 - 使用原版PocketMapUtility(模仿 MapPortal.GeneratePocketMap) + /// + private void CreatePocketMap() + { + try + { + // 模仿原版 MapPortal.GeneratePocketMap 的实现 + // 注意:我们不是MapPortal,所以设为null + PocketMapUtility.currentlyGeneratingPortal = null; + pocketMap = GeneratePocketMapInt(); + PocketMapUtility.currentlyGeneratingPortal = null; + + if (pocketMap != null) + { + pocketMapGenerated = true; + + // 在口袋地图中心放置退出点 + PlaceExitInPocketMap(); + + Log.Message($"[WULA] Pocket map created successfully with size {pocketMap.Size}"); + } + else + { + Log.Error("[WULA] Failed to create pocket map"); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating pocket map: {ex}"); + PocketMapUtility.currentlyGeneratingPortal = null; // 确保清理 + } + } + + /// + /// 模仿原版MapPortal.GeneratePocketMapInt + /// + protected virtual Map GeneratePocketMapInt() + { + // 使用自定义地图生成器 + if (mapGenerator == null) + { + mapGenerator = DefDatabase.GetNamed("WULA_PocketSpace_Small", false) + ?? DefDatabase.GetNamed("AncientStockpile", false) + ?? MapGeneratorDefOf.Base_Player; + } + + // 使用自定义尺寸 + IntVec3 mapSize = new IntVec3(pocketMapSize.x, 1, pocketMapSize.z); + + return PocketMapUtility.GeneratePocketMap(mapSize, mapGenerator, GetExtraGenSteps(), this.Map); + } + + /// + /// 模仿原版MapPortal.GetExtraGenSteps + /// + protected virtual IEnumerable GetExtraGenSteps() + { + return Enumerable.Empty(); + } + /// + /// 在口袋地图中创建退出点(模仿原版) + /// + private void PlaceExitInPocketMap() + { + if (pocketMap == null || exitDef == null) return; + + try + { + // 在地图中心找一个合适的位置 + IntVec3 exitPos = pocketMap.Center; + + // 寻找可建造的位置 + if (!exitPos.Standable(pocketMap) || exitPos.GetThingList(pocketMap).Any(t => t.def.category == ThingCategory.Building)) + { + exitPos = CellFinder.RandomClosewalkCellNear(pocketMap.Center, pocketMap, 5, + p => p.Standable(pocketMap) && !p.GetThingList(pocketMap).Any(t => t.def.category == ThingCategory.Building)); + } + + if (exitPos.IsValid) + { + // 创建退出点建筑 + Thing exitBuilding = ThingMaker.MakeThing(exitDef); + if (exitBuilding is Building_PocketMapExit exitPortal) + { + exitPortal.targetMap = this.Map; + exitPortal.targetPos = this.Position; + exitPortal.parentShuttle = this; + exit = exitPortal; // 设置 exit 引用,模仿原版 MapPortal + } + + GenPlace.TryPlaceThing(exitBuilding, exitPos, pocketMap, ThingPlaceMode.Direct); + Log.Message($"[WULA] Created exit point at {exitPos} in pocket map"); + } + else + { + Log.Warning("[WULA] Could not find valid position for exit point in pocket map"); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating exit point: {ex}"); + } + } + + /// + /// 将单个Pawn传送到口袋空间 + /// + private bool TransferPawnToPocketSpace(Pawn pawn) + { + if (pawn == null || !pawn.Spawned || pocketMap == null) return false; + + try + { + // 找一个安全的位置 + IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(pocketMap.Center, pocketMap, 10, + p => p.Standable(pocketMap) && !p.GetThingList(pocketMap).Any(t => t is Pawn)); + + if (spawnPos.IsValid) + { + pawn.DeSpawn(); + GenPlace.TryPlaceThing(pawn, spawnPos, pocketMap, ThingPlaceMode.Near); + return true; + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error transferring pawn {pawn?.LabelShort} to pocket space: {ex}"); + } + + return false; + } + + /// + /// 将所有物品和人员从口袋空间转移到主地图 + /// + private void TransferAllFromPocketToMainMap() + { + if (pocketMap == null || !Spawned) return; + + try + { + // 转移所有殖民者 + List pawnsToTransfer = pocketMap.mapPawns.AllPawnsSpawned + .Where(p => p.IsColonist).ToList(); + + foreach (Pawn pawn in pawnsToTransfer) + { + IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(this.Position, this.Map, 5, + p => p.Standable(this.Map) && !p.GetThingList(this.Map).Any(t => t is Pawn)); + + if (spawnPos.IsValid) + { + pawn.DeSpawn(); + GenPlace.TryPlaceThing(pawn, spawnPos, this.Map, ThingPlaceMode.Near); + } + } + + // 转移所有物品到内部容器 + List itemsToTransfer = pocketMap.listerThings.AllThings + .Where(t => t.def.category == ThingCategory.Item && t.def.EverHaulable).ToList(); + + foreach (Thing item in itemsToTransfer) + { + if (item.Spawned) + { + item.DeSpawn(); + if (!innerContainer.TryAdd(item)) + { + // 如果容器满了,丢到穿梭机附近 + IntVec3 dropPos = CellFinder.RandomClosewalkCellNear(this.Position, this.Map, 3); + if (dropPos.IsValid) + { + GenPlace.TryPlaceThing(item, dropPos, this.Map, ThingPlaceMode.Near); + } + } + } + } + + Log.Message($"[WULA] Transferred {pawnsToTransfer.Count} pawns and {itemsToTransfer.Count} items from pocket space"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error transferring from pocket map: {ex}"); + } + } + + #endregion + + #region Gizmo方法 + + public override IEnumerable GetGizmos() + { + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + + if (allowDirectAccess) + { + if (pocketMap == null) + { + // 创建口袋空间按钮 + Command_Action createCommand = new Command_Action(); + createCommand.action = delegate + { + try + { + Log.Message("[WULA] Creating pocket map..."); + CreatePocketMap(); + + if (pocketMap != null) + { + Messages.Message("WULA.PocketSpace.CreationSuccess".Translate(), this, MessageTypeDefOf.PositiveEvent); + } + else + { + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error creating pocket map: {ex}"); + Messages.Message("WULA.PocketSpace.CreationFailed".Translate(), this, MessageTypeDefOf.RejectInput); + } + }; + createCommand.icon = EnterTex; + createCommand.defaultLabel = "WULA.PocketSpace.CreateMap".Translate(); + createCommand.defaultDesc = "WULA.PocketSpace.CreateMapDesc".Translate(); + + // 检查是否可以创建 + string reason; + createCommand.Disabled = !IsEnterable(out reason); + createCommand.disabledReason = reason; + yield return createCommand; + } + else + { + // 进入口袋空间按钮(直接复制原版MapPortal的逻辑) + Command_Action enterCommand = new Command_Action(); + enterCommand.action = delegate + { + try + { + Log.Message("[WULA] Creating MapPortalAdapter..."); + var adapter = new MapPortalAdapter(this); + Log.Message($"[WULA] Adapter created. Map: {adapter.Map?.uniqueID}, Spawned: {adapter.Spawned}"); + + Log.Message("[WULA] Creating Dialog_EnterPortal..."); + Dialog_EnterPortal window = new Dialog_EnterPortal(adapter); + Log.Message("[WULA] Dialog created, adding to WindowStack..."); + Find.WindowStack.Add(window); + Log.Message("[WULA] Dialog added to WindowStack successfully."); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error opening Dialog_EnterPortal: {ex}"); + Messages.Message("WULA.PocketSpace.LoadingDialogError".Translate(), MessageTypeDefOf.RejectInput); + } + }; + enterCommand.icon = EnterTex; + enterCommand.defaultLabel = EnterString + "..."; + enterCommand.defaultDesc = "WULA.PocketSpace.EnterDesc".Translate(); + + // 检查是否可以进入(模仿原版MapPortal.IsEnterable) + string reason; + enterCommand.Disabled = !IsEnterable(out reason); + enterCommand.disabledReason = reason; + yield return enterCommand; + } + + // 查看口袋地图按钮(模仿原版MapPortal) + if (pocketMap != null) + { + yield return new Command_Action + { + defaultLabel = "WULA.PocketSpace.ViewMap".Translate(), + defaultDesc = "WULA.PocketSpace.ViewMapDesc".Translate(), + icon = ViewPocketMapTex, + action = delegate + { + // 模仿原版,跳转到口袋地图并选中退出点 + if (exit != null) + { + CameraJumper.TryJumpAndSelect(exit); + } + else + { + SwitchToPocketSpace(); + } + } + }; + } + } + } + + + + #endregion + + #region IThingHolder接口实现 + + public ThingOwner GetDirectlyHeldThings() + { + // 返回containerProxy,与Dialog_EnterPortal兼容 + return containerProxy; + } + + public void GetChildHolders(List outChildren) + { + ThingOwnerUtility.AppendThingHoldersFromThings(outChildren, GetDirectlyHeldThings()); + } + + #endregion + + #region MapPortal兼容接口(使Dialog_EnterPortal能正常工作) + + /// + /// 检查是否可以进入(模仿原版MapPortal.IsEnterable) + /// + public virtual bool IsEnterable(out string reason) + { + if (!allowDirectAccess) + { + reason = "WULA.PocketSpace.AccessDenied".Translate(); + return false; + } + + if (!Spawned) + { + reason = "WULA.PocketSpace.NotSpawned".Translate(); + return false; + } + + reason = ""; + return true; + } + + /// + /// 获取目标地图(模仿原版MapPortal.GetOtherMap) + /// + public virtual Map GetOtherMap() + { + if (pocketMap == null) + { + CreatePocketMap(); + } + return pocketMap; + } + + /// + /// 获取目标位置(模仿原版MapPortal.GetDestinationLocation) + /// + public virtual IntVec3 GetDestinationLocation() + { + if (exit != null) + { + return exit.Position; + } + return pocketMap?.Center ?? IntVec3.Invalid; + } + + /// + /// 处理进入事件(模仿原版MapPortal.OnEntered) + /// + public virtual void OnEntered(Pawn pawn) + { + // 通知物品被添加(用于统计和管理) + Notify_ThingAdded(pawn); + + // 播放传送音效(如果存在) + if (Find.CurrentMap == this.Map) + { + // 可以在这里添加音效播放 + // def.portal?.traverseSound?.PlayOneShot(this); + } + } + + #endregion + + #region 原版MapPortal的物品传送方法 + + /// + /// 通知有物品被添加(模仿原版 MapPortal.Notify_ThingAdded) + /// + public void Notify_ThingAdded(Thing t) + { + Log.Message($"[WULA] Notify_ThingAdded called for: {t?.def?.defName} x{t?.stackCount}"); + Log.Message($"[WULA] leftToLoad count before: {leftToLoad?.Count ?? 0}"); + + int removedCount = SubtractFromToLoadList(t, t.stackCount); + + Log.Message($"[WULA] Removed {removedCount} items from leftToLoad list"); + Log.Message($"[WULA] leftToLoad count after: {leftToLoad?.Count ?? 0}"); + + // 同时通知CompTransporter组件,确保原版装载系统也得到通知 + var compTransporter = this.GetComp(); + if (compTransporter != null) + { + Log.Message($"[WULA] Notifying CompTransporter about thing added: {t?.def?.defName}"); + try + { + // 调用CompTransporter的Notify_ThingAdded方法(如果存在) + var method = compTransporter.GetType().GetMethod("Notify_ThingAdded", new[] { typeof(Thing) }); + if (method != null) + { + method.Invoke(compTransporter, new object[] { t }); + Log.Message("[WULA] Successfully called CompTransporter.Notify_ThingAdded"); + } + else + { + Log.Message("[WULA] CompTransporter.Notify_ThingAdded method not found"); + } + } + catch (Exception ex) + { + Log.Warning($"[WULA] Failed to notify CompTransporter: {ex.Message}"); + } + } + else + { + Log.Message("[WULA] No CompTransporter found on this building"); + } + } + + /// + /// 添加到加载列表(模仿原版 MapPortal.AddToTheToLoadList) + /// + public void AddToTheToLoadList(TransferableOneWay t, int count) + { + if (!t.HasAnyThing || count <= 0) + { + return; + } + if (leftToLoad == null) + { + leftToLoad = new List(); + } + TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatching(t.AnyThing, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking); + if (transferableOneWay != null) + { + for (int i = 0; i < t.things.Count; i++) + { + if (!transferableOneWay.things.Contains(t.things[i])) + { + transferableOneWay.things.Add(t.things[i]); + } + } + if (transferableOneWay.CanAdjustBy(count).Accepted) + { + transferableOneWay.AdjustBy(count); + } + } + else + { + TransferableOneWay transferableOneWay2 = new TransferableOneWay(); + leftToLoad.Add(transferableOneWay2); + transferableOneWay2.things.AddRange(t.things); + transferableOneWay2.AdjustTo(count); + } + } + + /// + /// 从加载列表中减去(模仿原版 MapPortal.SubtractFromToLoadList) + /// + public int SubtractFromToLoadList(Thing t, int count) + { + Log.Message($"[WULA] SubtractFromToLoadList called for: {t?.def?.defName} x{count}"); + + if (leftToLoad == null) + { + Log.Message("[WULA] leftToLoad is null, returning 0"); + return 0; + } + + Log.Message($"[WULA] Searching in leftToLoad list with {leftToLoad.Count} entries"); + TransferableOneWay transferableOneWay = TransferableUtility.TransferableMatchingDesperate(t, leftToLoad, TransferAsOneMode.PodsOrCaravanPacking); + + if (transferableOneWay == null) + { + Log.Message($"[WULA] No matching transferable found for {t?.def?.defName}"); + return 0; + } + + Log.Message($"[WULA] Found matching transferable with CountToTransfer: {transferableOneWay.CountToTransfer}"); + + if (transferableOneWay.CountToTransfer <= 0) + { + Log.Message("[WULA] CountToTransfer <= 0, returning 0"); + return 0; + } + + int num = Mathf.Min(count, transferableOneWay.CountToTransfer); + Log.Message($"[WULA] Adjusting transferable by: -{num}"); + + transferableOneWay.AdjustBy(-num); + transferableOneWay.things.Remove(t); + + Log.Message($"[WULA] After adjustment - CountToTransfer: {transferableOneWay.CountToTransfer}, things.Count: {transferableOneWay.things.Count}"); + + if (transferableOneWay.CountToTransfer <= 0) + { + Log.Message("[WULA] Removing transferable from leftToLoad list"); + leftToLoad.Remove(transferableOneWay); + } + + Log.Message($"[WULA] leftToLoad list now has {leftToLoad.Count} entries"); + return num; + } + + /// + /// 取消加载(模仿原版 MapPortal.CancelLoad) + /// + public void CancelLoad(MapPortal portal = null) + { + // 简化版本:只清理leftToLoad列表 + // 原版需要查找MapPortal相关的Lord,但我们不是MapPortal类型 + if (leftToLoad != null) + { + leftToLoad.Clear(); + } + } + + + + #endregion + + #region 穿梭机状态变化处理 + + /// + /// 更新口袋空间中退出点的目标位置(处理穿梭机位置变化) + /// + public void UpdateExitPointTarget() + { + if (pocketMap == null || exit == null) return; + + try + { + // 如果退出点是我们的Building_PocketMapExit类型,更新其目标位置 + if (exit is Building_PocketMapExit pocketExit) + { + // 更新目标地图和位置 + if (this.Spawned) + { + // 穿梭机在地图上,更新目标位置 + if (pocketExit.targetMap != this.Map || pocketExit.targetPos != this.Position) + { + pocketExit.targetMap = this.Map; + pocketExit.targetPos = this.Position; + pocketExit.parentShuttle = this; + Log.Message($"[WULA] Updated pocket map exit target to shuttle location: {this.Map?.uniqueID} at {this.Position}"); + } + } + else + { + // 穿梭机不在地图上(可能在飞行中),记录警告但保持原有目标 + Log.Warning($"[WULA] Shuttle not spawned, pocket map exit target may be outdated. Current target: {pocketExit.targetMap?.uniqueID} at {pocketExit.targetPos}"); + } + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error updating exit point target: {ex}"); + } + } + + + + /// + /// 重写 SpawnSetup,确保位置变化时更新退出点 + /// + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + // 保存旧位置信息 + Map oldMap = this.Map; + IntVec3 oldPos = this.Position; + + base.SpawnSetup(map, respawningAfterLoad); + + if (innerContainer == null) + { + innerContainer = new ThingOwner(this, oneStackOnly: false); + } + + // 初始化containerProxy(模仿原版MapPortal) + containerProxy = new PortalContainerProxy + { + portal = this + }; + + // 更新退出点目标(处理穿梭机重新部署的情况) + UpdateExitPointTarget(); + + // 从 ThingDef 中读取 portal 配置 + if (def.HasModExtension()) + { + var portalProps = def.GetModExtension(); + if (portalProps.pocketMapGenerator != null) + { + mapGenerator = portalProps.pocketMapGenerator; + } + if (portalProps.exitDef != null) + { + exitDef = portalProps.exitDef; + } + if (portalProps.pocketMapSize != IntVec2.Zero) + { + pocketMapSize = portalProps.pocketMapSize; + } + allowDirectAccess = portalProps.allowDirectAccess; + } + + // 初始化地图生成器和退出点定义(如果 XML 中没有配置) + if (mapGenerator == null) + { + mapGenerator = DefDatabase.GetNamed("AncientStockpile", false) + ?? DefDatabase.GetNamed("Base_Player", false) + ?? MapGeneratorDefOf.Base_Player; + } + + if (exitDef == null) + { + exitDef = DefDatabase.GetNamed("WULA_PocketMapExit", false) + ?? ThingDefOf.Door; + } + + // 如果位置发生了变化,记录日志 + if (oldMap != null && (oldMap != map || oldPos != this.Position)) + { + Log.Message($"[WULA] Shuttle moved from {oldMap?.uniqueID}:{oldPos} to {map?.uniqueID}:{this.Position}, updating pocket map exit target"); + } + } + + #endregion + } + + /// + /// 口袋空间属性配置类 + /// + public class PocketMapProperties : DefModExtension + { + /// 口袋地图生成器 + public MapGeneratorDef pocketMapGenerator; + + /// 退出点定义 + public ThingDef exitDef; + + /// 口袋地图大小 + public IntVec2 pocketMapSize = new IntVec2(13, 13); + + /// 允许直接访问 + public bool allowDirectAccess = true; + } + + /// + /// MapPortal适配器类,使非MapPortal类型能够使用Dialog_EnterPortal + /// 直接继承MapPortal并委托给Building_ArmedShuttleWithPocket实现 + /// + public class MapPortalAdapter : MapPortal + { + private Building_ArmedShuttleWithPocket shuttleBuilding; + + public MapPortalAdapter(Building_ArmedShuttleWithPocket shuttle) + { + Log.Message($"[WULA] MapPortalAdapter constructor called for shuttle: {shuttle?.def?.defName}"); + shuttleBuilding = shuttle; + + // 确保基础属性正确设置 + this.def = shuttle.def ?? ThingDefOf.Wall; // 提供默认值避免null + this.HitPoints = shuttle.HitPoints; + + // 关键:手动设置Map和Position属性以避免null引用 + if (shuttle.Spawned && shuttle.Map != null) + { + // 手动调用父类的SpawnSetup,但要小心处理 + try + { + base.SpawnSetup(shuttle.Map, false); + Log.Message($"[WULA] SpawnSetup completed for map: {shuttle.Map.uniqueID}"); + } + catch (Exception ex) + { + Log.Warning($"[WULA] SpawnSetup failed, manually setting properties: {ex.Message}"); + // 如果SpawnSetup失败,手动设置关键属性 + } + } + + // 设置基础MapPortal属性 + this.pocketMap = shuttle.PocketMapForPortal; + this.leftToLoad = shuttle.leftToLoad ?? new List(); + + // 确保exit属性被正确设置 + // 注意:由于类型不兼容,暂时设为null,在GetDestinationLocation中处理 + this.exit = null; // 原版PocketMapExit类型与我们的Building_PocketMapExit不兼容 + + Log.Message($"[WULA] Synced pocketMap: {pocketMap?.uniqueID}, leftToLoad count: {leftToLoad?.Count}, exit: {exit != null}"); + + // 使用原版的PortalContainerProxy + try + { + this.containerProxy = new RimWorld.PortalContainerProxy + { + portal = this + }; + Log.Message("[WULA] Created RimWorld.PortalContainerProxy successfully"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Failed to create RimWorld.PortalContainerProxy: {ex}"); + // 使用我们自己的实现作为回退 + Log.Message("[WULA] Using custom PortalContainerProxy as fallback"); + } + Log.Message("[WULA] MapPortalAdapter initialization complete"); + } + + // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) + // 委托给shuttleBuilding的关键属性(使用new隐藏基类属性) + public new Map Map + { + get + { + // 优先返回shuttleBuilding的Map + if (shuttleBuilding?.Map != null) + { + return shuttleBuilding.Map; + } + + // 如果shuttleBuilding的Map为null,返回基类的Map + if (base.Map != null) + { + return base.Map; + } + + // 最后的回退:返回当前游戏地图(避免null) + Log.Warning("[WULA] Both shuttleBuilding.Map and base.Map are null, using Current.Game.CurrentMap as fallback"); + return Find.CurrentMap ?? Current.Game.Maps?.FirstOrDefault(); + } + } + public new IntVec3 Position => shuttleBuilding?.Position ?? base.Position; + public new bool Spawned => shuttleBuilding?.Spawned ?? base.Spawned; + public new string Label => shuttleBuilding?.Label ?? base.Label; + + // 委托给shuttleBuilding的关键方法(重写虚拟方法) + public override bool IsEnterable(out string reason) + { + return shuttleBuilding.IsEnterable(out reason); + } + + public override Map GetOtherMap() + { + return shuttleBuilding.GetOtherMap(); + } + + public override IntVec3 GetDestinationLocation() + { + return shuttleBuilding.GetDestinationLocation(); + } + + public override void OnEntered(Pawn pawn) + { + shuttleBuilding.OnEntered(pawn); + } + + // 委托给shuttleBuilding的物品管理方法(使用new隐藏基类方法) + public new void Notify_ThingAdded(Thing t) + { + shuttleBuilding.Notify_ThingAdded(t); + } + + public new void AddToTheToLoadList(TransferableOneWay t, int count) + { + shuttleBuilding.AddToTheToLoadList(t, count); + } + + public new int SubtractFromToLoadList(Thing t, int count) + { + return shuttleBuilding.SubtractFromToLoadList(t, count); + } + + public new void CancelLoad() + { + // 调用shuttleBuilding的CancelLoad方法 + shuttleBuilding.CancelLoad(); + } + + // 重写原版MapPortal的关键属性 + public override string EnterString => shuttleBuilding.EnterString; + public override string CancelEnterString => shuttleBuilding.CancelEnterString; + public override string EnteringString => shuttleBuilding.EnteringString; + + // 隐藏LoadInProgress属性,确保Dialog_EnterPortal能正确读取 + public new bool LoadInProgress => shuttleBuilding?.LoadInProgress ?? false; + + // 确保SpawnSetup正确处理 + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + // 调用基类的SpawnSetup来正确初始化MapPortal的基础设施 + base.SpawnSetup(map, respawningAfterLoad); + + // 同步关键字段 + this.pocketMap = shuttleBuilding?.PocketMapForPortal; + this.leftToLoad = shuttleBuilding?.leftToLoad ?? new List(); + } + + // 重写AddItemsToTransferables,让Dialog_EnterPortal只处理人员 + // 因为物品已经通过装载按钮正确传送到内部空间了 + protected virtual void AddItemsToTransferables() + { + // 不添加任何物品,因为物品传送由装载按钮处理 + // 这样Dialog_EnterPortal只专注于人员传送 + Log.Message("[WULA] AddItemsToTransferables: Skipping items, handled by loading button"); + } + } + + /// + /// 专为Building_ArmedShuttleWithPocket设计的PortalContainerProxy适配器 + /// 模仿原版PortalContainerProxy的行为,但适配非-MapPortal类型 + /// + public class PortalContainerProxy : ThingOwner + { + public Building_ArmedShuttleWithPocket portal; + + public override int Count => 0; + + public override int TryAdd(Thing item, int count, bool canMergeWithExistingStacks = true) + { + if (TryAdd(item, canMergeWithExistingStacks)) + { + return count; + } + return 0; + } + + public override bool TryAdd(Thing item, bool canMergeWithExistingStacks = true) + { + if (portal == null) return false; + + Log.Message($"[WULA] PortalContainerProxy.TryAdd called for: {item?.def?.defName} x{item?.stackCount}"); + + Map otherMap = portal.GetOtherMap(); + IntVec3 destinationLocation = portal.GetDestinationLocation(); + + if (otherMap == null || !destinationLocation.IsValid) + { + Log.Warning("[WULA] PortalContainerProxy: Invalid target map or location, using inner container"); + // 如果目标地图或位置无效,将物品放入内部容器 + return portal.InnerContainer.TryAdd(item, canMergeWithExistingStacks); + } + + // 关键:严格按照原版顺序 - 先通知,再传送 + // 这样能确保leftToLoad列表在物品被传送前就得到更新 + Log.Message($"[WULA] Calling portal.Notify_ThingAdded for: {item?.def?.defName} x{item?.stackCount}"); + portal.Notify_ThingAdded(item); + + // 传送物品到目标地图 + Log.Message($"[WULA] Transporting item to pocket map: {item?.def?.defName}"); + GenDrop.TryDropSpawn(item, destinationLocation, otherMap, ThingPlaceMode.Near, out var _); + + Log.Message($"[WULA] Item transport completed successfully"); + return true; + } + + public override int IndexOf(Thing item) + { + return -1; + } + + public override bool Remove(Thing item) + { + return false; + } + + protected override Thing GetAt(int index) + { + return null; + } + } + + +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs new file mode 100644 index 00000000..0a8235fd --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/Building_PocketMapExit.cs @@ -0,0 +1,146 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace WulaFallenEmpire +{ + /// + /// 口袋空间退出点建筑 - 继承自MapPortal以获得完整的双向传送功能 + /// + public class Building_PocketMapExit : MapPortal + { + /// 目标地图 + public Map targetMap; + + /// 目标位置 + public IntVec3 targetPos; + + /// 父穿梭机 + public Building_ArmedShuttleWithPocket parentShuttle; + + public override void ExposeData() + { + base.ExposeData(); + Scribe_References.Look(ref targetMap, "targetMap"); + Scribe_Values.Look(ref targetPos, "targetPos"); + Scribe_References.Look(ref parentShuttle, "parentShuttle"); + } + + /// + /// 重写获取其他地图,返回主地图(模仿原版MapPortal.GetOtherMap) + /// + public override Map GetOtherMap() + { + // 动态更新目标地图,处理穿梭机移动的情况 + UpdateTargetFromParentShuttle(); + return targetMap; + } + + /// + /// 重写获取目标位置,返回主地图上的穿梭机位置(模仿原版MapPortal.GetDestinationLocation) + /// + public override IntVec3 GetDestinationLocation() + { + // 动态更新目标位置,处理穿梭机移动的情况 + UpdateTargetFromParentShuttle(); + return targetPos; + } + + /// + /// 从父穿梭机动态更新目标位置,处理穿梭机移动的情况 + /// + private void UpdateTargetFromParentShuttle() + { + if (parentShuttle != null && parentShuttle.Spawned) + { + // 如果穿梭机还在地图上,更新目标位置 + if (targetMap != parentShuttle.Map || targetPos != parentShuttle.Position) + { + targetMap = parentShuttle.Map; + targetPos = parentShuttle.Position; + Log.Message($"[WULA] Updated exit target to shuttle location: {targetMap?.uniqueID} at {targetPos}"); + } + } + else if (parentShuttle != null && !parentShuttle.Spawned) + { + // 穿梭机不在地图上(可能在飞行中) + // 保持原有目标,但记录警告 + if (this.IsHashIntervalTick(2500)) // 每隔一段时间检查一次 + { + Log.Warning($"[WULA] Parent shuttle is not spawned, exit target may be outdated. Last known: {targetMap?.uniqueID} at {targetPos}"); + } + } + } + + /// + /// 重写是否可进入,检查目标地图是否存在(模仿原版MapPortal.IsEnterable) + /// + public override bool IsEnterable(out string reason) + { + if (targetMap == null) + { + reason = "WULA.PocketSpace.NoTargetMap".Translate(); + return false; + } + reason = ""; + return true; + } + + /// + /// 重写进入事件,处理从口袋空间退出到主地图(模仿原版MapPortal.OnEntered) + /// + public override void OnEntered(Pawn pawn) + { + // 不调用 base.OnEntered,因为我们不需要原版的通知机制 + // 直接处理退出逻辑 + if (targetMap != null && pawn.Spawned) + { + ExitPocketSpace(pawn); + } + } + + /// + /// 重写进入按钮文本 + /// + public override string EnterString => "WULA.PocketSpace.ExitToMainMap".Translate(); + + /// + /// 重写进入按钮图标,使用原版的ViewCave图标 + /// + protected override Texture2D EnterTex => ContentFinder.Get("UI/Commands/ViewCave"); + + /// + /// 单个人员退出口袋空间(简化版本,利用MapPortal功能) + /// + private void ExitPocketSpace(Pawn pawn) + { + if (targetMap == null || !pawn.Spawned) return; + + try + { + // 在目标地图找一个安全位置 + IntVec3 exitPos = CellFinder.RandomClosewalkCellNear(targetPos, targetMap, 3, p => p.Standable(targetMap)); + + // 传送人员 + pawn.DeSpawn(); + GenPlace.TryPlaceThing(pawn, exitPos, targetMap, ThingPlaceMode.Near); + + // 切换到主地图 + if (pawn.IsColonistPlayerControlled) + { + Current.Game.CurrentMap = targetMap; + Find.CameraDriver.JumpToCurrentMapLoc(exitPos); + } + + Messages.Message("WULA.PocketSpace.ExitSuccess".Translate(pawn.LabelShort), MessageTypeDefOf.PositiveEvent); + } + catch (System.Exception ex) + { + Log.Error($"[WULA] Error exiting pocket space: {ex}"); + } + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs b/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs new file mode 100644 index 00000000..d2c2702b --- /dev/null +++ b/Source/WulaFallenEmpire/WULA_Shuttle/GenStep_WulaPocketSpaceSmall.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + /// + /// 13x13小型口袋空间生成器 + /// 创建一个简单的13x13空间,边缘是墙,中间是空地,适合作为穿梭机内部空间 + /// + public class GenStep_WulaPocketSpaceSmall : GenStep + { + public override int SeedPart => 928735; // 不同于AncientStockpile的种子 + + public override void Generate(Map map, GenStepParams parms) + { + try + { + Log.Message($"[WULA] Generating WULA pocket space, map size: {map.Size}"); + + // 获取地图边界 + IntVec3 mapSize = map.Size; + + // 生成外围岩石墙壁 + GenerateWalls(map); + + // 生成内部地板 + GenerateFloor(map); + + // 生成一些基础设施(照明等) + GenerateBasicInfrastructure(map); + + Log.Message("[WULA] WULA pocket space generation completed"); + } + catch (Exception ex) + { + Log.Error($"[WULA] Error generating WULA pocket space: {ex}"); + } + } + + /// + /// 生成外围墙壁 + /// + private void GenerateWalls(Map map) + { + IntVec3 mapSize = map.Size; + + // 获取地形和物品定义 + TerrainDef roughTerrain = DefDatabase.GetNamed("Granite_Rough", false) ?? + DefDatabase.GetNamed("Granite_Smooth", false) ?? + DefDatabase.GetNamed("Sandstone_Rough", false); + + ThingDef rockWallDef = DefDatabase.GetNamed("Wall_Rock", false) ?? + DefDatabase.GetNamed("Wall", false); + + // 遍历地图边缘,放置WulaWall + for (int x = 0; x < mapSize.x; x++) + { + for (int z = 0; z < mapSize.z; z++) + { + // 如果是边缘位置,放置WulaWall + if (x == 0 || x == mapSize.x - 1 || z == 0 || z == mapSize.z - 1) + { + IntVec3 pos = new IntVec3(x, 0, z); + + // 设置地形为岩石基础 + if (roughTerrain != null) + { + map.terrainGrid.SetTerrain(pos, roughTerrain); + } + + // 放置WulaWall + ThingDef wallDef = DefDatabase.GetNamed("WulaWall", false); + if (wallDef != null) + { + Thing wall = ThingMaker.MakeThing(wallDef); + wall.SetFaction(null); + GenPlace.TryPlaceThing(wall, pos, map, ThingPlaceMode.Direct); + } + else if (rockWallDef != null) + { + // 如果WulaWall不存在,使用原版岩石墙作为备选 + Thing wall = ThingMaker.MakeThing(rockWallDef); + wall.SetFaction(null); + GenPlace.TryPlaceThing(wall, pos, map, ThingPlaceMode.Direct); + Log.Warning("[WULA] WulaWall not found, using fallback wall"); + } + } + } + } + } + + /// + /// 生成内部地板 + /// + private void GenerateFloor(Map map) + { + IntVec3 mapSize = map.Size; + + // 为内部区域设置WulaFloor + TerrainDef floorDef = DefDatabase.GetNamed("WulaFloor", false); + TerrainDef fallbackFloor = floorDef ?? + DefDatabase.GetNamed("Steel", false) ?? + DefDatabase.GetNamed("MetalTile", false) ?? + DefDatabase.GetNamed("Concrete", false); + + if (floorDef == null) + { + Log.Warning("[WULA] WulaFloor not found, using fallback floor"); + } + + // 清理内部区域并设置正确的地板 + for (int x = 1; x < mapSize.x - 1; x++) + { + for (int z = 1; z < mapSize.z - 1; z++) + { + IntVec3 pos = new IntVec3(x, 0, z); + + // 清理该位置的所有岩石和阻挡物 + ClearCellAndSetFloor(map, pos, fallbackFloor); + } + } + + Log.Message($"[WULA] Set floor for internal area ({mapSize.x-2}x{mapSize.z-2}) to {(floorDef?.defName ?? fallbackFloor?.defName)}"); + } + + /// + /// 清理单元格并设置地板 + /// + private void ClearCellAndSetFloor(Map map, IntVec3 pos, TerrainDef floorDef) + { + if (!pos.InBounds(map)) return; + + try + { + // 获取该位置的所有物品 + List thingsAtPos = pos.GetThingList(map).ToList(); // 创建副本避免修改时出错 + + // 清理所有建筑物和岩石(强力清理,确保地板可以放置) + foreach (Thing thing in thingsAtPos) + { + bool shouldRemove = false; + + // 检查是否为建筑物 + if (thing.def.category == ThingCategory.Building) + { + // 如果是自然岩石 + if (thing.def.building?.isNaturalRock == true) + { + shouldRemove = true; + } + // 或者是岩石相关的建筑 + else if (thing.def.defName.Contains("Rock") || + thing.def.defName.Contains("Slate") || + thing.def.defName.Contains("Granite") || + thing.def.defName.Contains("Sandstone") || + thing.def.defName.Contains("Limestone") || + thing.def.defName.Contains("Marble") || + thing.def.defName.Contains("Quartzite") || + thing.def.defName.Contains("Jade")) + { + shouldRemove = true; + } + // 或者是其他阻挡的建筑物(除了我们的乌拉墙) + else if (!thing.def.defName.Contains("Wula") && thing.def.Fillage == FillCategory.Full) + { + shouldRemove = true; + } + } + + if (shouldRemove) + { + if (Prefs.DevMode) // 只在开发模式下输出详细日志 + { + Log.Message($"[WULA] Removing {thing.def.defName} at {pos} to make space for floor"); + } + thing.Destroy(DestroyMode.Vanish); + } + } + + // 在清理后稍微延迟,再检查一次(确保彻底清理) + thingsAtPos = pos.GetThingList(map).ToList(); + foreach (Thing thing in thingsAtPos) + { + if (thing.def.category == ThingCategory.Building && thing.def.Fillage == FillCategory.Full) + { + Log.Warning($"[WULA] Force removing remaining building {thing.def.defName} at {pos}"); + thing.Destroy(DestroyMode.Vanish); + } + } + + // 设置地板地形 + if (floorDef != null) + { + map.terrainGrid.SetTerrain(pos, floorDef); + if (Prefs.DevMode) + { + Log.Message($"[WULA] Set terrain at {pos} to {floorDef.defName}"); + } + } + } + catch (Exception ex) + { + Log.Error($"[WULA] Error clearing cell at {pos}: {ex}"); + } + } + + /// + /// 生成基础设施 + /// + private void GenerateBasicInfrastructure(Map map) + { + IntVec3 mapSize = map.Size; + IntVec3 center = map.Center; + + // 获取灯具定义 + ThingDef lampDef = DefDatabase.GetNamed("StandingLamp", false) ?? + DefDatabase.GetNamed("TorchLamp", false) ?? + DefDatabase.GetNamed("Campfire", false); + + if (lampDef == null) + { + Log.Warning("[WULA] No lamp definition found, skipping lighting generation"); + return; + } + + // 在四个角落放置照明设备 + var lightPositions = new List + { + new IntVec3(2, 0, 2), // 左下角 + new IntVec3(mapSize.x - 3, 0, 2), // 右下角 + new IntVec3(2, 0, mapSize.z - 3), // 左上角 + new IntVec3(mapSize.x - 3, 0, mapSize.z - 3) // 右上角 + }; + + foreach (IntVec3 pos in lightPositions) + { + if (pos.InBounds(map) && pos.Standable(map)) + { + // 放置立式灯 + Thing lamp = ThingMaker.MakeThing(lampDef); + lamp.SetFaction(null); + GenPlace.TryPlaceThing(lamp, pos, map, ThingPlaceMode.Direct); + } + } + + // 在中心区域留出空间,这里将放置退出点 + // 不在这里放置退出点,因为这会由Building_ArmedShuttleWithPocket来处理 + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 90b1d75a..ebb33551 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -169,6 +169,9 @@ + + +