This commit is contained in:
2025-09-24 12:08:27 +08:00
parent ae4a2e0f99
commit a76355fd83
10 changed files with 505 additions and 133 deletions

Binary file not shown.

View File

@@ -1,83 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName="BuildingBase">
<defName>ARANutrientDispenser</defName>
<label>阿拉克涅蜜晶巢穴</label>
<description>一个生产阿拉克涅蜜晶糕的虫虫巢穴。通过分解虫蜜来生产可食用的蜜晶糕。</description>
<thingClass>ArachnaeSwarm.Building_ARANutrientDispenser</thingClass>
<graphicData>
<texPath>Things/Building/Production/NutrientDispenser</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<color>(232,255,191)</color>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4)</drawSize>
<damageData>
<rect>(0.02,0.25,2.96,2.85)</rect>
<cornerTL>Damage/Corner</cornerTL>
<cornerTR>Damage/Corner</cornerTR>
</damageData>
<shadowData>
<volume>(2.87,0.75,3.05)</volume>
<offset>(0,0,0.38)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<pathCost>150</pathCost>
<fillPercent>1.0</fillPercent>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2000</WorkToBuild>
<Flammability>0.5</Flammability>
</statBases>
<size>(3,4)</size>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<tickerType>Normal</tickerType>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
<!-- This component acts as a perpetual power source with no consumption, ensuring powerComp.PowerOn is always true -->
<li Class="CompProperties_Power">
<compClass>CompPowerPlant</compClass>
<basePowerConsumption>-1</basePowerConsumption> <!-- Negative value makes it a generator -->
<transmitsPower>false</transmitsPower> <!-- This is CRITICAL. It prevents the building from powering the whole grid. -->
</li>
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.ARAFoodDispenserProperties">
<thingToDispense>ARA_NutrientPasteMeal</thingToDispense>
<nutritionCostPerDispense>1.25</nutritionCostPerDispense>
<soundDispense>DispensePaste</soundDispense>
</li>
</modExtensions>
<building>
<isMealSource>true</isMealSource>
</building>
<interactionCellOffset>(0,0,3)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<researchPrerequisites>
<li>NutrientPaste</li>
</researchPrerequisites>
</ThingDef>
</Defs>

View File

