未编译

This commit is contained in:
2025-10-31 17:15:34 +08:00
parent c74d9d9916
commit 8f85bd00f3
11 changed files with 914 additions and 352 deletions

View File

@@ -903,6 +903,225 @@
</comps>
</AlienRace.ThingDef_AlienRace>
<!-- 乌拉基础机械族类 -->
<ThingDef ParentName="BasePawn" Name="WULA_BaseMechanoid" Abstract="True">
<soundImpactDefault>BulletImpact_Metal</soundImpactDefault>
<statBases>
<MarketValue>1200</MarketValue>
<PsychicSensitivity>0.5</PsychicSensitivity>
<ToxicResistance>1</ToxicResistance>
<Flammability>0</Flammability>
<ComfyTemperatureMin>-100</ComfyTemperatureMin>
<ComfyTemperatureMax>250</ComfyTemperatureMax>
<MeatAmount>0</MeatAmount>
<ArmorRating_Heat>2.00</ArmorRating_Heat>
<MoveSpeed>3.4</MoveSpeed>
<BandwidthCost MayRequire="Ludeon.RimWorld.Biotech">1</BandwidthCost>
<ControlTakingTime MayRequire="Ludeon.RimWorld.Biotech">12</ControlTakingTime>
<ToxicEnvironmentResistance>1</ToxicEnvironmentResistance>
<MechEnergyLossPerHP MayRequire="Ludeon.RimWorld.Biotech">0.33</MechEnergyLossPerHP>
<WastepacksPerRecharge MayRequire="Ludeon.RimWorld.Biotech">5</WastepacksPerRecharge>
<WorkSpeedGlobal MayRequire="Ludeon.RimWorld.Biotech">0.5</WorkSpeedGlobal>
<ArmorRating_Blunt>0.10</ArmorRating_Blunt>
<ArmorRating_Sharp>0.20</ArmorRating_Sharp>
<MechEnergyLossPerHP>0.66</MechEnergyLossPerHP>
</statBases>
<receivesSignals>true</receivesSignals>
<tradeability>None</tradeability>
<race>
<fleshType>Mechanoid</fleshType>
<needsRest>false</needsRest>
<hasGenders>false</hasGenders>
<foodType>None</foodType>
<lifeExpectancy>2500</lifeExpectancy>
<bloodDef>Filth_MachineBits</bloodDef>
<nameGenerator MayRequire="Ludeon.RimWorld.Biotech">NamerMech</nameGenerator>
<soundCallIntervalRange>1000~2000</soundCallIntervalRange>
<soundCallIntervalFriendlyFactor>2</soundCallIntervalFriendlyFactor>
<thinkTreeConstant MayRequire="Ludeon.RimWorld.Biotech">MechConstant</thinkTreeConstant>
<canFlyInVacuum>true</canFlyInVacuum>
<body>Mech_Light</body>
<intelligence>ToolUser</intelligence>
<thinkTreeMain>WULA_AutonomousMech</thinkTreeMain>
<baseBodySize>0.7</baseBodySize>
<mechWeightClass>Light</mechWeightClass>
</race>
<butcherProducts>
<Steel>10</Steel>
</butcherProducts>
<tools>
<li>
<label>head</label>
<capacities>
<li>Blunt</li>
</capacities>
<power>6</power>
<cooldownTime>2.6</cooldownTime>
<linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
<comps>
<li Class="CompProperties_CanBeDormant">
<compClass>CompMechanoid</compClass>
</li>
<li Class="CompProperties_WakeUpDormant">
<wakeUpOnDamage>true</wakeUpOnDamage>
<wakeUpCheckRadius>30</wakeUpCheckRadius>
<wakeUpSound>MechanoidsWakeUp</wakeUpSound>
</li>
<!-- 自动机械族,不需要人工监管 -->
<li Class="WulaFallenEmpire.CompProperties_AutonomousMech">
<enableAutonomousDrafting>true</enableAutonomousDrafting>
<enableAutonomousWork>true</enableAutonomousWork>
<requirePowerForAutonomy>true</requirePowerForAutonomy>
</li>
<!--加上这个组件的机械体会直接跳过原版指挥范围判定,征召必须-->
<li Class="WulaFallenEmpire.CompProperties_GlobalMechCommand" />
<li MayRequire="Ludeon.RimWorld.Biotech" Class="CompProperties_MechRepairable" />
<li MayRequire="Ludeon.RimWorld.Biotech" Class="CompProperties_OverseerSubject">
<needsOverseerEffect></needsOverseerEffect>
<delayUntilFeralCheck>-10</delayUntilFeralCheck>
<feralMtbDays>999999</feralMtbDays>
<feralCascadeRadialDistance>0</feralCascadeRadialDistance>
</li>
</comps>
</ThingDef>
<!-- 猫猫族系 -->
<ThingDef Abstract="True" Name="Mech_WULA_Cat_Base" ParentName="WULA_BaseMechanoid">
<statBases>
<MoveSpeed>5</MoveSpeed>
<WastepacksPerRecharge MayRequire="Ludeon.RimWorld.Biotech">0</WastepacksPerRecharge>
</statBases>
<race>
<lifeStageAges>
<li>
<def>MechanoidFullyFormed</def>
</li>
</lifeStageAges>
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_MachineBits</filth>
<filthCountRange>1~2</filthCountRange>
</deathAction>
</race>
<comps>
<li Class="CompProperties_CauseHediff_AoE">
<hediff>Mech_WULA_Cat_Cute</hediff>
<range>5.9</range>
<canTargetSelf>false</canTargetSelf>
<drawLines>false</drawLines>
<ignoreMechs>true</ignoreMechs>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat</defName>
<label>CAt-11"猫猫"</label>
<description>乌拉帝国的一种小型自律机械体,无需监管者,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作,因为似猫的外形受到乌拉星人欢迎。</description>
<uiIconPath>Wula/Things/WULA_Cat/WULA_Cat_Thin_south</uiIconPath>
<statBases>
<MoveSpeed>6</MoveSpeed>
<FoodPoisonChance>0.001</FoodPoisonChance>
</statBases>
<race>
<mechEnabledWorkTypes>
<li>Hauling</li>
<!-- <li>Mining</li> -->
<!-- <li>Construction</li> -->
<!-- <li>Crafting</li> -->
<!-- <li>Smithing</li> -->
<!-- <li>Tailoring</li> -->
<li>Cooking</li>
<!-- <li>Research</li> -->
<li>PlantCutting</li>
<li>Growing</li>
<li>Cleaning</li>
<li>Doctor</li>
<li>Firefighter</li>
</mechEnabledWorkTypes>
</race>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat_EMP</defName>
<label>CAt-23"闪电猫猫"</label>
<description>乌拉帝国的一种小型自律机械体无需监管者只能执行救火、搬运和清扫任务但是相比起基础型号多配备了一个EMP投掷物可以辅助乌拉帝国军团对抗机械部队。</description>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat_Fire</defName>
<label>CAt-42"烈焰猫猫"</label>
<description>乌拉帝国的一种小型自律机械体,无需监管者,只能执行救火、搬运和清扫任务,但是相比起基础型号多配备了一个燃烧瓶投掷物,可以点燃靠近阵线的敌军。</description>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat_Constructor</defName>
<label>CAt-86"猫猫劳工"</label>
<description>乌拉帝国的一种小型自律机械体无需监管者只能执行建造和开采任务可以跳起来用手上的HAm-1"装修锤"锤烂敌人的膝盖。</description>
<uiIconPath>Wula/Things/WULA_Constructor_Cat/WULA_Cat_Thin_south</uiIconPath>
<race>
<mechEnabledWorkTypes Inherit="False">
<li>Mining</li>
<li>Construction</li>
</mechEnabledWorkTypes>
</race>
<statBases>
<WorkSpeedGlobal>2</WorkSpeedGlobal>
</statBases>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat_Assault</defName>
<label>CAt-46"猫猫冲锋队"</label>
<description>乌拉帝国的一种小型自律机械体无需监管者可以执行搬运、狩猎和割除任务身着轻甲装备了一把DLa-4"云母"突击步枪附下挂刺刀,可以给敌方造成不小的麻烦。</description>
<uiIconPath>Wula/Things/WULA_Assault_Cat/WULA_Cat_Thin_south</uiIconPath>
<race>
<mechEnabledWorkTypes Inherit="False">
<li>Hunting</li>
<li>Hauling</li>
<li>PlantCutting</li>
</mechEnabledWorkTypes>
</race>
<statBases>
<ArmorRating_Sharp>0.25</ArmorRating_Sharp>
<ArmorRating_Blunt>0.25</ArmorRating_Blunt>
<!-- <WorkSpeedGlobal>2</WorkSpeedGlobal> -->
<MoveSpeed>4</MoveSpeed>
</statBases>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Base">
<defName>Mech_WULA_Cat_DM</defName>
<label>CAt-96"暗物质猫猫"</label>
<description>乌拉帝国的一种小型自律机械体,无需监管者,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作。这种型号的乌拉猫猫内置了一台不稳定暗物质引擎,这使得其无需充电,但是在死亡时会产生巨大的爆炸。</description>
<uiIconPath>Wula/Things/WULA_DM_Cat/WULA_Cat_Thin_south</uiIconPath>
<statBases>
<MoveSpeed>6</MoveSpeed>
<FoodPoisonChance>0.001</FoodPoisonChance>
<MechEnergyUsageFactor>-1</MechEnergyUsageFactor>
</statBases>
<race>
<mechEnabledWorkTypes>
<li>Hauling</li>
<li>Cooking</li>
<li>PlantCutting</li>
<li>Growing</li>
<li>Cleaning</li>
<li>Doctor</li>
<li>Firefighter</li>
</mechEnabledWorkTypes>
</race>
<comps>
<li Class="CompProperties_HunterDrone">
<explosionRadius>30</explosionRadius>
<explosionDamageType>BombSuper</explosionDamageType>
<explosionDamageAmount>550</explosionDamageAmount>
</li>
</comps>
</ThingDef>
<ThingDef Name="Wula_AI_Heavy_Panzer" ParentName="HeavyMechanoid">
<defName>Wula_AI_Heavy_Panzer</defName>
<label>SMp-38"萨克森"</label>
@@ -1288,252 +1507,6 @@
</comps>
</ThingDef>
<ThingDef ParentName="LightMechanoid">
<defName>Mech_WULA_Cat</defName>
<label>CAt-11"猫猫"</label>
<description>乌拉帝国的一种小型机械体,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作,因为似猫的外形受到乌拉星人欢迎。</description>
<uiIconPath>Wula/Things/WULA_Cat/WULA_Cat_Thin_south</uiIconPath>
<statBases>
<MoveSpeed>6</MoveSpeed>
<FoodPoisonChance>0.001</FoodPoisonChance>
<WastepacksPerRecharge MayRequire="Ludeon.RimWorld.Biotech">0</WastepacksPerRecharge>
</statBases>
<race>
<mechEnabledWorkTypes>
<li>Hauling</li>
<!-- <li>Mining</li> -->
<!-- <li>Construction</li> -->
<!-- <li>Crafting</li> -->
<!-- <li>Smithing</li> -->
<!-- <li>Tailoring</li> -->
<li>Cooking</li>
<!-- <li>Research</li> -->
<li>PlantCutting</li>
<li>Growing</li>
<li>Cleaning</li>
<li>Doctor</li>
<li>Firefighter</li>
</mechEnabledWorkTypes>
<lifeStageAges>
<li>
<def>MechanoidFullyFormed</def>
</li>
</lifeStageAges>
<!-- <thinkTreeConstant>WarUrchinConstant</thinkTreeConstant> -->
<!-- <baseHealthScale>4</baseHealthScale> -->
<!-- <canFlyInVacuum>true</canFlyInVacuum> -->
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_MachineBits</filth>
<filthCountRange>1~2</filthCountRange>
</deathAction>
</race>
<comps>
<!--加上这个组件的机械体会直接跳过原版指挥范围判定-->
<li Class="WulaFallenEmpire.CompProperties_GlobalMechCommand" />
<li Class="CompProperties_CauseHediff_AoE">
<hediff>Mech_WULA_Cat_Cute</hediff>
<range>5.9</range>
<canTargetSelf>false</canTargetSelf>
<drawLines>true</drawLines>
<ignoreMechs>true</ignoreMechs>
</li>
</comps>
<!-- <comps Inherit="False">
<li Class="CompProperties_CanBeDormant" />
<li Class="CompProperties_WakeUpDormant">
<wakeUpOnDamage>true</wakeUpOnDamage>
<wakeUpCheckRadius>30</wakeUpCheckRadius>
<wakeUpSound>MechanoidsWakeUp</wakeUpSound>
</li>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>30000</totalPowerTicks>
</li>
</comps> -->
</ThingDef>
<ThingDef Abstract="True" Name="Mech_WULA_Cat_Soldier" ParentName="LightMechanoid">
<!-- <defName>Mech_WULA_Cat_EMP</defName>
<label>乌拉猫猫掷弹兵EMP</label>
<description>乌拉帝国的一种小型机械体只能执行救火、搬运和清扫任务但是相比起基础型号多配备了一个EMP投掷物可以辅助乌拉帝国军团对抗机械部队。</description> -->
<uiIconPath>Wula/Things/WULA_Attack_Cat/WULA_Cat_Thin_south</uiIconPath>
<statBases>
<MoveSpeed>5</MoveSpeed>
<WastepacksPerRecharge MayRequire="Ludeon.RimWorld.Biotech">0</WastepacksPerRecharge>
</statBases>
<race>
<thinkTreeMain>WULA_AutonomousMech</thinkTreeMain>
<mechEnabledWorkTypes>
<li>Hauling</li>
<!-- <li>Mining</li> -->
<!-- <li>Construction</li> -->
<!-- <li>Crafting</li> -->
<!-- <li>Smithing</li> -->
<!-- <li>Tailoring</li> -->
<!-- <li>Cooking</li> -->
<!-- <li>Research</li> -->
<!-- <li>PlantCutting</li> -->
<!-- <li>Growing</li> -->
<li>Cleaning</li>
<!-- <li>Doctor</li> -->
<li>Firefighter</li>
</mechEnabledWorkTypes>
<lifeStageAges>
<li>
<def>MechanoidFullyFormed</def>
</li>
</lifeStageAges>
<!-- <thinkTreeConstant>WarUrchinConstant</thinkTreeConstant> -->
<!-- <baseHealthScale>4</baseHealthScale> -->
<!-- <canFlyInVacuum>true</canFlyInVacuum> -->
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_MachineBits</filth>
<filthCountRange>1~2</filthCountRange>
</deathAction>
</race>
<comps>
<li Class="WulaFallenEmpire.CompProperties_AutonomousMech">
<enableAutonomousDrafting>true</enableAutonomousDrafting>
<enableAutonomousWork>true</enableAutonomousWork>
<requirePowerForAutonomy>true</requirePowerForAutonomy>
</li>
<!--
全局指挥组件 (Global Mech Command Component)
此组件通过Harmony补丁 MechanitorUtility_InMechanitorCommandRange_Patch.cs 来实现功能。
当一个Pawn的ThingDef拥有此组件时补丁会拦截原版的指挥范围检查并始终返回“在范围内”。
这使得拥有此组件的机械体可以被机械师在地图的任何位置进行指挥,无视距离限制。
-->
<li Class="WulaFallenEmpire.CompProperties_GlobalMechCommand" />
<li Class="CompProperties_CauseHediff_AoE">
<hediff>Mech_WULA_Cat_Cute</hediff>
<range>5.9</range>
<canTargetSelf>false</canTargetSelf>
<drawLines>true</drawLines>
<ignoreMechs>true</ignoreMechs>
</li>
</comps>
<!-- <comps Inherit="False">
<li Class="CompProperties_CanBeDormant" />
<li Class="CompProperties_WakeUpDormant">
<wakeUpOnDamage>true</wakeUpOnDamage>
<wakeUpCheckRadius>30</wakeUpCheckRadius>
<wakeUpSound>MechanoidsWakeUp</wakeUpSound>
</li>
<li Class="CompProperties_MechPowerCell">
<totalPowerTicks>30000</totalPowerTicks>
</li>
</comps> -->
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Soldier">
<defName>Mech_WULA_Cat_EMP</defName>
<label>CAt-23"闪电猫猫"</label>
<description>乌拉帝国的一种小型机械体只能执行救火、搬运和清扫任务但是相比起基础型号多配备了一个EMP投掷物可以辅助乌拉帝国军团对抗机械部队。</description>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Soldier">
<defName>Mech_WULA_Cat_Fire</defName>
<label>CAt-42"烈焰猫猫"</label>
<description>乌拉帝国的一种小型机械体,只能执行救火、搬运和清扫任务,但是相比起基础型号多配备了一个燃烧瓶投掷物,可以点燃靠近阵线的敌军。</description>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Soldier">
<defName>Mech_WULA_Cat_Constructor</defName>
<label>CAt-86"土木猫猫"</label>
<description>乌拉帝国的一种小型机械体只能执行建造和开采任务可以跳起来用手上的HAm-1"装修锤"锤烂敌人的膝盖。</description>
<uiIconPath>Wula/Things/WULA_Constructor_Cat/WULA_Cat_Thin_south</uiIconPath>
<race>
<mechEnabledWorkTypes Inherit="False">
<li>Mining</li>
<li>Construction</li>
</mechEnabledWorkTypes>
</race>
<statBases>
<WorkSpeedGlobal>2</WorkSpeedGlobal>
</statBases>
</ThingDef>
<ThingDef ParentName="Mech_WULA_Cat_Soldier">
<defName>Mech_WULA_Cat_Assault</defName>
<label>CAt-46"突击猫猫"</label>
<description>乌拉帝国的一种小型机械体可以执行搬运、狩猎和割除任务身着轻甲装备了一把DLa-4"云母"突击步枪附下挂刺刀,可以给敌方造成不小的麻烦。</description>
<uiIconPath>Wula/Things/WULA_Assault_Cat/WULA_Cat_Thin_south</uiIconPath>
<race>
<mechEnabledWorkTypes Inherit="False">
<li>Hunting</li>
<li>Hauling</li>
<li>PlantCutting</li>
</mechEnabledWorkTypes>
</race>
<statBases>
<ArmorRating_Sharp>0.25</ArmorRating_Sharp>
<ArmorRating_Blunt>0.25</ArmorRating_Blunt>
<!-- <WorkSpeedGlobal>2</WorkSpeedGlobal> -->
<MoveSpeed>4</MoveSpeed>
</statBases>
</ThingDef>
<ThingDef ParentName="LightMechanoid">
<defName>Mech_WULA_Cat_DM</defName>
<label>CAt-96"暗物质猫猫"</label>
<description>乌拉帝国的一种小型机械体,可以执行包括搬运、烹饪、种植收割、清理、急救和灭火一类的简单工作。这种型号的乌拉猫猫内置了一台不稳定暗物质引擎,这使得其无需充电,但是在死亡时会产生巨大的爆炸。</description>
<uiIconPath>Wula/Things/WULA_DM_Cat/WULA_Cat_Thin_south</uiIconPath>
<statBases>
<MoveSpeed>6</MoveSpeed>
<FoodPoisonChance>0.001</FoodPoisonChance>
<MechEnergyUsageFactor>-1</MechEnergyUsageFactor>
<!-- <MechEnergyLossPerHP MayRequire="Ludeon.RimWorld.Biotech">0</MechEnergyLossPerHP> -->
<WastepacksPerRecharge MayRequire="Ludeon.RimWorld.Biotech">0</WastepacksPerRecharge>
</statBases>
<race>
<mechEnabledWorkTypes>
<li>Hauling</li>
<!-- <li>Mining</li> -->
<!-- <li>Construction</li> -->
<!-- <li>Crafting</li> -->
<!-- <li>Smithing</li> -->
<!-- <li>Tailoring</li> -->
<li>Cooking</li>
<!-- <li>Research</li> -->
<li>PlantCutting</li>
<li>Growing</li>
<li>Cleaning</li>
<li>Doctor</li>
<li>Firefighter</li>
</mechEnabledWorkTypes>
<lifeStageAges>
<li>
<def>MechanoidFullyFormed</def>
</li>
</lifeStageAges>
<!-- <thinkTreeConstant>WarUrchinConstant</thinkTreeConstant> -->
<!-- <baseHealthScale>4</baseHealthScale> -->
<!-- <canFlyInVacuum>true</canFlyInVacuum> -->
<deathAction Class="DeathActionProperties_Vanish">
<workerClass>DeathActionWorker_Vanish</workerClass>
<filth>Filth_MachineBits</filth>
<filthCountRange>1~2</filthCountRange>
</deathAction>
</race>
<comps>
<!--加上这个组件的机械体会直接跳过原版指挥范围判定-->
<li Class="WulaFallenEmpire.CompProperties_GlobalMechCommand" />
<li Class="CompProperties_HunterDrone">
<explosionRadius>30</explosionRadius>
<explosionDamageType>BombSuper</explosionDamageType>
<explosionDamageAmount>550</explosionDamageAmount>
</li>
<li Class="CompProperties_CauseHediff_AoE">
<hediff>Mech_WULA_Cat_Cute</hediff>
<range>5.9</range>
<canTargetSelf>false</canTargetSelf>
<drawLines>true</drawLines>
<ignoreMechs>true</ignoreMechs>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseMechanoidWalker">
<defName>WULA_Fxxk_Goose</defName>
<label>神人大鹅</label>

