暂存2
This commit is contained in:
Binary file not shown.
@@ -17,7 +17,7 @@
|
||||
<li>Underground_RocksFromGrid</li>
|
||||
<li>Terrain</li>
|
||||
<li>WULA_PocketSpace_Small</li>
|
||||
<!-- 移除Fog GenStep,因为它需要PlayerStartSpot而口袋空间不需要 -->
|
||||
<li>Fog</li>
|
||||
</genSteps>
|
||||
</MapGeneratorDef>
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<ThingDef ParentName="BuildingBase">
|
||||
<defName>WULA_ArmedShuttleWithPocket</defName>
|
||||
<label>乌拉武装运输机</label>
|
||||
<label>armed shuttle with pocket space</label>
|
||||
<description>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.</description>
|
||||
<thingClass>WulaFallenEmpire.Building_ArmedShuttleWithPocket</thingClass>
|
||||
<preventDroppingThingsOn>true</preventDroppingThingsOn>
|
||||
@@ -27,28 +26,30 @@
|
||||
</shadowData>
|
||||
</graphicData>
|
||||
<statBases>
|
||||
<MaxHitPoints>6000</MaxHitPoints>
|
||||
<Flammability>0.5</Flammability>
|
||||
<WorkToBuild>40000</WorkToBuild>
|
||||
<Mass>150</Mass>
|
||||
<Comfort>0.65</Comfort>
|
||||
<MaxHitPoints>800</MaxHitPoints>
|
||||
<Flammability>0.4</Flammability>
|
||||
<WorkToBuild>60000</WorkToBuild>
|
||||
<Mass>200</Mass>
|
||||
<Comfort>0.75</Comfort>
|
||||
</statBases>
|
||||
<tickerType>Normal</tickerType>
|
||||
<designationCategory>Odyssey</designationCategory>
|
||||
<constructionSkillPrerequisite>8</constructionSkillPrerequisite>
|
||||
<constructionSkillPrerequisite>10</constructionSkillPrerequisite>
|
||||
<costList>
|
||||
<Steel>300</Steel>
|
||||
<Plasteel>200</Plasteel>
|
||||
<ComponentIndustrial>8</ComponentIndustrial>
|
||||
<ComponentSpacer>2</ComponentSpacer>
|
||||
<Steel>400</Steel>
|
||||
<Plasteel>300</Plasteel>
|
||||
<ComponentIndustrial>12</ComponentIndustrial>
|
||||
<ComponentSpacer>4</ComponentSpacer>
|
||||
<ShuttleEngine>1</ShuttleEngine>
|
||||
<VanometricPowerCore>1</VanometricPowerCore>
|
||||
</costList>
|
||||
<canOverlapZones>true</canOverlapZones>
|
||||
<killedLeavings>
|
||||
<Steel>60</Steel>
|
||||
<Plasteel>60</Plasteel>
|
||||
<ChunkSlagSteel>5</ChunkSlagSteel>
|
||||
<ComponentIndustrial>4</ComponentIndustrial>
|
||||
<Steel>80</Steel>
|
||||
<Plasteel>90</Plasteel>
|
||||
<ChunkSlagSteel>6</ChunkSlagSteel>
|
||||
<ComponentIndustrial>6</ComponentIndustrial>
|
||||
<ComponentSpacer>1</ComponentSpacer>
|
||||
</killedLeavings>
|
||||
<rotatable>true</rotatable>
|
||||
<hasInteractionCell>true</hasInteractionCell>
|
||||
@@ -68,18 +69,30 @@
|
||||
<isInert>true</isInert>
|
||||
<forcedCostLeavings>
|
||||
<li MayRequire="Ludeon.RimWorld.Odyssey">ShuttleEngine</li>
|
||||
<li MayRequire="Ludeon.RimWorld.Anomaly">VanometricPowerCore</li>
|
||||
</forcedCostLeavings>
|
||||
<turretGunDef>Gun_ChargeBlasterHeavyTurret</turretGunDef>
|
||||
<turretBurstCooldownTime>5.5</turretBurstCooldownTime>
|
||||
<turretTopDrawSize>1.75</turretTopDrawSize>
|
||||
<turretTopOffset>(0, 0.05)</turretTopOffset>
|
||||
<turretGunDef>Gun_ChargeBlasterAdvancedTurret</turretGunDef>
|
||||
<turretBurstCooldownTime>4.5</turretBurstCooldownTime>
|
||||
<turretBurstWarmupTime>1.0~1.5</turretBurstWarmupTime>
|
||||
<turretTopDrawSize>1.9</turretTopDrawSize>
|
||||
<turretTopOffset>(0, 0.08)</turretTopOffset>
|
||||
</building>
|
||||
<!-- 口袋空间配置 -->
|
||||
<modExtensions>
|
||||
<li Class="WulaFallenEmpire.PocketMapProperties">
|
||||
<pocketMapGenerator>WULA_PocketSpace_Small</pocketMapGenerator>
|
||||
<exitDef>WULA_PocketMapExit</exitDef>
|
||||
<pocketMapSize>(13, 13)</pocketMapSize>
|
||||
<allowDirectAccess>true</allowDirectAccess>
|
||||
</li>
|
||||
</modExtensions>
|
||||
<inspectorTabs>
|
||||
<li>ITab_ContentsTransporter</li>
|
||||
<li>ITab_Shells</li>
|
||||
</inspectorTabs>
|
||||
<researchPrerequisites>
|
||||
<li>Shuttles</li>
|
||||
<li MayRequire="Ludeon.RimWorld.Anomaly">VoidStructure</li>
|
||||
</researchPrerequisites>
|
||||
<comps>
|
||||
<li Class="CompProperties_Shuttle">
|
||||
@@ -121,27 +134,19 @@
|
||||
<canEjectFuel>true</canEjectFuel>
|
||||
</li>
|
||||
<li Class="CompProperties_Power">
|
||||
<compClass>CompPowerPlant</compClass>
|
||||
<basePowerConsumption>-400</basePowerConsumption>
|
||||
<transmitsPower>true</transmitsPower>
|
||||
<compClass>CompPowerTrader</compClass>
|
||||
<basePowerConsumption>200</basePowerConsumption>
|
||||
<shortCircuitInRain>false</shortCircuitInRain>
|
||||
</li>
|
||||
<li Class="CompProperties_AmbientSound">
|
||||
<sound>ShuttleIdle_Ambience</sound>
|
||||
</li>
|
||||
</comps>
|
||||
<modExtensions>
|
||||
<li Class="WulaFallenEmpire.PocketMapProperties">
|
||||
<pocketMapGenerator>WULA_PocketSpace_Small</pocketMapGenerator>
|
||||
<exitDef>WULA_PocketMapExit</exitDef>
|
||||
<pocketMapSize>(13, 13)</pocketMapSize>
|
||||
<allowDirectAccess>true</allowDirectAccess>
|
||||
</li>
|
||||
</modExtensions>
|
||||
<placeWorkers>
|
||||
<li>PlaceWorker_NotUnderRoof</li>
|
||||
<li>PlaceWorker_TurretTop</li>
|
||||
</placeWorkers>
|
||||
<uiOrder>2601</uiOrder>
|
||||
<uiOrder>2602</uiOrder>
|
||||
</ThingDef>
|
||||
|
||||
<!-- 改进的武器定义 -->
|
||||
@@ -300,15 +305,13 @@
|
||||
<label>pocket space exit</label>
|
||||
<description>An exit portal that allows return from the pocket space to the main map.</description>
|
||||
<thingClass>WulaFallenEmpire.Building_PocketMapExit</thingClass>
|
||||
<size>(3,3)</size>
|
||||
<size>(1,1)</size>
|
||||
<drawerType>MapMeshAndRealTime</drawerType>
|
||||
<graphicData>
|
||||
<texPath>Wula/Building/WULA_War_Machine_Recharger</texPath>
|
||||
<graphicClass>Graphic_Multi</graphicClass>
|
||||
<drawSize>(3,3)</drawSize>
|
||||
<graphicClass>Graphic_Single</graphicClass>
|
||||
<texPath>Things/Building/Misc/CaveExit/CaveExit</texPath>
|
||||
<drawSize>(1,1)</drawSize>
|
||||
</graphicData>
|
||||
<interactionCellOffset>(0,0,0)</interactionCellOffset>
|
||||
<passability>Standable</passability>
|
||||
<statBases>
|
||||
<Flammability>0</Flammability>
|
||||
</statBases>
|
||||
@@ -320,11 +323,6 @@
|
||||
<li Class="CompProperties_Effecter">
|
||||
<effecterDef>UndercaveMapExitLightshafts</effecterDef>
|
||||
</li>
|
||||
<li Class="CompProperties_Power">
|
||||
<compClass>CompPowerPlant</compClass>
|
||||
<basePowerConsumption>-400</basePowerConsumption>
|
||||
<transmitsPower>true</transmitsPower>
|
||||
</li>
|
||||
</comps>
|
||||
</ThingDef>
|
||||
</Defs>
|
||||
@@ -9,15 +9,7 @@
|
||||
|
||||
<!-- Gizmo 按钮文本 -->
|
||||
<WULA.PocketSpace.Enter>进入内部空间</WULA.PocketSpace.Enter>
|
||||
<WULA.PocketSpace.EnterPawns>传送人员到内部空间</WULA.PocketSpace.EnterPawns>
|
||||
<WULA.PocketSpace.EnterDesc>进入穿梭机的内部口袋空间。无需骇入即可直接访问。选中的殖民者将被传送到内部空间。</WULA.PocketSpace.EnterDesc>
|
||||
<WULA.PocketSpace.CreateMap>创建内部空间</WULA.PocketSpace.CreateMap>
|
||||
<WULA.PocketSpace.CreateMapDesc>创建穿梭机的内部口袋空间。首次使用时需要创建。</WULA.PocketSpace.CreateMapDesc>
|
||||
<WULA.PocketSpace.CreationSuccess>内部空间创建成功!</WULA.PocketSpace.CreationSuccess>
|
||||
<WULA.PocketSpace.CancelEnter>取消进入</WULA.PocketSpace.CancelEnter>
|
||||
<WULA.PocketSpace.Entering>正在进入...</WULA.PocketSpace.Entering>
|
||||
<WULA.PocketSpace.ViewMap>查看地图</WULA.PocketSpace.ViewMap>
|
||||
<WULA.PocketSpace.ViewMapDesc>切换到口袋空间地图查看内部情况。</WULA.PocketSpace.ViewMapDesc>
|
||||
|
||||
<WULA.PocketSpace.SwitchTo>切换到内部空间</WULA.PocketSpace.SwitchTo>
|
||||
<WULA.PocketSpace.SwitchToDesc>直接切换视角到内部口袋空间。适用于已经有殖民者在内部空间时的快速切换。</WULA.PocketSpace.SwitchToDesc>
|
||||
|
||||
@@ -9,15 +9,7 @@
|
||||
|
||||
<!-- Gizmo button text -->
|
||||
<WULA.PocketSpace.Enter>Enter pocket space</WULA.PocketSpace.Enter>
|
||||
<WULA.PocketSpace.EnterPawns>Transport people to pocket space</WULA.PocketSpace.EnterPawns>
|
||||
<WULA.PocketSpace.EnterDesc>Enter the shuttle's internal pocket space. Direct access without hacking required. Selected colonists will be transported to the internal space.</WULA.PocketSpace.EnterDesc>
|
||||
<WULA.PocketSpace.CreateMap>Create pocket space</WULA.PocketSpace.CreateMap>
|
||||
<WULA.PocketSpace.CreateMapDesc>Create the shuttle's internal pocket space. Required for first-time use.</WULA.PocketSpace.CreateMapDesc>
|
||||
<WULA.PocketSpace.CreationSuccess>Pocket space created successfully!</WULA.PocketSpace.CreationSuccess>
|
||||
<WULA.PocketSpace.CancelEnter>Cancel enter</WULA.PocketSpace.CancelEnter>
|
||||
<WULA.PocketSpace.Entering>Entering...</WULA.PocketSpace.Entering>
|
||||
<WULA.PocketSpace.ViewMap>View map</WULA.PocketSpace.ViewMap>
|
||||
<WULA.PocketSpace.ViewMapDesc>Switch to pocket space map to view internal conditions.</WULA.PocketSpace.ViewMapDesc>
|
||||
|
||||
<WULA.PocketSpace.SwitchTo>Switch to pocket space</WULA.PocketSpace.SwitchTo>
|
||||
<WULA.PocketSpace.SwitchToDesc>Directly switch view to the internal pocket space. Useful for quick switching when colonists are already inside.</WULA.PocketSpace.SwitchToDesc>
|
||||
|
||||
File diff suppressed because one or more lines are too long
109
Source/ProjectDocumentation/ArmedPocketShuttle_DesignDocument.md
Normal file
109
Source/ProjectDocumentation/ArmedPocketShuttle_DesignDocument.md
Normal file
@@ -0,0 +1,109 @@
|
||||
# 武装口袋穿梭机 (Armed Pocket Shuttle) - 设计文档
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
**目标**:重新设计并实现一个《边缘世界》(RimWorld) 的Mod,引入一种具备武装能力和内部“口袋空间”的特殊穿梭机。该穿梭机将解决现有实现中存在的顽固bug,并提供更稳定、更灵活的游戏体验。
|
||||
|
||||
**核心问题**:现有 `Building_ArmedShuttleWithPocket.cs` 的实现尝试过度模仿原版 `MapPortal` 的内部机制,导致代码复杂且难以调试和维护,最终陷入无法修复的bug。
|
||||
|
||||
**解决方案理念**:
|
||||
* **放弃现有问题代码**:彻底废弃当前 `Building_ArmedShuttleWithPocket.cs` 中导致bug的复杂逻辑。
|
||||
* **回归原版基础**:以 `Building_PassengerShuttle` 为基类,利用其成熟的运输和组件系统。
|
||||
* **组合与委托**:通过组合而非直接继承或深度模仿的方式,将 `MapPortal` 的概念融入到新穿梭机中,实现口袋空间功能。
|
||||
* **职责分离**:明确区分穿梭机本体(武装、飞行、外部运输)和口袋空间(内部地图、内部传送)的职责。
|
||||
|
||||
## 2. 核心设计思路
|
||||
|
||||
### 2.1 穿梭机本体 (`Building_ArmedShuttleWithPocket` - 新版)
|
||||
|
||||
* **继承**: `Building_ArmedShuttleWithPocket` 将继承 `Building_ArmedShuttle`,从而自然继承了武装能力和 `Building_PassengerShuttle` 的所有基础功能,包括 `CompTransporter` 和 `CompShuttle` 组件。
|
||||
* **唯一容器**: 穿梭机自身的 `CompTransporter` 将是唯一且权威的物品和人员容器。所有装载操作都将首先将物品和人员放入这个 `CompTransporter` 的 `innerContainer`。
|
||||
* **武装能力**:通过继承 `Building_ArmedShuttle`,穿梭机将保留其炮塔和攻击逻辑。
|
||||
|
||||
### 2.2 口袋空间实现
|
||||
|
||||
口袋空间将是一个独立生成的 `Map` 实例,通过 `PocketMapUtility` 进行管理。
|
||||
|
||||
* **内部地图 (`pocketMap`)**: `Building_ArmedShuttleWithPocket` 将持有一个 `Map` 类型的私有字段 `pocketMap`,代表内部空间。
|
||||
* **地图生成**:
|
||||
* 口袋地图的生成将通过 `CreatePocketMap()` 方法触发,该方法会调用 `PocketMapUtility.GeneratePocketMap()`。
|
||||
* 地图的尺寸 (`pocketMapSize`)、生成器 (`mapGenerator`) 和出口定义 (`exitDef`) 将通过 `PocketMapProperties` (`DefModExtension`) 从XML配置中获取。
|
||||
* 生成后,会在口袋地图的特定位置放置一个 `Building_PocketMapExit` 实例,作为进出内部空间的唯一通道。
|
||||
* **人员/物品进出**:
|
||||
* **从主地图进入口袋空间**:
|
||||
* 人员:通过 `EnterPocketSpace(IEnumerable<Pawn> pawns)` 方法,将选定的小人从主地图传送到口袋地图的指定位置(例如出口附近)。
|
||||
* 物品:物品将首先通过穿梭机的 `CompTransporter` 装载。
|
||||
* **从口袋空间返回主地图**: 通过 `Building_PocketMapExit` 来实现,它将负责将口袋空间内的物品和人员传送到主地图的穿梭机位置。
|
||||
* **内部物品管理**: 口袋地图内的物品将直接作为地图上的 `Thing` 存在,而不是由穿梭机本体的 `CompTransporter` 直接管理。当穿梭机被销毁时,口袋地图内的所有物品和人员将被安全地转移回主地图的穿梭机位置。
|
||||
|
||||
### 2.3 装载机制 (`GetGizmos` 重构)
|
||||
|
||||
`Building_ArmedShuttleWithPocket` 的 `GetGizmos()` 方法将被重写,以提供清晰且功能分离的装载选项:
|
||||
|
||||
1. **“装载至货仓” (WULA.LoadIntoCargo)**:
|
||||
* **功能**: 模拟原版穿梭机的装载行为。玩家选择人员和物品后,殖民者会将它们搬运到穿梭机,并存放到穿梭机自身的 `this.TransporterComp.innerContainer` 中。
|
||||
* **实现**: 调用 `this.TransporterComp` 提供的标准装载对话框和逻辑。
|
||||
|
||||
2. **“装载并传送入内” (WULA.LoadAndTeleport)**:
|
||||
* **功能**: 玩家选择人员和物品,殖民者将其搬运到穿梭机并存放到 `this.TransporterComp.innerContainer`。**一旦装载完成**(即 `this.TransporterComp.leftToLoad` 为空),系统将自动触发一个内部传送过程,将 `this.TransporterComp.innerContainer` 中的所有物品和人员取出,并直接放置到口袋地图的指定位置。
|
||||
* **实现**:
|
||||
* 通过一个布尔标志 (`doTeleportAfterLoading`) 来标记当前装载操作是否需要进行内部传送。
|
||||
* 在 `Tick()` 方法中监控 `this.TransporterComp.leftToLoad` 的状态。当其变为空且 `doTeleportAfterLoading` 为 `true` 时,调用 `TeleportContentsToPocketDimension()` 方法。
|
||||
* `TeleportContentsToPocketDimension()` 方法将遍历 `this.TransporterComp.innerContainer` 中的所有物品和人员,使用 `Thing.DeSpawn()` 和 `GenPlace.TryPlaceThing()` 将它们移动到 `pocketMap` 的指定位置。
|
||||
* **可见性**: 只有当口袋空间 (`pocketMap`) 已经生成 (`PocketMapExists == true`) 时,此按钮才会在UI中显示。
|
||||
|
||||
## 3. 关键组件/类 (`WulaFallenEmpire` 命名空间)
|
||||
|
||||
* **`Building_ArmedShuttleWithPocket.cs` (主类)**:
|
||||
* 继承 `Building_ArmedShuttle`。
|
||||
* 私有字段 `pocketMap` (类型 `Map`)。
|
||||
* 布尔标志 `pocketMapGenerated`。
|
||||
* `MapGeneratorDef mapGenerator` 和 `ThingDef exitDef` 用于XML配置。
|
||||
* `public Building_PocketMapExit exit` 引用口袋出口。
|
||||
* 布尔标志 `doTeleportAfterLoading` 和 `wasLoading` 用于控制传送逻辑。
|
||||
* 属性 `PocketMap`, `PocketMapExists`, `PocketMapGenerated`。
|
||||
* 重写 `ExposeData()` 进行持久化。
|
||||
* 重写 `DeSpawn()` 清理口袋地图。
|
||||
* 重写 `Tick()` 监控装载状态并触发传送。
|
||||
* 重写 `GetInspectString()` 提供状态信息。
|
||||
* 重写 `GetGizmos()` 提供自定义Gizmo。
|
||||
* 方法 `CreateLoadGizmo(bool teleport)` 生成装载按钮。
|
||||
* 方法 `TeleportContentsToPocketDimension()` 执行内部传送。
|
||||
* 方法 `EnterPocketSpace(IEnumerable<Pawn> pawns)` 将人员传送到口袋空间。
|
||||
* 方法 `SwitchToPocketSpace()` 切换视角。
|
||||
* 方法 `CreatePocketMap()` 生成口袋地图。
|
||||
* 方法 `GeneratePocketMapInt()` (受保护虚方法,可重写)。
|
||||
* 方法 `GetExtraGenSteps()` (受保护虚方法,可重写)。
|
||||
* 方法 `PlaceExitInPocketMap()` 在口袋地图中放置出口。
|
||||
* 方法 `TransferPawnToPocketSpace(Pawn pawn)` 将单个小人传送到口袋空间。
|
||||
* 方法 `TransferAllFromPocketToMainMap()` 在销毁时将口袋内容传回主地图。
|
||||
* 实现 `IThingHolder` 接口:`GetChildHolders()` (将 `this.TransporterComp` 添加为子容器) 和 `GetDirectlyHeldThings()` (返回一个空的 `ThingOwner` 实例)。
|
||||
* `UpdateExitPointTarget()` 更新出口目标位置。
|
||||
* 重写 `SpawnSetup()` 初始化组件和属性。
|
||||
|
||||
* **`Building_PocketMapExit.cs` (现有)**:
|
||||
* 作为口袋空间的出口,负责将内部人员和物品传回主地图。
|
||||
|
||||
* **`PocketMapProperties.cs` (现有)**:
|
||||
* `DefModExtension` 类,用于在XML中配置口袋地图的尺寸 (`pocketMapSize`)、地图生成器 (`mapGenerator`) 和出口建筑定义 (`exitDef`)。
|
||||
|
||||
## 4. XML 定义 (`1.6/1.6/Defs/ThingDefs_Buildings/Building_WULA_ArmedShuttleWithPocket.xml`)
|
||||
|
||||
* `ThingDef` 定义 `WULA_ArmedShuttleWithPocket`。
|
||||
* `modExtensions` 中包含 `PocketMapProperties`:
|
||||
```xml
|
||||
<modExtensions>
|
||||
<li Class="WulaFallenEmpire.PocketMapProperties">
|
||||
<mapGenerator>WULA_PocketSpace_Small</mapGenerator> <!-- 使用正确的标签名 -->
|
||||
<exitDef>WULA_PocketMapExit</exitDef>
|
||||
<pocketMapSize>(13, 13)</pocketMapSize>
|
||||
</li>
|
||||
</modExtensions>
|
||||
```
|
||||
|
||||
## 5. 预期结果
|
||||
|
||||
* 一个功能稳定、没有运行时崩溃的武装口袋穿梭机。
|
||||
* 清晰的UI和交互流程,允许玩家选择不同的装载模式。
|
||||
* 口袋空间能够正确生成、管理和销毁,内部物品和人员能够安全进出。
|
||||
* 代码结构更清晰,易于理解和未来的维护。
|
||||
@@ -3,6 +3,9 @@
|
||||
{
|
||||
"name": "3516260226",
|
||||
"path": "../.."
|
||||
},
|
||||
{
|
||||
"path": "../../../../Data"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
public static ThingDef WULA_MaintenancePod;
|
||||
public static ThingDef WULA_Charging_Station_Synth;
|
||||
public static ThingDef WULA_PocketMapExit;
|
||||
|
||||
static ThingDefOf_WULA()
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -112,6 +112,106 @@ namespace WulaFallenEmpire
|
||||
/// </summary>
|
||||
protected override Texture2D EnterTex => ContentFinder<Texture2D>.Get("UI/Commands/ViewCave");
|
||||
|
||||
/// <summary>
|
||||
/// 重写GetGizmos方法,添加穿梭机装载相关按钮
|
||||
/// </summary>
|
||||
public override IEnumerable<Gizmo> GetGizmos()
|
||||
{
|
||||
// 获取基类的按钮(退出空间和查看地图按钮)
|
||||
foreach (Gizmo gizmo in base.GetGizmos())
|
||||
{
|
||||
yield return gizmo;
|
||||
}
|
||||
|
||||
// 如果有父穿梭机,添加穿梭机相关的装载按钮
|
||||
if (parentShuttle != null)
|
||||
{
|
||||
// 查看主地图按钮
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "WULA.PocketSpace.ViewMainMap".Translate(),
|
||||
defaultDesc = "WULA.PocketSpace.ViewMainMapDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Commands/ViewWorld"),
|
||||
action = delegate
|
||||
{
|
||||
if (targetMap != null)
|
||||
{
|
||||
Current.Game.CurrentMap = targetMap;
|
||||
if (parentShuttle != null && parentShuttle.Spawned)
|
||||
{
|
||||
Find.CameraDriver.JumpToCurrentMapLoc(parentShuttle.Position);
|
||||
Find.Selector.Select(parentShuttle);
|
||||
}
|
||||
else
|
||||
{
|
||||
Find.CameraDriver.JumpToCurrentMapLoc(targetPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 穿梭机装载管理按钮
|
||||
if (parentShuttle.Spawned)
|
||||
{
|
||||
// 获取穿梭机的CompTransporter组件
|
||||
CompTransporter transporter = parentShuttle.GetComp<CompTransporter>();
|
||||
if (transporter != null)
|
||||
{
|
||||
// 添加装载按钮(模仿原版CompTransporter的功能)
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "WULA.PocketSpace.LoadShuttle".Translate(),
|
||||
defaultDesc = "WULA.PocketSpace.LoadShuttleDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Commands/LoadTransporter"),
|
||||
action = delegate
|
||||
{
|
||||
OpenShuttleLoadingDialog(transporter);
|
||||
}
|
||||
};
|
||||
|
||||
// 如果正在装载,添加取消装载按钮
|
||||
if (transporter.LoadingInProgress)
|
||||
{
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "WULA.PocketSpace.CancelLoading".Translate(),
|
||||
defaultDesc = "WULA.PocketSpace.CancelLoadingDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Designators/Cancel"),
|
||||
action = delegate
|
||||
{
|
||||
transporter.CancelLoad();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 添加穿梭机发射按钮(如果正在装载且可以发射)
|
||||
CompLaunchable launchable = parentShuttle.GetComp<CompLaunchable>();
|
||||
if (launchable != null && transporter != null && !transporter.LoadingInProgress)
|
||||
{
|
||||
foreach (Gizmo gizmo in launchable.CompGetGizmosExtra())
|
||||
{
|
||||
yield return gizmo;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 穿梭机状态信息按钮
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "WULA.PocketSpace.ShuttleStatus".Translate(),
|
||||
defaultDesc = "WULA.PocketSpace.ShuttleStatusDesc".Translate(),
|
||||
icon = ContentFinder<Texture2D>.Get("UI/Commands/InfoCard"),
|
||||
action = delegate
|
||||
{
|
||||
ShowShuttleStatusInfo();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 单个人员退出口袋空间(简化版本,利用MapPortal功能)
|
||||
/// </summary>
|
||||
@@ -142,5 +242,78 @@ namespace WulaFallenEmpire
|
||||
Log.Error($"[WULA] Error exiting pocket space: {ex}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开穿梭机装载对话框
|
||||
/// </summary>
|
||||
private void OpenShuttleLoadingDialog(CompTransporter transporter)
|
||||
{
|
||||
if (transporter == null) return;
|
||||
|
||||
try
|
||||
{
|
||||
// 使用原版的Dialog_LoadTransporters打开装载对话框
|
||||
Find.WindowStack.Add(new Dialog_LoadTransporters(parentShuttle.Map, new List<CompTransporter> { transporter }));
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Log.Error($"[WULA] Error opening shuttle loading dialog: {ex}");
|
||||
Messages.Message("WULA.PocketSpace.LoadingDialogError".Translate(), MessageTypeDefOf.RejectInput);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示穿梭机状态信息
|
||||
/// </summary>
|
||||
private void ShowShuttleStatusInfo()
|
||||
{
|
||||
if (parentShuttle == null) return;
|
||||
|
||||
StringBuilder statusText = new StringBuilder();
|
||||
|
||||
// 基本信息
|
||||
statusText.AppendLine("WULA.PocketSpace.ShuttleInfo".Translate());
|
||||
statusText.AppendLine($"• 状态: {(parentShuttle.Spawned ? "已部署" : "飞行中")}");
|
||||
|
||||
if (parentShuttle.Spawned)
|
||||
{
|
||||
statusText.AppendLine($"• 位置: {targetMap?.Parent?.Label ?? "未知"} ({targetPos.x}, {targetPos.z})");
|
||||
|
||||
// 燃料信息
|
||||
CompRefuelable fuel = parentShuttle.GetComp<CompRefuelable>();
|
||||
if (fuel != null)
|
||||
{
|
||||
statusText.AppendLine($"• 燃料: {fuel.Fuel:F0}/{fuel.Props.fuelCapacity:F0}");
|
||||
}
|
||||
|
||||
// 装载信息
|
||||
CompTransporter transporter = parentShuttle.GetComp<CompTransporter>();
|
||||
if (transporter != null)
|
||||
{
|
||||
statusText.AppendLine($"• 载重: {transporter.MassUsage:F1}/{transporter.Props.massCapacity:F1}");
|
||||
if (transporter.LoadingInProgress)
|
||||
{
|
||||
statusText.AppendLine("• 装载状态: 正在装载...");
|
||||
}
|
||||
}
|
||||
|
||||
// 口袋空间信息
|
||||
if (parentShuttle.pocketMapGenerated)
|
||||
{
|
||||
statusText.AppendLine($"• 内部空间: 已初始化");
|
||||
if (parentShuttle.innerContainer.Count > 0)
|
||||
{
|
||||
statusText.AppendLine($"• 内部储存: {parentShuttle.innerContainer.Count} 件物品");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
statusText.AppendLine("• 穿梭机正在飞行中,无法获取详细信息");
|
||||
}
|
||||
|
||||
// 显示信息对话框
|
||||
Find.WindowStack.Add(new Dialog_MessageBox(statusText.ToString(), "WULA.PocketSpace.ShuttleStatus".Translate()));
|
||||
}
|
||||
}
|
||||
}
|
||||
12
Source/WulaFallenEmpire/WULA_Shuttle/PocketMapProperties.cs
Normal file
12
Source/WulaFallenEmpire/WULA_Shuttle/PocketMapProperties.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class PocketMapProperties : DefModExtension
|
||||
{
|
||||
public IntVec2 pocketMapSize = new IntVec2(13, 13);
|
||||
public MapGeneratorDef mapGenerator;
|
||||
public ThingDef exitDef;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user