@@ -47,6 +47,8 @@
<li>ARA_MorphableResearchBench</li>
<li>ARANutrientDispenser</li>
<li>ARA_WormholePortal_A</li>
<li>ARA_Acidling_AutoMortar</li>
<li>CatastropheMissileSilo</li>
</linkableBuildings>
<maxDistance>80</maxDistance> <!-- 供能范围 -->
<maxSimultaneous>10</maxSimultaneous>
@@ -63,6 +65,8 @@
<li>ARA_MorphableResearchBench</li>
<li>ARANutrientDispenser</li>
<li>ARA_WormholePortal_A</li>
<li>ARA_Acidling_AutoMortar</li>
<li>CatastropheMissileSilo</li>
</linkableBuildings>
<maxDistance>80</maxDistance>
<lineTexturePath>ArachnaeSwarm/Building/Nutrition_Pie</lineTexturePath>
@@ -392,7 +396,7 @@
<li>Corpses</li>
</categories>
</fuelFilter>
<fuelCapacity>50</fuelCapacity>
<fuelCapacity>25</fuelCapacity>
<fuelConsumptionRate>25</fuelConsumptionRate>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
@@ -463,7 +467,7 @@
<comps>
<!-- 1. 作为消费者,自己也需要燃料 -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10.0</fuelCapacity>
<fuelCapacity>5.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
@@ -482,7 +486,7 @@
<li>ARA_BioforgeIncubator_Thing</li>
</linkableBuildings>
<maxSimultaneous>10</maxSimultaneous>
<maxDistance>20</maxDistance>
<maxDistance>20</maxDistance>
<statOffsets>
<NutrientTransmissionEfficiency>0.05</NutrientTransmissionEfficiency>
<ARA_IncubationSpeedFactor>0.1</ARA_IncubationSpeedFactor>
@@ -506,4 +510,83 @@
</modExtensions>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>ARANutrientDispenser</defName>
<label>阿拉克涅蜜晶巢穴</label>
<description>一个生产阿拉克涅蜜晶糕的虫虫巢穴。通过分解虫蜜来生产可食用的蜜晶糕。</description>
<thingClass>ArachnaeSwarm.Building_ARANutrientDispenser</thingClass>
<graphicData>
<texPath>Things/Building/Production/NutrientDispenser</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<color>(232,255,191)</color>
<shaderType>CutoutComplex</shaderType>
<drawSize>(3,4)</drawSize>
<damageData>
<rect>(0.02,0.25,2.96,2.85)</rect>
<cornerTL>Damage/Corner</cornerTL>
<cornerTR>Damage/Corner</cornerTR>
</damageData>
<shadowData>
<volume>(2.87,0.75,3.05)</volume>
<offset>(0,0,0.38)</offset>
</shadowData>
</graphicData>
<altitudeLayer>Building</altitudeLayer>
<passability>Impassable</passability>
<pathCost>150</pathCost>
<fillPercent>1.0</fillPercent>
<statBases>
<MaxHitPoints>250</MaxHitPoints>
<WorkToBuild>2000</WorkToBuild>
<Flammability>0.5</Flammability>
</statBases>
<size>(3,4)</size>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<tickerType>Normal</tickerType>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<comps>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>10.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
<!-- This component acts as a perpetual power source with no consumption, ensuring powerComp.PowerOn is always true -->
<li Class="CompProperties_Power">
<compClass>CompPowerPlant</compClass>
<basePowerConsumption>-1</basePowerConsumption> <!-- Negative value makes it a generator -->
<transmitsPower>false</transmitsPower> <!-- This is CRITICAL. It prevents the building from powering the whole grid. -->
</li>
</comps>
<modExtensions>
<li Class="ArachnaeSwarm.ARAFoodDispenserProperties">
<thingToDispense>ARA_NutrientPasteMeal</thingToDispense>
<nutritionCostPerDispense>1.25</nutritionCostPerDispense>
<soundDispense>DispensePaste</soundDispense>
</li>
</modExtensions>
<building>
<isMealSource>true</isMealSource>
</building>
<interactionCellOffset>(0,0,3)</interactionCellOffset>
<hasInteractionCell>true</hasInteractionCell>
<designationCategory>ARA_Buildings</designationCategory>
<researchPrerequisites>
<li>NutrientPaste</li>
</researchPrerequisites>
</ThingDef>
</Defs>

View File