View File

@@ -21,9 +21,12 @@
<treeDef>Downed</treeDef>
</li>
<!-- Self-Shutdown -->
<li Class="ThinkNode_ConditionalLowEnergy" MayRequire="Ludeon.RimWorld.Biotech">
<!-- 紧急能量状态:临界能量时立即寻找充电站 -->
<li Class="WulaFallenEmpire.ThinkNode_ConditionalEmergencyRecharge">
<emergencyThreshold>0.05</emergencyThreshold>
<subNodes>
<li Class="JobGiver_GetEnergy_Charger" />
<!-- 如果没有充电站,强制休眠 -->
<li Class="JobGiver_SelfShutdown" />
</subNodes>
</li>
@@ -46,14 +49,19 @@
<!-- Do a queued job (支持右键强制高优先级工作) -->
<li Class="ThinkNode_QueuedJob" />
<!-- 征召行为:使用人类的条件节点 -->
<li Class="ThinkNode_ConditionalDrafted">
<!-- 更完整的征召战斗行为 -->
<li Class="ThinkNode_ConditionalOfPlayerFaction">
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>DraftedOrder</tagToGive>
<subNodes>
<li Class="JobGiver_MoveToStandable" />
<li Class="JobGiver_Orders" />
<!-- 4. 自主战斗工作(独立系统) -->
<li Class="WulaFallenEmpire.JobGiver_AutonomousCombat">
<priority>8</priority>
<expiryInterval>30</expiryInterval>
</li>
</subNodes>
</li>
</subNodes>
@@ -70,6 +78,14 @@
<li Class="ThinkNode_ConditionalNotFormingCaravan">
<subNodes>
<!-- 低能量充电检查(比工作优先级更高) -->
<li Class="WulaFallenEmpire.ThinkNode_ConditionalNeedRecharge">
<energyThreshold>0.3</energyThreshold>
<subNodes>
<li Class="JobGiver_GetEnergy_Charger" />
</subNodes>
</li>
<!-- Keep charging if we're already charging -->
<li Class="ThinkNode_ConditionalRecharging">
<subNodes>
@@ -82,7 +98,14 @@
<requiredMode>Work</requiredMode>
<subNodes>
<li Class="JobGiver_SeekAllowedArea" />
<!-- 工作前的能量检查 -->
<li Class="WulaFallenEmpire.ThinkNode_ConditionalNeedRecharge">
<energyThreshold>0.2</energyThreshold>
<subNodes>
<li Class="JobGiver_GetEnergy_Charger" />
</subNodes>
</li>
<!-- 紧急工作 -->
<li Class="JobGiver_Work">
@@ -119,9 +142,26 @@
<requiredMode>Recharge</requiredMode>
<subNodes>
<li Class="JobGiver_SeekAllowedArea" />
<!-- 检查是否充满电 -->
<li Class="WulaFallenEmpire.ThinkNode_ConditionalFullyCharged">
<fullChargeThreshold>0.9</fullChargeThreshold>
<subNodes>
<!-- 充满电后自动切换到工作模式 -->
<li Class="JobGiver_WanderColony">
<maxDanger>None</maxDanger>
<reportStringOverride>充电完成</reportStringOverride>
</li>
</subNodes>
</li>
<!-- 去充电 -->
<li Class="JobGiver_GetEnergy_Charger" />
<li Class="JobGiver_GetEnergy_SelfShutdown">
<forced>true</forced>
<!-- 如果没有充电站可用,等待 -->
<li Class="JobGiver_WanderColony">
<maxDanger>None</maxDanger>
<reportStringOverride>等待空闲充电站</reportStringOverride>
</li>
</subNodes>
</li>
@@ -166,4 +206,36 @@
</subNodes>
</thinkRoot>
</ThinkTreeDef>
<!-- 自主机械族专用工作类型 -->
<WorkTypeDef>
<defName>WULA_AutonomousCombat</defName>
<label>自主战斗</label>
<gerundLabel>战斗中</gerundLabel>
<verb>战斗</verb>
<visible>false</visible> <!-- 不在工作面板显示 -->
<naturalPriority>99</naturalPriority>
<workTags>Violent</workTags>
<alwaysStartActive>true</alwaysStartActive>
</WorkTypeDef>
<!-- 自主机械族征召工作 -->
<JobDef>
<defName>WULA_AutonomousWaitCombat</defName>
<driverClass>WulaFallenEmpire.JobDriver_AutonomousWaitCombat</driverClass>
<reportString>standing guard.</reportString>
<playerInterruptible>true</playerInterruptible>
<checkOverrideOnDamage>true</checkOverrideOnDamage>
<canBeForcedByDuty>false</canBeForcedByDuty>
<alwaysShowWeapon>true</alwaysShowWeapon>
<suspendsUntilCombatEnd>false</suspendsUntilCombatEnd>
<ignoreJoyTimeAssignment>true</ignoreJoyTimeAssignment>
<makeTargetPause>false</makeTargetPause>
<modExtensions>
<li Class="WulaFallenEmpire.JobExtension_AutonomousCombat">
<canUseRangedWeapon>true</canUseRangedWeapon>
<autoAttackEnabled>true</autoAttackEnabled>
<attackSearchRadius>35</attackSearchRadius>
</li>
</modExtensions>
</JobDef>
</Defs>