@@ -1,6 +1,158 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<Defs>
<ThingDef ParentName="BuildingBase">
<!-- Auto mortar -->
<ThingDef ParentName="BuildingBase">
<defName>ARA_Acidling_AutoMortar</defName>
<label>酸爆种投射巢</label>
<description>一个投射酸爆种的巢穴.</description>
<thingClass>Building_TurretGun</thingClass>
<drawerType>MapMeshAndRealTime</drawerType>
<drawHighlight>true</drawHighlight>
<drawHighlightOnlyForHostile>true</drawHighlightOnlyForHostile>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_CatastropheMissileSilo_Base</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(3,3)</drawSize>
<drawOffset>(0,0,-0.1)</drawOffset>
<shadowData>
<offset>(-0.13,-0.87,-0.1)</offset>
<volume>(0.5,0.4,1.05)</volume>
</shadowData>
</graphicData>
<receivesSignals>true</receivesSignals>
<altitudeLayer>Building</altitudeLayer>
<stealable>false</stealable>
<size>(3,3)</size>
<passability>PassThroughOnly</passability>
<pathCost>50</pathCost>
<fillPercent>0.4</fillPercent>
<tickerType>Normal</tickerType>
<terrainAffordanceNeeded>Heavy</terrainAffordanceNeeded>
<comps>
<li Class="CompProperties_Forbiddable"/>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>5.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="CompProperties_Refuelable">
<fuelLabel>弹药</fuelLabel>
<fuelGizmoLabel>弹药</fuelGizmoLabel>
<outOfFuelMessage>缺少弹药</outOfFuelMessage>
<fuelFilter>
</fuelFilter>
<fuelCapacity>30</fuelCapacity>
<initialFuelPercent>0</initialFuelPercent>
<autoRefuelPercent>1</autoRefuelPercent>
<showFuelGizmo>true</showFuelGizmo>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="ArachnaeSwarm.CompProperties_NutritionToFuelConverter">
<checkInterval>300</checkInterval>
<nutritionCost>0.5</nutritionCost>
<workAmount>600</workAmount>
<fuelAmount>1</fuelAmount>
</li>
<li Class="ArachnaeSwarm.CompProperties_ForceTargetable" />
<li Class="ArachnaeSwarm.CompProperties_DelayedTerrainSpawn">
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>6</spawnRadius>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
</comps>
<statBases>
<MaxHitPoints>260</MaxHitPoints>
<Flammability>0</Flammability>
<Mass>30</Mass>
<ShootingAccuracyTurret>0.9</ShootingAccuracyTurret>
<Beauty>-20</Beauty>
</statBases>
<damageMultipliers>
<li>
<damageDef>Flame</damageDef>
<multiplier>0</multiplier>
</li>
</damageMultipliers>
<generateCommonality>4</generateCommonality> <!-- generate more often than other problem causers for mech clusters -->
<building>
<buildingTags>
<li>Artillery</li>
</buildingTags>
<turretGunDef>ARA_Acidling_Artillery_AutoMortar</turretGunDef>
<turretBurstWarmupTime>10.0</turretBurstWarmupTime>
<turretTopDrawSize>3.0</turretTopDrawSize>
</building>
<designationCategory>ARA_Buildings</designationCategory>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<constructionSkillPrerequisite>8</constructionSkillPrerequisite>
</ThingDef>
<ThingDef ParentName="BaseArtilleryWeapon">
<defName>ARA_Acidling_Artillery_AutoMortar</defName>
<label>酸爆种投射巢</label>
<graphicData>
<texPath>ArachnaeSwarm/Building/ARA_Turret</texPath>
<graphicClass>Graphic_Single</graphicClass>
</graphicData>
<uiIconScale>1.25</uiIconScale>
<weaponTags>
<li>Artillery_BaseDestroyer</li>
</weaponTags>
<verbs>
<li>
<verbClass>ArachnaeSwarm.Verb_ShootConsumeNutrition</verbClass>
<defaultProjectile>ArachnaeBase_Race_Acidling_Proj</defaultProjectile>
<forcedMissRadius>10</forcedMissRadius>
<ai_AvoidFriendlyFireRadius>3</ai_AvoidFriendlyFireRadius>
<warmupTime>2</warmupTime>
<range>500</range>
<burstShotCount>3</burstShotCount>
<ticksBetweenBurstShots>16</ticksBetweenBurstShots>
<soundCast>Mortar_LaunchA</soundCast>
<soundCastTail>GunTail_Light</soundCastTail>
<muzzleFlashScale>16</muzzleFlashScale>
<requireLineOfSight>false</requireLineOfSight>
<consumeFuelPerShot>0.5</consumeFuelPerShot>
<targetParams>
<canTargetLocations>true</canTargetLocations>
</targetParams>
</li>
</verbs>
</ThingDef>
<ThingDef ParentName="BaseGrenadeProjectile">
<defName>ArachnaeBase_Race_Acidling_Proj</defName>
<label>阿拉克涅酸爆种</label>
<thingClass>Projectile_SpawnsPawnZeroAge</thingClass>
<uiIconPath>Wula/Things/WULA_Attack_Cat/WULA_Cat_Thin_south</uiIconPath>
<graphicData>
<texPath>Things/Pawn/Animal/Spelopede/Spelopede</texPath>
<graphicClass>Graphic_Multi</graphicClass>
</graphicData>
<projectile>
<speed>41</speed>
<spawnsPawnKind>ArachnaeBase_Race_Acidling</spawnsPawnKind>
<tryAdjacentFreeSpaces>true</tryAdjacentFreeSpaces>
<damageDef>ARA_AcidBurn</damageDef>
<damageAmountBase>10</damageAmountBase>
<flyOverhead>true</flyOverhead>
<soundAmbient>MortarRound_Ambient</soundAmbient>
</projectile>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>CatastropheMissileSilo</defName>
<label>天灾酸烧炮组织</label>
<description>阿拉克涅虫族所进化出的终极生物武器之一。它由大量没有自主意识的高度特化器官共同构成,骇人的酸烧炮可以发射令生灵闻风丧胆的天灾酸烧导弹。作为复合型防御系统,它既可以向本地的目标发射导弹,也可以向远处的威胁实施精确打击。</description>
@@ -10,7 +162,7 @@
<texPath>ArachnaeSwarm/Building/ARA_CatastropheMissileSilo_Base</texPath>
<graphicClass>Graphic_Single</graphicClass>
<drawSize>(5,5)</drawSize>
<drawOffset>(0,0,-0.1)</drawOffset>
<drawOffset>(0,0,0.5)</drawOffset>
<shadowData>
<volume>(1.5,0.35,1.4)</volume>
<offset>(0,0,-0.05)</offset>
@@ -30,6 +182,18 @@
</statBases>
<tickerType>Normal</tickerType>
<comps>
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">
<fuelCapacity>5.0</fuelCapacity>
<fuelFilter>
<thingDefs>
<li>ARA_InsectJelly</li>
</thingDefs>
</fuelFilter>
<fuelGizmoLabel>虫蜜</fuelGizmoLabel>
<showAllowAutoRefuelToggle>true</showAllowAutoRefuelToggle>
<targetFuelLevelConfigurable>true</targetFuelLevelConfigurable>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="CompProperties_Refuelable">
<fuelLabel>导弹</fuelLabel>
<fuelGizmoLabel>导弹</fuelGizmoLabel>
@@ -45,6 +209,12 @@
<showFuelGizmo>true</showFuelGizmo>
<consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed>
</li>
<li Class="ArachnaeSwarm.CompProperties_NutritionToFuelConverter">
<checkInterval>300</checkInterval>
<nutritionCost>20</nutritionCost>
<workAmount>6000</workAmount>
<fuelAmount>1</fuelAmount>
</li>
<li Class="CompProperties_Forbiddable"/>
<li Class="CompProperties_Breakdownable"/>
<li Class="ArachnaeSwarm.CompProperties_ForceTargetable" />
@@ -52,19 +222,28 @@
<terrainToSpawn>ARA_InsectCreep</terrainToSpawn>
<spawnRadius>8</spawnRadius>
</li>
<li Class="CompProperties_AffectedByFacilities">
<linkableFacilities>
<li>ARA_NutrientNetworkTower</li>
</linkableFacilities>
</li>
</comps>
<building>
<turretGunDef>CatastropheMissile_Weapon</turretGunDef>
<turretBurstCooldownTime>15.0</turretBurstCooldownTime>
<turretTopDrawSize>5.0</turretTopDrawSize>
<turretTopDrawSize>7.0</turretTopDrawSize>
<turretTopOffset>(0,1.2)</turretTopOffset>
<buildingTags>
<li>Artillery</li>
</buildingTags>
</building>
<costList>
<ARA_Carapace>50</ARA_Carapace>
</costList>
<designationCategory>ARA_Buildings</designationCategory>
<constructionSkillPrerequisite>8</constructionSkillPrerequisite>
<constructionSkillPrerequisite>12</constructionSkillPrerequisite>
<terrainAffordanceNeeded>ARA_Creep</terrainAffordanceNeeded>
<researchPrerequisites>
<li>ShipbuildingBasics</li>
</researchPrerequisites>
</ThingDef>
<ThingDef ParentName="BaseArtilleryWeapon">
@@ -118,7 +297,7 @@
<explosiveRadius>10.9</explosiveRadius>
<postExplosionSpawnThingDef>ARA_Filth_SpentAcid</postExplosionSpawnThingDef>
<postExplosionSpawnChance>1</postExplosionSpawnChance>
<postExplosionSpawnThingCount>2</postExplosionSpawnThingCount>
<postExplosionSpawnThingCount>1</postExplosionSpawnThingCount>
<wickTicks>30~60</wickTicks>
<explosionSound>MortarBomb_Explode</explosionSound>
<explosionEffect>ARA_Shell_AcidSpitImpact</explosionEffect>
@@ -144,7 +323,7 @@
<speed>80</speed>
<flyOverhead>true</flyOverhead>
<filth>ARA_Filth_SpentAcid</filth>
<filthCount>2</filthCount>
<filthCount>1</filthCount>
<explosionEffect>ARA_Shell_AcidSpitImpact</explosionEffect>
<explosionEffectLifetimeTicks>60</explosionEffectLifetimeTicks>
<doExplosionVFX>false</doExplosionVFX>
@@ -182,6 +361,46 @@
</comps>
</ThingDef>
<ThingDef ParentName="BaseBullet">
<defName>Projectile_CatastropheMissile_Fake</defName>
<label>“天灾”巡航导弹</label>
<thingClass>ArachnaeSwarm.Projectile_CruiseMissile</thingClass>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Projectile/FleshmassSpitterProjectileSheet</texPath>
<drawSize>(3,3)</drawSize>
<shaderType>MoteGlow</shaderType>
</graphicData>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_AcidBurn</damageDef>
<damageAmountBase>0</damageAmountBase>
<speed>80</speed>
<flyOverhead>true</flyOverhead>
</projectile>
<modExtensions>
<li Class="ArachnaeSwarm.CruiseMissileProperties">
<isDummy>true</isDummy>
<useSubExplosions>false</useSubExplosions>
<bezierArcHeightFactor>0.01</bezierArcHeightFactor>
<bezierMinArcHeight>1</bezierMinArcHeight>
<bezierMaxArcHeight>5</bezierMaxArcHeight>
<bezierHorizontalOffsetFactor>0.05</bezierHorizontalOffsetFactor>
<bezierSideOffsetFactor>0.05</bezierSideOffsetFactor>
<bezierRandomOffsetScale>1.5</bezierRandomOffsetScale>
</li>
</modExtensions>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="BaseFilth">
<defName>ARA_Filth_SpentAcid</defName>
<label>阿拉克涅残酸</label>
@@ -198,7 +417,7 @@
</graphicData>
<filth>
<ignoreFilthMultiplierStat>true</ignoreFilthMultiplierStat>
<disappearsInDays>1~3</disappearsInDays>
<disappearsInDays>0.5~1</disappearsInDays>
<rainWashes>true</rainWashes>
<cleaningWorkToReduceThickness>70</cleaningWorkToReduceThickness>
<canFilthAttach>true</canFilthAttach>
@@ -257,45 +476,5 @@
</li>
</children>
</EffecterDef>
<ThingDef ParentName="BaseBullet">
<defName>Projectile_CatastropheMissile_Fake</defName>
<label>“天灾”巡航导弹</label>
<thingClass>ArachnaeSwarm.Projectile_CruiseMissile</thingClass>
<graphicData>
<graphicClass>Graphic_Single_AgeSecs</graphicClass>
<texPath>Things/Projectile/FleshmassSpitterProjectileSheet</texPath>
<drawSize>(3,3)</drawSize>
<shaderType>MoteGlow</shaderType>
</graphicData>
<projectile>
<useGraphicClass>True</useGraphicClass>
<shadowSize>1</shadowSize>
<damageDef>ARA_AcidBurn</damageDef>
<damageAmountBase>0</damageAmountBase>
<speed>80</speed>
<flyOverhead>true</flyOverhead>
</projectile>
<modExtensions>
<li Class="ArachnaeSwarm.CruiseMissileProperties">
<isDummy>true</isDummy>
<useSubExplosions>false</useSubExplosions>
<bezierArcHeightFactor>0.01</bezierArcHeightFactor>
<bezierMinArcHeight>1</bezierMinArcHeight>
<bezierMaxArcHeight>5</bezierMaxArcHeight>
<bezierHorizontalOffsetFactor>0.05</bezierHorizontalOffsetFactor>
<bezierSideOffsetFactor>0.05</bezierSideOffsetFactor>
<bezierRandomOffsetScale>1.5</bezierRandomOffsetScale>
</li>
</modExtensions>
<comps>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitStream</effecterDef>
</li>
<li Class="CompProperties_ProjectileEffecter">
<effecterDef>Shell_AcidSpitLaunched</effecterDef>
</li>
</comps>
</ThingDef>
</Defs>
</Defs>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<!-- CompNutritionToFuelConverter -->
<ARA_NutritionConverter_ErrorMissingComps>错误:缺少组件</ARA_NutritionConverter_ErrorMissingComps>
<ARA_NutritionConverter_StatusLabel>状态</ARA_NutritionConverter_StatusLabel>
<ARA_NutritionConverter_NextConversionLabel>下次转换</ARA_NutritionConverter_NextConversionLabel>
<ARA_NutritionConverter_State_NoNutrition>缺少营养</ARA_NutritionConverter_State_NoNutrition>
<ARA_NutritionConverter_State_TankFull>弹药已满</ARA_NutritionConverter_State_TankFull>
<ARA_NutritionConverter_State_Converting>组装中</ARA_NutritionConverter_State_Converting>
<!-- New keys for two-stage process -->
<ARA_NutritionConverter_Gathering>装填中: {0} / {1}</ARA_NutritionConverter_Gathering>
<ARA_NutritionConverter_Working>组装中: {0} / {1}</ARA_NutritionConverter_Working>
</LanguageData>

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -128,6 +128,7 @@
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\CompRefuelableWithKey.cs" />
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\IFuelSource.cs" />
<Compile Include="Building_Comps\WULA_MutiFuelSpawner\Patch_CompRefuelableWithKey.cs" />
<Compile Include="Building_Comps\CompNutritionToFuelConverter.cs" />
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_ConfigurableMutant.cs" />
<Compile Include="Hediffs\ARA_ConfigurableMutant\Hediff_NecroticVirus_Configurable.cs" />
<Compile Include="Hediffs\ARA_ConfigurableMutant\HediffComp_NecroticTransformation.cs" />
@@ -203,6 +204,7 @@
<Compile Include="Verbs\Verb_ShootArc.cs" />
<Compile Include="Verbs\Verb_ShootMeltBeam.cs" />
<Compile Include="Verbs\Verb_ShootShotgun.cs" />
<Compile Include="Verbs\Verb_ShootConsumeNutrition.cs" />
<Compile Include="Verbs\VerbProperties_Excalibur.cs" />
<Compile Include="Verbs\Verb_ShootSprayMulti.cs" />
<Compile Include="Verbs\WeaponStealBeam\Verb_ShootWeaponStealBeam.cs" />

View File

@@ -76,7 +76,8 @@ namespace ArachnaeSwarm
public override string CompInspectStringExtra()
{
string text = Props.FuelLabel + ": " + Fuel.ToStringDecimalIfSmall() + " / " + Props.fuelCapacity.ToStringDecimalIfSmall();
string fuelLabel = string.IsNullOrEmpty(Props.FuelLabel) ? "Nutrition" : Props.FuelLabel;
string text = fuelLabel + ": " + Fuel.ToStringDecimalIfSmall() + " / " + Props.fuelCapacity.ToStringDecimalIfSmall();
if (currentConsumptionRate > 0f && HasFuel)
{

View File

@@ -0,0 +1,125 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_NutritionToFuelConverter : CompProperties
{
public int checkInterval = 240;
public float nutritionCost = 20f;
public int workAmount = 6000;
public float fuelAmount = 1f;
public CompProperties_NutritionToFuelConverter()
{
compClass = typeof(CompNutritionToFuelConverter);
}
}
public class CompNutritionToFuelConverter : ThingComp
{
private CompRefuelableNutrition nutritionComp;
private CompRefuelable fuelComp;
public float nutritionProgress = 0f;
public float workProgress = 0f;
private CompProperties_NutritionToFuelConverter Props => (CompProperties_NutritionToFuelConverter)props;
public override void PostSpawnSetup(bool respawningAfterLoad)
{
base.PostSpawnSetup(respawningAfterLoad);
nutritionComp = parent.GetComp<CompRefuelableNutrition>();
fuelComp = parent.GetComp<CompRefuelable>();
if (nutritionComp == null)
{
Log.Error($"[ArachnaeSwarm] {parent.def.defName} has CompNutritionToFuelConverter but no CompRefuelableNutrition.");
}
if (fuelComp == null)
{
Log.Error($"[ArachnaeSwarm] {parent.def.defName} has CompNutritionToFuelConverter but no CompRefuelable.");
}
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref nutritionProgress, "nutritionProgress", 0f);
Scribe_Values.Look(ref workProgress, "workProgress", 0f);
}
public override void CompTick()
{
base.CompTick();
if (parent.IsHashIntervalTick(Props.checkInterval))
{
TryProcess();
}
}
private void TryProcess()
{
if (fuelComp == null || fuelComp.IsFull)
{
return;
}
// Stage 1: Gather nutrition
if (nutritionProgress < Props.nutritionCost)
{
if (nutritionComp != null && nutritionComp.Fuel > 0)
{
float needed = Props.nutritionCost - nutritionProgress;
float canTake = System.Math.Min(needed, nutritionComp.Fuel);
nutritionComp.ConsumeFuel(canTake);
nutritionProgress += canTake;
}
// Reset work progress if we are still gathering nutrition
workProgress = 0;
return;
}
// Stage 2: Process work
workProgress += Props.checkInterval;
// Stage 3: Finish crafting
if (workProgress >= Props.workAmount)
{
int unitsToCraft = (int)(workProgress / Props.workAmount);
float totalFuel = unitsToCraft * Props.fuelAmount;
float spaceInTank = fuelComp.Props.fuelCapacity - fuelComp.Fuel;
if (totalFuel > spaceInTank)
{
totalFuel = spaceInTank;
unitsToCraft = (int)(totalFuel / Props.fuelAmount);
}
if (unitsToCraft > 0)
{
fuelComp.Refuel(unitsToCraft * Props.fuelAmount);
nutritionProgress -= unitsToCraft * Props.nutritionCost;
workProgress -= unitsToCraft * Props.workAmount;
}
}
}
public override string CompInspectStringExtra()
{
if (fuelComp == null) return null;
if (fuelComp.IsFull)
{
return "ARA_NutritionConverter_State_TankFull".Translate();
}
if (nutritionProgress < Props.nutritionCost)
{
return "ARA_NutritionConverter_Gathering".Translate(nutritionProgress.ToString("F1"), Props.nutritionCost);
}
return "ARA_NutritionConverter_Working".Translate(workProgress.ToString("F0"), Props.workAmount);
}
}
}

View File

@@ -0,0 +1,41 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class Verb_ShootConsumeNutrition : Verb_Shoot
{
public override bool Available()
{
if (!base.Available())
{
return false;
}
if (verbProps.consumeFuelPerShot > 0f)
{
CompRefuelableNutrition comp = caster.TryGetComp<CompRefuelableNutrition>();
if (comp != null && comp.Fuel < verbProps.consumeFuelPerShot)
{
return false;
}
}
return true;
}
public override void WarmupComplete()
{
// This is a bit of a workaround. The base WarmupComplete calls TryCastNextBurstShot,
// which in turn calls the base Verb's fuel consumption logic before we can intervene.
// So we consume fuel here, and the base call will find it already consumed.
// This relies on the fact that TryCastNextBurstShot in the base Verb class checks fuel again.
if (verbProps.consumeFuelPerShot > 0f)
{
caster.TryGetComp<CompRefuelableNutrition>()?.ConsumeFuel(verbProps.consumeFuelPerShot);
}
base.WarmupComplete();
}
}
}