View File

@@ -7,4 +7,36 @@
<WULA_AutoSpawn_Desc>切换是否自动生产单位。开启后,当资源和冷却允许时,会自动生产单位以维持队列上限。</WULA_AutoSpawn_Desc>
<WULA_AutoSpawn_On_Reason>自动生产已开启。再次点击以关闭。</WULA_AutoSpawn_On_Reason>
<!-- 工作模式相关 -->
<WULA_Mech_WorkMode>行为模式:{0}</WULA_Mech_WorkMode>
<WULA_Switch_Mech_WorkMode>修改自律机械的行为模式</WULA_Switch_Mech_WorkMode>
<WULA_WorkMode_Work>工作</WULA_WorkMode_Work>
<WULA_WorkMode_Recharge>充电</WULA_WorkMode_Recharge>
<WULA_WorkMode_Shutdown>关机</WULA_WorkMode_Shutdown>
<WULA_WorkMode_Unknown>未知</WULA_WorkMode_Unknown>
<WULA_WorkMode_Work_Desc>工作模式 - 根据机体设定,自行进行工作</WULA_WorkMode_Work_Desc>
<WULA_WorkMode_Recharge_Desc>充电模式 - 充电后休眠</WULA_WorkMode_Recharge_Desc>
<WULA_WorkMode_Shutdown_Desc>关机模式 - 立即关机,会在此状态下以非常缓慢的速率充电</WULA_WorkMode_Shutdown_Desc>
<!-- 状态显示 -->
<WULA_Autonomous_Drafted>自主操作中</WULA_Autonomous_Drafted>
<WULA_Autonomous_Mode>自主模式:{0}</WULA_Autonomous_Mode>
<!-- 能量信息 -->
<WULA_EnergyInfo>{0}</WULA_EnergyInfo>
<WULA_EnergyInfoShort>{0}</WULA_EnergyInfoShort>
<WULA_CurrentEnergy>当前能量:{0}</WULA_CurrentEnergy>
<WULA_EnergyLow>(低电量)</WULA_EnergyLow>
<WULA_EnergyCritical>(电量危急!)</WULA_EnergyCritical>
<!-- 消息提示 -->
<WULA_LowEnergySwitchToRecharge>{0}电量不足,切换到充电模式</WULA_LowEnergySwitchToRecharge>
<WULA_FullyChargedSwitchToWork>{0}已充满电,返回工作模式</WULA_FullyChargedSwitchToWork>
<WULA_CriticalEnergyLevels>{0}电量危急!</WULA_CriticalEnergyLevels>
<WULA_SwitchedToMode>{0}切换到{1}模式</WULA_SwitchedToMode>
<WULA_Autonomous_Mode>征召自律机械</WULA_Autonomous_Mode>
<WULA_Autonomous_Mode_Desc>使自律机械进入征召状态</WULA_Autonomous_Mode_Desc>
</LanguageData>

View File

@@ -38,6 +38,7 @@ namespace WulaFallenEmpire
Shutdown // 关机模式:立即休眠
}
public class CompProperties_AutonomousMech : CompProperties
{
public bool enableAutonomousDrafting = true;
@@ -45,6 +46,11 @@ namespace WulaFallenEmpire
public bool requirePowerForAutonomy = true;
public bool suppressUncontrolledWarning = true;
// 新增:能量管理设置
public float lowEnergyThreshold = 0.3f; // 低能量阈值
public float criticalEnergyThreshold = 0.1f; // 临界能量阈值
public float rechargeCompleteThreshold = 0.9f; // 充电完成阈值
public CompProperties_AutonomousMech()
{
compClass = typeof(CompAutonomousMech);
@@ -57,8 +63,8 @@ namespace WulaFallenEmpire
public Pawn MechPawn => parent as Pawn;
// 新增:当前工作模式
private AutonomousWorkMode currentWorkMode = AutonomousWorkMode.Work;
private bool wasLowEnergy = false; // 记录上次是否处于低能量状态
public bool CanBeAutonomous
{
@@ -75,8 +81,8 @@ namespace WulaFallenEmpire
if (Props.requirePowerForAutonomy)
{
var energyNeed = MechPawn.needs?.TryGetNeed<Need_MechEnergy>();
if (energyNeed != null && energyNeed.CurLevelPercentage < 0.1f)
// 在临界能量下不允许自主模式
if (GetEnergyLevel() < Props.criticalEnergyThreshold)
return false;
}
@@ -112,88 +118,197 @@ namespace WulaFallenEmpire
}
}
// 新增:公开访问当前工作模式
public AutonomousWorkMode CurrentWorkMode => currentWorkMode;
// 新增:能量状态检查方法
public float GetEnergyLevel()
{
var energyNeed = MechPawn.needs?.TryGetNeed<Need_MechEnergy>();
return energyNeed?.CurLevelPercentage ?? 0f;
}
public bool IsLowEnergy => GetEnergyLevel() < Props.lowEnergyThreshold;
public bool IsCriticalEnergy => GetEnergyLevel() < Props.criticalEnergyThreshold;
public bool IsFullyCharged => GetEnergyLevel() >= Props.rechargeCompleteThreshold;
// ... 现有代码 ...
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
if (MechPawn != null && MechPawn.IsColonyMech)
// 确保使用独立战斗系统
InitializeAutonomousCombat();
}
private void InitializeAutonomousCombat()
{
// 确保有 draftController
if (MechPawn.drafter == null)
{
MechPawn.drafter = new Pawn_DraftController(MechPawn);
}
// 强制启用 FireAtWill
if (MechPawn.drafter != null)
{
MechPawn.drafter.FireAtWill = true;
}
// 确保工作设置不会干扰战斗
EnsureCombatWorkSettings();
}
private void EnsureCombatWorkSettings()
{
if (MechPawn.workSettings == null)
return;
// 设置自主战斗工作类型(如果存在)
WorkTypeDef autonomousCombat = DefDatabase<WorkTypeDef>.GetNamedSilentFail("WULA_AutonomousCombat");
if (autonomousCombat != null)
{
MechPawn.workSettings.SetPriority(autonomousCombat, 1);
}
}
public override void CompTick()
{
base.CompTick();
// 定期检查战斗状态
if (Find.TickManager.TicksGame % 60 == 0)
{
CheckCombatStatus();
}
}
private void CheckCombatStatus()
{
if (MechPawn.drafter?.Drafted == true && MechPawn.CurJob == null)
{
// 如果被征召但没有工作,强制进入自主战斗状态
ForceAutonomousCombat();
}
}
private void ForceAutonomousCombat()
{
JobDef autonomousCombatJob = DefDatabase<JobDef>.GetNamedSilentFail("WULA_AutonomousWaitCombat");
if (autonomousCombatJob != null)
{
Job job = JobMaker.MakeJob(autonomousCombatJob);
MechPawn.jobs.StartJob(job, JobCondition.InterruptForced);
}
}
public override void CompTick()
{
base.CompTick();
// 每60 tick检查一次能量状态
if (MechPawn != null && MechPawn.IsColonyMech && Find.TickManager.TicksGame % 60 == 0)
{
CheckEnergyStatus();
EnsureWorkSettings();
}
}
// 新增:能量状态检查
private void CheckEnergyStatus()
{
if (!CanWorkAutonomously)
return;
bool isLowEnergyNow = IsLowEnergy;
// 如果能量状态发生变化
if (isLowEnergyNow != wasLowEnergy)
{
if (isLowEnergyNow)
{
// 进入低能量状态
if (currentWorkMode == AutonomousWorkMode.Work)
{
// 自动切换到充电模式
SetWorkMode(AutonomousWorkMode.Recharge);
Messages.Message("WULA_LowEnergySwitchToRecharge".Translate(MechPawn.LabelCap),
MechPawn, MessageTypeDefOf.CautionInput);
}
}
else
{
// 恢复能量状态
if (currentWorkMode == AutonomousWorkMode.Recharge && IsFullyCharged)
{
// 充满电后自动切换回工作模式
SetWorkMode(AutonomousWorkMode.Work);
Messages.Message("WULA_FullyChargedSwitchToWork".Translate(MechPawn.LabelCap),
MechPawn, MessageTypeDefOf.PositiveEvent);
}
}
wasLowEnergy = isLowEnergyNow;
}
// 临界能量警告
if (IsCriticalEnergy && currentWorkMode != AutonomousWorkMode.Recharge && currentWorkMode != AutonomousWorkMode.Shutdown)
{
Messages.Message("WULA_CriticalEnergyLevels".Translate(MechPawn.LabelCap),
MechPawn, MessageTypeDefOf.ThreatBig);
// 强制切换到充电模式
SetWorkMode(AutonomousWorkMode.Recharge);
}
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
{
if (MechPawn == null || !CanBeAutonomous)
yield break;
// 自主征召按钮
yield return new Command_Toggle
{
defaultLabel = "Autonomous Mode",
defaultDesc = "Enable autonomous operation without mechanitor control",
icon = TexCommand.Draft,
isActive = () => MechPawn.Drafted,
toggleAction = () => ToggleAutonomousDraft(),
hotKey = KeyBindingDefOf.Misc1
};
// 工作模式切换按钮
if (CanWorkAutonomously)
{
string energyInfo = "WULA_EnergyInfo".Translate(GetEnergyLevel().ToStringPercent());
yield return new Command_Action
{
defaultLabel = "Work Mode: " + GetCurrentWorkModeDisplay(),
defaultDesc = "Switch autonomous work mode",
icon = TexCommand.Attack,
defaultLabel = "WULA_Mech_WorkMode".Translate(GetCurrentWorkModeDisplay()) + energyInfo,
defaultDesc = GetWorkModeDescription(),
icon = GetWorkModeIcon(),
action = () => ShowWorkModeMenu()
};
}
}
private void ToggleAutonomousDraft()
// 修改:返回包含能量信息的描述
private string GetWorkModeDescription()
{
if (MechPawn.drafter == null)
return;
string baseDesc = "WULA_Switch_Mech_WorkMode".Translate();
string energyInfo = "WULA_CurrentEnergy".Translate(GetEnergyLevel().ToStringPercent());
if (MechPawn.Drafted)
{
MechPawn.drafter.Drafted = false;
Messages.Message($"{MechPawn.LabelCap} autonomous mode deactivated",
MechPawn, MessageTypeDefOf.NeutralEvent);
}
else
{
if (CanBeAutonomous)
{
MechPawn.drafter.Drafted = true;
Messages.Message($"{MechPawn.LabelCap} is now operating autonomously",
MechPawn, MessageTypeDefOf.PositiveEvent);
}
else
{
Messages.Message($"Cannot activate autonomous mode: {GetBlockReason()}",
MechPawn, MessageTypeDefOf.NegativeEvent);
}
}
if (IsLowEnergy)
energyInfo += "WULA_EnergyLow".Translate();
if (IsCriticalEnergy)
energyInfo += "WULA_EnergyCritical".Translate();
return baseDesc + "\n" + energyInfo;
}
// 新增:根据能量状态返回不同的图标
private UnityEngine.Texture2D GetWorkModeIcon()
{
if (IsCriticalEnergy)
return TexCommand.DesirePower;
else if (IsLowEnergy)
return TexCommand.ToggleVent;
else
return TexCommand.Attack;
}
// 修改:返回自定义工作模式的显示名称
private string GetCurrentWorkModeDisplay()
{
switch (currentWorkMode)
{
case AutonomousWorkMode.Work:
return "Work";
return "WULA_WorkMode_Work".Translate();
case AutonomousWorkMode.Recharge:
return "Recharge";
return "WULA_WorkMode_Recharge".Translate();
case AutonomousWorkMode.Shutdown:
return "Shutdown";
return "WULA_WorkMode_Shutdown".Translate();
default:
return "Unknown";
return "WULA_WorkMode_Unknown".Translate();
}
}
@@ -202,21 +317,20 @@ namespace WulaFallenEmpire
List<FloatMenuOption> list = new List<FloatMenuOption>();
// 工作模式
list.Add(new FloatMenuOption("Work Mode - Perform assigned work tasks",
list.Add(new FloatMenuOption("WULA_WorkMode_Work_Desc".Translate(),
() => SetWorkMode(AutonomousWorkMode.Work)));
// 充电模式
list.Add(new FloatMenuOption("Recharge Mode - Charge and then shutdown",
list.Add(new FloatMenuOption("WULA_WorkMode_Recharge_Desc".Translate(),
() => SetWorkMode(AutonomousWorkMode.Recharge)));
// 休眠模式
list.Add(new FloatMenuOption("Shutdown Mode - Immediately shutdown",
list.Add(new FloatMenuOption("WULA_WorkMode_Shutdown_Desc".Translate(),
() => SetWorkMode(AutonomousWorkMode.Shutdown)));
Find.WindowStack.Add(new FloatMenu(list));
}
// 修改:设置自定义工作模式
private void SetWorkMode(AutonomousWorkMode mode)
{
currentWorkMode = mode;
@@ -228,28 +342,8 @@ namespace WulaFallenEmpire
}
string modeName = GetCurrentWorkModeDisplay();
Messages.Message($"{MechPawn.LabelCap} switched to {modeName} mode",
Messages.Message("WULA_SwitchedToMode".Translate(MechPawn.LabelCap, modeName),
MechPawn, MessageTypeDefOf.NeutralEvent);
Log.Message($"AutonomousMech: {MechPawn.LabelCap} work mode set to {modeName}");
}
private string GetBlockReason()
{
if (MechPawn.Dead || MechPawn.Downed)
return "Mech is incapacitated";
if (MechPawn.GetOverseer() != null)
return "Mech is under mechanitor control";
if (Props.requirePowerForAutonomy)
{
var energyNeed = MechPawn.needs?.TryGetNeed<Need_MechEnergy>();
if (energyNeed != null && energyNeed.CurLevelPercentage < 0.1f)
return "Insufficient energy";
}
return "Autonomous mode disabled";
}
private void EnsureWorkSettings()
@@ -265,17 +359,19 @@ namespace WulaFallenEmpire
if (!CanBeAutonomous)
return null;
string energyInfo = "WULA_EnergyInfoShort".Translate(GetEnergyLevel().ToStringPercent());
if (MechPawn.Drafted)
return "Operating autonomously";
return "WULA_Autonomous_Drafted".Translate() + energyInfo;
else
return $"Autonomous mode: {GetCurrentWorkModeDisplay()}";
return "WULA_Autonomous_Mode".Translate(GetCurrentWorkModeDisplay()) + energyInfo;
}
// 新增:保存和加载工作模式
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref currentWorkMode, "currentWorkMode", AutonomousWorkMode.Work);
Scribe_Values.Look(ref wasLowEnergy, "wasLowEnergy", false);
}
}
}

View File

@@ -0,0 +1,234 @@
// JobDriver_AutonomousWaitCombat.cs
using System;
using System.Collections.Generic;
using RimWorld;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
public class JobDriver_AutonomousWaitCombat : JobDriver
{
private const int TargetSearchInterval = 4;
private bool collideWithPawns;
private JobExtension_AutonomousCombat CombatExtension =>
job.def.GetModExtension<JobExtension_AutonomousCombat>();
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return true;
}
protected override IEnumerable<Toil> MakeNewToils()
{
Toil waitToil = new Toil();
waitToil.initAction = delegate
{
if (pawn.Spawned)
{
pawn.Map.pawnDestinationReservationManager.Reserve(pawn, job, pawn.Position);
pawn.pather?.StopDead();
}
// 初始化战斗设置
InitializeCombatSettings();
// 立即检查攻击目标
CheckForAutoAttack();
};
waitToil.tickAction = delegate
{
// 定期检查攻击目标
if (Find.TickManager.TicksGame % TargetSearchInterval == 0)
{
CheckForAutoAttack();
}
// 处理朝向
HandleFacing();
};
waitToil.defaultCompleteMode = ToilCompleteMode.Never;
yield return waitToil;
}
private void InitializeCombatSettings()
{
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp?.CanWorkAutonomously == true)
{
// 确保征召设置正确
if (pawn.drafter != null)
{
pawn.drafter.FireAtWill = CombatExtension?.forceFireAtWill ?? true;
}
}
}
private void HandleFacing()
{
// 如果有指定朝向,就面向该方向
if (job.overrideFacing != Rot4.Invalid)
{
pawn.rotationTracker.FaceTarget(pawn.Position + job.overrideFacing.FacingCell);
return;
}
// 如果有职责焦点,就面向焦点
if (pawn.mindState?.duty?.focus != null)
{
pawn.rotationTracker.FaceTarget(pawn.mindState.duty.focus);
return;
}
// 自动寻找敌人并面向它
Thing enemyTarget = FindNearestEnemy();
if (enemyTarget != null)
{
pawn.rotationTracker.FaceTarget(enemyTarget);
}
}
private void CheckForAutoAttack()
{
if (!CanAutoAttack())
return;
// 先检查近战攻击
if (CheckMeleeAttack())
return;
// 再检查远程攻击
CheckRangedAttack();
}
private bool CanAutoAttack()
{
// 基础状态检查
if (pawn.Downed || pawn.stances.FullBodyBusy || pawn.IsCarryingPawn())
return false;
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp?.CanWorkAutonomously != true)
return false;
// 检查扩展设置
if (CombatExtension?.autoAttackEnabled != true)
return false;
// 忽略工作标签检查,因为这是独立系统
if (!CombatExtension.ignoreWorkTags)
{
if (pawn.WorkTagIsDisabled(WorkTags.Violent))
return false;
}
return true;
}
private bool CheckMeleeAttack()
{
if (!pawn.kindDef.canMeleeAttack)
return false;
// 检查相邻格子的敌人
for (int i = 0; i < 9; i++)
{
IntVec3 cell = pawn.Position + GenAdj.AdjacentCellsAndInside[i];
if (!cell.InBounds(pawn.Map))
continue;
foreach (Thing thing in cell.GetThingList(pawn.Map))
{
if (thing is Pawn targetPawn && IsValidMeleeTarget(targetPawn))
{
pawn.meleeVerbs.TryMeleeAttack(targetPawn);
collideWithPawns = true;
return true;
}
}
}
return false;
}
private bool IsValidMeleeTarget(Pawn target)
{
return !target.ThreatDisabled(pawn) &&
pawn.HostileTo(target) &&
GenHostility.IsActiveThreatTo(target, pawn.Faction) &&
!pawn.ThreatDisabledBecauseNonAggressiveRoamer(target);
}
private void CheckRangedAttack()
{
if (!CanUseRangedWeapon())
return;
Verb verb = pawn.CurrentEffectiveVerb;
if (verb == null || verb.verbProps.IsMeleeAttack)
return;
Thing shootTarget = FindRangedTarget();
if (shootTarget != null)
{
pawn.TryStartAttack(shootTarget);
collideWithPawns = true;
}
}
private bool CanUseRangedWeapon()
{
if (!CombatExtension?.canUseRangedWeapon ?? false)
return false;
// 检查武器
if (pawn.equipment?.Primary == null || !pawn.equipment.Primary.def.IsRangedWeapon)
return false;
// 检查 FireAtWill 设置
if (pawn.drafter != null && !pawn.drafter.FireAtWill)
return false;
return true;
}
private Thing FindRangedTarget()
{
int searchRadius = CombatExtension?.attackSearchRadius ?? 25;
TargetScanFlags flags = TargetScanFlags.NeedLOSToAll |
TargetScanFlags.NeedThreat |
TargetScanFlags.NeedAutoTargetable;
if (pawn.CurrentEffectiveVerb?.IsIncendiary_Ranged() == true)
{
flags |= TargetScanFlags.NeedNonBurning;
}
return (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(
pawn, flags, null, 0f, searchRadius);
}
private Thing FindNearestEnemy()
{
int searchRadius = CombatExtension?.attackSearchRadius ?? 25;
return (Thing)AttackTargetFinder.BestAttackTarget(
pawn,
TargetScanFlags.NeedThreat,
x => x is Pawn p && pawn.HostileTo(p),
0f, searchRadius,
default,
float.MaxValue,
canTakeTargets: true);
}
public override string GetReport()
{
return "WULA_StandingGuard".Translate(); // 自定义报告文本
}
}
}

View File

@@ -0,0 +1,14 @@
// JobExtension_AutonomousCombat.cs
using Verse;
namespace WulaFallenEmpire
{
public class JobExtension_AutonomousCombat : DefModExtension
{
public bool canUseRangedWeapon = true;
public bool autoAttackEnabled = true;
public int attackSearchRadius = 25;
public bool ignoreWorkTags = true;
public bool forceFireAtWill = true;
}
}

View File

@@ -0,0 +1,42 @@
// JobGiver_AutonomousCombat.cs
using RimWorld;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
public class JobGiver_AutonomousCombat : ThinkNode_JobGiver
{
public float priority = 8f;
public int expiryInterval = 30;
public override float GetPriority(Pawn pawn)
{
// 只有在征召状态下才有优先级
if (pawn.drafter?.Drafted == true &&
pawn.GetComp<CompAutonomousMech>()?.CanWorkAutonomously == true)
{
return priority;
}
return 0f;
}
protected override Job TryGiveJob(Pawn pawn)
{
// 确保是自主机械族且被征召
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp?.CanWorkAutonomously != true || pawn.drafter?.Drafted != true)
return null;
// 创建自主战斗工作
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_AutonomousWaitCombat"));
job.expiryInterval = expiryInterval;
job.checkOverrideOnDamage = true;
// 设置工作标签,确保不会被其他工作干扰
pawn.mindState?.prioritizedWork?.Clear();
return job;
}
}
}

View File

@@ -0,0 +1,37 @@
// JobGiver_AutonomousWaitCombat.cs
using RimWorld;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
public class JobGiver_AutonomousWaitCombat : ThinkNode_JobGiver
{
public bool canUseRangedWeapon = true;
public override float GetPriority(Pawn pawn)
{
// 只有在征召状态下才有高优先级
if (pawn.drafter?.Drafted == true)
{
return 9.5f; // 比常规工作低,但比空闲高
}
return 0f;
}
protected override Job TryGiveJob(Pawn pawn)
{
// 只有在征召状态下才使用 Wait_Combat
if (pawn.drafter?.Drafted == true &&
pawn.GetComp<CompAutonomousMech>()?.CanWorkAutonomously == true)
{
Job job = JobMaker.MakeJob(JobDefOf.Wait_Combat);
job.canUseRangedWeapon = canUseRangedWeapon;
job.expiryInterval = 30; // 短时间,便于重新评估
return job;
}
return null;
}
}
}

View File

@@ -0,0 +1,60 @@
using RimWorld;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
// 检查机械族是否需要充电
public class ThinkNode_ConditionalNeedRecharge : ThinkNode_Conditional
{
public float energyThreshold = 0.3f;
protected override bool Satisfied(Pawn pawn)
{
if (pawn == null || pawn.Dead || pawn.Downed)
return false;
var energyNeed = pawn.needs?.TryGetNeed<Need_MechEnergy>();
if (energyNeed == null)
return false;
return energyNeed.CurLevelPercentage < energyThreshold;
}
}
// 检查机械族是否紧急需要充电
public class ThinkNode_ConditionalEmergencyRecharge : ThinkNode_Conditional
{
public float emergencyThreshold = 0.1f;
protected override bool Satisfied(Pawn pawn)
{
if (pawn == null || pawn.Dead || pawn.Downed)
return false;
var energyNeed = pawn.needs?.TryGetNeed<Need_MechEnergy>();
if (energyNeed == null)
return false;
return energyNeed.CurLevelPercentage < emergencyThreshold;
}
}
// 检查机械族是否充满电
public class ThinkNode_ConditionalFullyCharged : ThinkNode_Conditional
{
public float fullChargeThreshold = 0.9f;
protected override bool Satisfied(Pawn pawn)
{
if (pawn == null || pawn.Dead || pawn.Downed)
return false;
var energyNeed = pawn.needs?.TryGetNeed<Need_MechEnergy>();
if (energyNeed == null)
return false;
return energyNeed.CurLevelPercentage >= fullChargeThreshold;
}
}
}

View File

@@ -105,9 +105,11 @@
<Compile Include="Pawn\WULA_AutoMechCarrier\CompProperties_AutoMechCarrier.cs" />
<Compile Include="Pawn\WULA_AutoMechCarrier\PawnProductionEntry.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\CompAutonomousMech.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\JobGiver_AutonomousWaitCombat.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\Patch_MechanitorUtility_CanDraftMech.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\Patch_UncontrolledMechDrawPulse.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalAutonomousWorkMode.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalNeedRecharge.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalBreakWorker_BrokenPersonality.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalStateDefExtension_BrokenPersonality.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalState_BrokenPersonality.cs" />