This commit is contained in:
2025-12-31 12:01:39 +08:00
parent ab68728cab
commit bb0f3d281c
11 changed files with 705 additions and 1110 deletions

Binary file not shown.

View File

@@ -282,6 +282,7 @@
<writeCombatLog>True</writeCombatLog> <writeCombatLog>True</writeCombatLog>
<showPsycastEffects>False</showPsycastEffects> <showPsycastEffects>False</showPsycastEffects>
<cooldownTicksRange>6000</cooldownTicksRange> <cooldownTicksRange>6000</cooldownTicksRange>
<aiCanUse>true</aiCanUse>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath> <iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbility</verbClass> <verbClass>Verb_CastAbility</verbClass>
@@ -407,6 +408,7 @@
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_jump</iconPath> <!-- Placeholder Icon --> <iconPath>ArachnaeSwarm/UI/Abilities/ARA_Skyraider_jump</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>5000</cooldownTicksRange> <cooldownTicksRange>5000</cooldownTicksRange>
<hostile>false</hostile> <hostile>false</hostile>
<aiCanUse>false</aiCanUse>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence> <casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<charges>2</charges> <charges>2</charges>
<cooldownPerCharge>true</cooldownPerCharge> <cooldownPerCharge>true</cooldownPerCharge>
@@ -488,6 +490,7 @@
<cooldownTicksRange>6000</cooldownTicksRange> <cooldownTicksRange>6000</cooldownTicksRange>
<targetRequired>false</targetRequired> <targetRequired>false</targetRequired>
<hostile>false</hostile> <hostile>false</hostile>
<aiCanUse>true</aiCanUse>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence> <casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbility</verbClass> <verbClass>Verb_CastAbility</verbClass>
@@ -634,6 +637,7 @@
<cooldownTicksRange>6000</cooldownTicksRange> <cooldownTicksRange>6000</cooldownTicksRange>
<charges>2</charges> <charges>2</charges>
<cooldownPerCharge>true</cooldownPerCharge> <cooldownPerCharge>true</cooldownPerCharge>
<aiCanUse>false</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass> <verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>追踪冲撞</label> <label>追踪冲撞</label>
@@ -821,6 +825,7 @@
<cooldownTicksRange>6000</cooldownTicksRange> <cooldownTicksRange>6000</cooldownTicksRange>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath> <iconPath>ArachnaeSwarm/UI/Abilities/ARA_Toxic_Needle_Fire</iconPath>
<displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted> <displayGizmoWhileUndrafted>false</displayGizmoWhileUndrafted>
<aiCanUse>false</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>Verb_AbilityShoot</verbClass> <verbClass>Verb_AbilityShoot</verbClass>
<defaultProjectile>Bullet_ARA_MimicNematode_Needle</defaultProjectile> <defaultProjectile>Bullet_ARA_MimicNematode_Needle</defaultProjectile>
@@ -881,6 +886,7 @@
<cooldownPerCharge>true</cooldownPerCharge> <cooldownPerCharge>true</cooldownPerCharge>
<hostile>false</hostile> <hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence> <casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<aiCanUse>true</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbilityJump</verbClass> <verbClass>Verb_CastAbilityJump</verbClass>
<violent>false</violent> <violent>false</violent>
@@ -920,6 +926,7 @@
<warmupEffecter>HoraxianAbilityCasting</warmupEffecter> <warmupEffecter>HoraxianAbilityCasting</warmupEffecter>
<warmupSound>AnomalyAbilityWarmup</warmupSound> <warmupSound>AnomalyAbilityWarmup</warmupSound>
<jobDef>CastAbilityOnThingMelee</jobDef> <jobDef>CastAbilityOnThingMelee</jobDef>
<aiCanUse>true</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbilityTouch</verbClass> <verbClass>Verb_CastAbilityTouch</verbClass>
<drawAimPie>false</drawAimPie> <drawAimPie>false</drawAimPie>
@@ -993,6 +1000,7 @@
<warmupEffecter>HoraxianAbilityCasting</warmupEffecter> <warmupEffecter>HoraxianAbilityCasting</warmupEffecter>
<warmupSound>AnomalyAbilityWarmup</warmupSound> <warmupSound>AnomalyAbilityWarmup</warmupSound>
<jobDef>CastAbilityOnThingMelee</jobDef> <jobDef>CastAbilityOnThingMelee</jobDef>
<aiCanUse>false</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbilityTouch</verbClass> <verbClass>Verb_CastAbilityTouch</verbClass>
<drawAimPie>false</drawAimPie> <drawAimPie>false</drawAimPie>
@@ -1049,6 +1057,7 @@
<warmupEffecter>HoraxianAbilityCasting</warmupEffecter> <warmupEffecter>HoraxianAbilityCasting</warmupEffecter>
<warmupSound>AnomalyAbilityWarmup</warmupSound> <warmupSound>AnomalyAbilityWarmup</warmupSound>
<jobDef>CastAbilityOnThingMelee</jobDef> <jobDef>CastAbilityOnThingMelee</jobDef>
<aiCanUse>false</aiCanUse>
<verbProperties> <verbProperties>
<verbClass>Verb_CastAbilityTouch</verbClass> <verbClass>Verb_CastAbilityTouch</verbClass>
<drawAimPie>false</drawAimPie> <drawAimPie>false</drawAimPie>

View File

@@ -13,8 +13,8 @@
<factionIconPath>World/WorldObjects/Expanding/HoraxCult</factionIconPath> <factionIconPath>World/WorldObjects/Expanding/HoraxCult</factionIconPath>
<displayInFactionSelection>true</displayInFactionSelection> <displayInFactionSelection>true</displayInFactionSelection>
<!-- <settlementGenerationWeight>1</settlementGenerationWeight> --> <!-- <settlementGenerationWeight>1</settlementGenerationWeight> -->
<canSiege>true</canSiege> <canSiege>false</canSiege>
<canStageAttacks>true</canStageAttacks> <canStageAttacks>false</canStageAttacks>
<backstoryFilters> <backstoryFilters>
<li> <li>
<categories> <categories>
@@ -25,7 +25,7 @@
<techLevel>Industrial</techLevel> <techLevel>Industrial</techLevel>
<arrivalLayerWhitelist> <arrivalLayerWhitelist>
<li>Surface</li> <li>Surface</li>
<!-- <li MayRequire="Ludeon.RimWorld.Odyssey">Orbit</li> --> <li MayRequire="Ludeon.RimWorld.Odyssey">Orbit</li>
</arrivalLayerWhitelist> </arrivalLayerWhitelist>
<colorSpectrum> <colorSpectrum>
<li>(0.6, 0.5, 0.9)</li> <li>(0.6, 0.5, 0.9)</li>
@@ -38,7 +38,7 @@
</arrivalModeWhitelist> --> </arrivalModeWhitelist> -->
<raidCommonalityFromPointsCurve> <raidCommonalityFromPointsCurve>
<points> <points>
<li>(300, 0)</li> <li>(300, 0.5)</li>
<li>(700, 1)</li> <li>(700, 1)</li>
<li>(1400, 1.8)</li> <li>(1400, 1.8)</li>
<li>(2800, 2.2)</li> <li>(2800, 2.2)</li>
@@ -46,34 +46,75 @@
</points> </points>
</raidCommonalityFromPointsCurve> </raidCommonalityFromPointsCurve>
<pawnGroupMakers> <pawnGroupMakers>
<li> <!-- 0-2000 -->
<commonality>100</commonality> <li>
<kindDef>Combat</kindDef> <kindDef>Combat</kindDef>
<options> <commonality>100000</commonality>
<ArachnaeNode_Race_Praetorian_Enermy>3</ArachnaeNode_Race_Praetorian_Enermy> <maxTotalPoints>2000</maxTotalPoints>
</options> <options>
</li> <ArachnaeNode_Race_WeaponSmith_Enermy>30</ArachnaeNode_Race_WeaponSmith_Enermy>
<li> <ArachnaeNode_Race_ShieldHead_Enermy>10</ArachnaeNode_Race_ShieldHead_Enermy>
<commonality>80</commonality> </options>
<kindDef>Combat</kindDef> </li>
<options> <!-- 2-4000 -->
<ArachnaeNode_Race_ShieldHead_Enermy>3</ArachnaeNode_Race_ShieldHead_Enermy> <li>
</options> <kindDef>Combat</kindDef>
</li> <commonality>10000</commonality>
<li> <maxTotalPoints>4000</maxTotalPoints>
<commonality>80</commonality> <options>
<kindDef>Combat</kindDef> <ArachnaeNode_Race_Fighter_Enermy>5</ArachnaeNode_Race_Fighter_Enermy>
<options> <ArachnaeNode_Race_ShieldHead_Enermy>10</ArachnaeNode_Race_ShieldHead_Enermy>
<ArachnaeNode_Race_Fighter_Enermy>5</ArachnaeNode_Race_Fighter_Enermy> </options>
</options> </li>
</li> <!-- 4-6000 -->
<li>
<kindDef>Combat</kindDef>
<commonality>1000</commonality>
<maxTotalPoints>6000</maxTotalPoints>
<options>
<ArachnaeNode_Race_ShieldHead_Adv_Enermy>10</ArachnaeNode_Race_ShieldHead_Adv_Enermy>
<ArachnaeNode_Race_Fighter_Enermy>10</ArachnaeNode_Race_Fighter_Enermy>
<ArachnaeNode_Race_Fighter_Adv_Enermy>3</ArachnaeNode_Race_Fighter_Adv_Enermy>
</options>
</li>
<!-- 6-8000 -->
<li>
<kindDef>Combat</kindDef>
<commonality>100</commonality>
<maxTotalPoints>8000</maxTotalPoints>
<options>
<ArachnaeNode_Race_ShieldHead_Adv_Enermy>10</ArachnaeNode_Race_ShieldHead_Adv_Enermy>
<ArachnaeNode_Race_Smokepop_Enermy>5</ArachnaeNode_Race_Smokepop_Enermy>
<ArachnaeNode_Race_Fighter_Adv_Enermy>3</ArachnaeNode_Race_Fighter_Adv_Enermy>
</options>
</li>
<!-- 8-10000 -->
<li>
<kindDef>Combat</kindDef>
<commonality>10</commonality>
<maxTotalPoints>9999</maxTotalPoints>
<options>
<ArachnaeNode_Race_Praetorian_Enermy>5</ArachnaeNode_Race_Praetorian_Enermy>
<ArachnaeNode_Race_Smokepop_Enermy>10</ArachnaeNode_Race_Smokepop_Enermy>
<ArachnaeNode_Race_Fighter_Adv_Enermy>3</ArachnaeNode_Race_Fighter_Adv_Enermy>
</options>
</li>
<!-- 10000+ -->
<li>
<kindDef>Combat</kindDef>
<commonality>1</commonality>
<options>
<ArachnaeNode_Race_Praetorian_Enermy>5</ArachnaeNode_Race_Praetorian_Enermy>
<ArachnaeNode_Race_Fighter_Adv_Enermy>2</ArachnaeNode_Race_Fighter_Adv_Enermy>
<ArachnaeBeast_Race_Slayer_Enermy>1</ArachnaeBeast_Race_Slayer_Enermy>
</options>
</li>
<li> <li>
<kindDef>Settlement</kindDef> <kindDef>Settlement</kindDef>
<options> <options>
<TradersGuild_Citizen>10</TradersGuild_Citizen> <ArachnaeNode_Race_Fighter_Enermy>10</ArachnaeNode_Race_Fighter_Enermy>
<TradersGuild_Slasher>7</TradersGuild_Slasher> <ArachnaeNode_Race_ShieldHead_Enermy>7</ArachnaeNode_Race_ShieldHead_Enermy>
<TradersGuild_Gunner>10</TradersGuild_Gunner> <ArachnaeNode_Race_Myrmecocystus_Enermy>10</ArachnaeNode_Race_Myrmecocystus_Enermy>
<TradersGuild_Elite>10</TradersGuild_Elite>
</options> </options>
</li> </li>
</pawnGroupMakers> </pawnGroupMakers>

View File

@@ -1,27 +1,69 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<Defs> <Defs>
<PawnKindDef ParentName="ArachnaeNode_Race_Fighter"> <PawnKindDef ParentName="ArachnaeNode_Race_Myrmecocystus">
<defName>ArachnaeNode_Race_Fighter_Enermy</defName> <defName>ArachnaeNode_Race_Myrmecocystus_Enermy</defName>
<isFighter>true</isFighter> <isFighter>true</isFighter>
<trader>false</trader> <trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance> <chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons> <apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality> <forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance> <!-- <overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned> <forceDeathOnDowned>false</forceDeathOnDowned> -->
<canBeScattered>false</canBeScattered> <canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType> <defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags> <weaponTags>
<li>ARA_Armed_Organ_T1</li> <li>ARA_Armed_Organ_Base</li>
</weaponTags> </weaponTags>
<apparelTags> <apparelTags>
<li>ARA_Inner</li> <li>ARA_Inner</li>
<li>ARA_Clothes</li> <li>ARA_Clothes</li>
</apparelTags> </apparelTags>
<apparelMoney>1000</apparelMoney> <apparelMoney>300~500</apparelMoney>
<weaponMoney>5000</weaponMoney> <weaponMoney>300~500</weaponMoney>
<combatPower>250</combatPower> <combatPower>100</combatPower>
</PawnKindDef> <startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_RaceBaseSwarmProduceSwitchHediff</def>
<severity>1</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_WeaponSmith">
<defName>ArachnaeNode_Race_WeaponSmith_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<!-- <overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>false</forceDeathOnDowned> -->
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags>
<li>ARA_Armed_Organ_Base</li>
</weaponTags>
<apparelTags>
<li>ARA_Inner</li>
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>300~500</apparelMoney>
<weaponMoney>500~1200</weaponMoney>
<combatPower>150</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_RaceBaseSwarmProduceSwitchHediff</def>
<severity>1</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_ShieldHead"> <PawnKindDef ParentName="ArachnaeNode_Race_ShieldHead">
<defName>ArachnaeNode_Race_ShieldHead_Enermy</defName> <defName>ArachnaeNode_Race_ShieldHead_Enermy</defName>
<isFighter>true</isFighter> <isFighter>true</isFighter>
@@ -34,15 +76,151 @@
<canBeScattered>false</canBeScattered> <canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType> <defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags> <weaponTags>
<li>ARA_Armed_Organ_T1</li> <li>ARA_Armed_Organ_Base</li>
</weaponTags> </weaponTags>
<apparelTags> <apparelTags>
<li>ARA_Inner</li> <li>ARA_Inner</li>
<li>ARA_Clothes</li> <li>ARA_Clothes</li>
</apparelTags> </apparelTags>
<apparelMoney>1000</apparelMoney> <apparelMoney>400~700</apparelMoney>
<weaponMoney>5000</weaponMoney> <weaponMoney>500~1200</weaponMoney>
<combatPower>330</combatPower> <combatPower>100</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_RaceBaseSwarmProduceSwitchHediff</def>
<severity>1</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_Fighter">
<defName>ArachnaeNode_Race_Fighter_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned>
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags>
<li>ARA_Armed_Organ_Base</li>
</weaponTags>
<apparelTags>
<li>ARA_Inner</li>
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>500~900</apparelMoney>
<weaponMoney>800~1800</weaponMoney>
<combatPower>250</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_ShieldHead">
<defName>ArachnaeNode_Race_ShieldHead_Adv_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned>
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags>
<li>ARA_Armed_Organ_Base</li>
</weaponTags>
<apparelTags>
<li>ARA_Inner</li>
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>600~1200</apparelMoney>
<weaponMoney>600~1000</weaponMoney>
<combatPower>320</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_ShieldHead_Protector</def>
<severity>1</severity>
</li>
<li>
<def>ARA_RaceBaseSwarmProduceSwitchHediff</def>
<severity>1</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_Fighter">
<defName>ArachnaeNode_Race_Fighter_Adv_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<canOpenAnyDoor>true</canOpenAnyDoor>
<collidesWithPawns>false</collidesWithPawns>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned>
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags>
<li>ARA_Armed_Organ_Melee</li>
</weaponTags>
<apparelTags>
<li>ARA_Inner</li>
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>500~900</apparelMoney>
<weaponMoney>300~1200</weaponMoney>
<combatPower>380</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_Fighter_Invisibility</def>
<severity>1</severity>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_Smokepop">
<defName>ArachnaeNode_Race_Smokepop_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned>
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags>
<li>ARA_Armed_Organ_Huge</li>
</weaponTags>
<apparelTags>
<li>ARA_Inner</li>
<li>ARA_Clothes</li>
</apparelTags>
<apparelMoney>600~1500</apparelMoney>
<weaponMoney>1200~2500</weaponMoney>
<combatPower>450</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
</startingHediffs>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNode_Race_Praetorian"> <PawnKindDef ParentName="ArachnaeNode_Race_Praetorian">
<defName>ArachnaeNode_Race_Praetorian_Enermy</defName> <defName>ArachnaeNode_Race_Praetorian_Enermy</defName>
@@ -56,15 +234,46 @@
<canBeScattered>false</canBeScattered> <canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType> <defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<weaponTags> <weaponTags>
<li>ARA_Armed_Organ_T3</li> <li>ARA_Armed_Organ_Base</li>
</weaponTags> </weaponTags>
<apparelTags> <apparelTags>
<li>ARA_Inner</li> <li>ARA_Inner</li>
<li>ARA_Clothes</li> <li>ARA_Clothes</li>
</apparelTags> </apparelTags>
<apparelMoney>1000</apparelMoney> <apparelMoney>1000~2500</apparelMoney>
<weaponMoney>5000</weaponMoney> <weaponMoney>2000~3000</weaponMoney>
<combatPower>700</combatPower> <combatPower>600</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
<li>
<def>ARA_Praetorian_Commander_Hediff</def>
<chance>0.25</chance>
</li>
</startingHediffs>
</PawnKindDef>
<PawnKindDef ParentName="ArachnaeBeast_Race_Slayer">
<defName>ArachnaeBeast_Race_Slayer_Enermy</defName>
<isFighter>true</isFighter>
<trader>false</trader>
<chemicalAddictionChance>0</chemicalAddictionChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>
<forceNormalGearQuality>true</forceNormalGearQuality>
<overrideDeathOnDownedChance>1</overrideDeathOnDownedChance>
<forceDeathOnDowned>true</forceDeathOnDowned>
<canBeScattered>false</canBeScattered>
<defaultFactionType>ARA_Hostile_Hive</defaultFactionType>
<apparelMoney>0</apparelMoney>
<weaponMoney>0</weaponMoney>
<combatPower>999</combatPower>
<startingHediffs>
<li>
<def>CrumblingMind</def>
<severity>0.01</severity>
</li>
</startingHediffs>
</PawnKindDef> </PawnKindDef>
<!-- 辅虫群单位 --> <!-- 辅虫群单位 -->

View File

@@ -192,7 +192,7 @@
</li> </li>
</moveSpeedFactorByTerrainTag> </moveSpeedFactorByTerrainTag>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_Myrmecocystus" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Myrmecocystus</defName> <defName>ArachnaeNode_Race_Myrmecocystus</defName>
<label>阿拉克涅蜜罐种</label> <label>阿拉克涅蜜罐种</label>
<race>ArachnaeNode_Race_Myrmecocystus</race> <race>ArachnaeNode_Race_Myrmecocystus</race>
@@ -237,7 +237,7 @@
<li>ARA_RaceBaseSwarmProduceOn</li> <li>ARA_RaceBaseSwarmProduceOn</li>
</abilities> </abilities>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_WeaponSmith" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_WeaponSmith</defName> <defName>ArachnaeNode_Race_WeaponSmith</defName>
<label>阿拉克涅工艺种</label> <label>阿拉克涅工艺种</label>
<race>ArachnaeNode_Race_WeaponSmith</race> <race>ArachnaeNode_Race_WeaponSmith</race>
@@ -259,7 +259,7 @@
<li>ARA_RaceBaseSwarmProduceOn</li> <li>ARA_RaceBaseSwarmProduceOn</li>
</abilities> </abilities>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_Facehugger" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Facehugger</defName> <defName>ArachnaeNode_Race_Facehugger</defName>
<label>阿拉克涅原虫种</label> <label>阿拉克涅原虫种</label>
<race>ArachnaeNode_Race_Facehugger</race> <race>ArachnaeNode_Race_Facehugger</race>
@@ -299,7 +299,7 @@
</apparelTags> </apparelTags>
<apparelMoney>0</apparelMoney> <apparelMoney>0</apparelMoney>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_Smokepop" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Smokepop</defName> <defName>ArachnaeNode_Race_Smokepop</defName>
<label>阿拉克涅迷雾种</label> <label>阿拉克涅迷雾种</label>
<race>ArachnaeNode_Race_Smokepop</race> <race>ArachnaeNode_Race_Smokepop</race>
@@ -321,7 +321,7 @@
</apparelTags> </apparelTags>
<apparelMoney>0</apparelMoney> <apparelMoney>0</apparelMoney>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_Skyraider" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_Skyraider</defName> <defName>ArachnaeNode_Race_Skyraider</defName>
<label>阿拉克涅空天种</label> <label>阿拉克涅空天种</label>
<race>ArachnaeNode_Race_Skyraider</race> <race>ArachnaeNode_Race_Skyraider</race>
@@ -355,7 +355,7 @@
</li> </li>
</modExtensions> </modExtensions>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind"> <PawnKindDef Name="ArachnaeNode_Race_NeuroSwarm" ParentName="ArachnaeNodeABasePawnKind">
<defName>ArachnaeNode_Race_NeuroSwarm</defName> <defName>ArachnaeNode_Race_NeuroSwarm</defName>
<label>阿拉克涅织域种</label> <label>阿拉克涅织域种</label>
<race>ArachnaeNode_Race_NeuroSwarm</race> <race>ArachnaeNode_Race_NeuroSwarm</race>
@@ -404,7 +404,7 @@
</apparelTags> </apparelTags>
<apparelMoney>0</apparelMoney> <apparelMoney>0</apparelMoney>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind" Name="ARA_MimicNematodeShamblerBase" Abstract="True"> <PawnKindDef Name="ARA_MimicNematodeShamblerBase" ParentName="ArachnaeNodeABasePawnKind" Abstract="True">
<mutant>ARA_MimicNematodeShambler</mutant> <mutant>ARA_MimicNematodeShambler</mutant>
<generateInitialNonFamilyRelations>false</generateInitialNonFamilyRelations> <generateInitialNonFamilyRelations>false</generateInitialNonFamilyRelations>
</PawnKindDef> </PawnKindDef>
@@ -585,7 +585,7 @@
</lifeStages> </lifeStages>
</PawnKindDef> </PawnKindDef>
<PawnKindDef ParentName="ARA_InsectKindBase"> <PawnKindDef Name="ArachnaeBeast_Race_Slayer" ParentName="ARA_InsectKindBase">
<defName>ArachnaeBeast_Race_Slayer</defName> <defName>ArachnaeBeast_Race_Slayer</defName>
<label>阿拉克涅暴屠种</label> <label>阿拉克涅暴屠种</label>
<race>ArachnaeBeast_Race_Slayer</race> <race>ArachnaeBeast_Race_Slayer</race>

View File

@@ -9,6 +9,7 @@
<MoveSpeed>5</MoveSpeed> <MoveSpeed>5</MoveSpeed>
</statBases> </statBases>
<race> <race>
<lifeExpectancy>2500</lifeExpectancy>
<body>ArachnaeSlayer_Body</body> <body>ArachnaeSlayer_Body</body>
<thinkTreeMain>ARA_Insect_Beast</thinkTreeMain> <thinkTreeMain>ARA_Insect_Beast</thinkTreeMain>
<!-- 身形大小 --> <!-- 身形大小 -->

View File

@@ -144,8 +144,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -369,8 +369,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -454,8 +454,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -496,8 +496,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -584,8 +584,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -647,8 +647,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">
@@ -772,8 +772,8 @@
<shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow> <shadow>ArachnaeSwarm/Weapon/ARA_Weapon_Empty</shadow>
<shadowSize>(0, 0)</shadowSize> <shadowSize>(0, 0)</shadowSize>
<motesPerCell>0</motesPerCell> <motesPerCell>0</motesPerCell>
<floatingSound>FlyOver/Flying</floatingSound> <!-- <floatingSound>FlyOver/Flying</floatingSound> -->
<impactSound>FlyOver/Landing</impactSound> <!-- <impactSound>FlyOver/Landing</impactSound> -->
</skyfaller> </skyfaller>
<modExtensions> <modExtensions>
<li Class="ArachnaeSwarm.FlyOverShadowExtension"> <li Class="ArachnaeSwarm.FlyOverShadowExtension">

View File

@@ -6,7 +6,7 @@
<label>武装器官"骨刃"</label> <label>武装器官"骨刃"</label>
<description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。尽管它只是一块坚硬的剑形骨片,但是丝毫不影响那些拥有无穷蛮力的阿拉克涅虫群督虫使用它将侵犯虫巢之敌一一斩首。</description> <description>阿拉克涅虫群督虫使用基础近战武装器官,通过多根外露神经束与督虫的辅肢相连。尽管它只是一块坚硬的剑形骨片,但是丝毫不影响那些拥有无穷蛮力的阿拉克涅虫群督虫使用它将侵犯虫巢之敌一一斩首。</description>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Melee</li> <li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T1</li> <li>ARA_Armed_Organ_T1</li>
<li>ARA_MW_Bone_Sword</li> <li>ARA_MW_Bone_Sword</li>
@@ -81,7 +81,7 @@
<label>武装器官"软骨鞭"</label> <label>武装器官"软骨鞭"</label>
<description>阿拉克涅虫群督虫使用的近战武装器官,以节节软骨交错形成强韧的鞭子。这种武器在打击敌人时不仅会发出骇人的声响,还会使得对手疼痛难忍,并且以击打为主的钝器伤害也能很好地规避敌方装甲的防御。</description> <description>阿拉克涅虫群督虫使用的近战武装器官,以节节软骨交错形成强韧的鞭子。这种武器在打击敌人时不仅会发出骇人的声响,还会使得对手疼痛难忍,并且以击打为主的钝器伤害也能很好地规避敌方装甲的防御。</description>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Melee</li> <li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
</weaponTags> </weaponTags>
@@ -101,7 +101,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<statBases> <statBases>
<MarketValue>250</MarketValue> <MarketValue>700</MarketValue>
<WorkToMake>1000</WorkToMake> <WorkToMake>1000</WorkToMake>
<Mass>5</Mass> <Mass>5</Mass>
<ARA_IncubationCost>120</ARA_IncubationCost> <ARA_IncubationCost>120</ARA_IncubationCost>
@@ -165,7 +165,7 @@
<label>武装器官"镰爪"</label> <label>武装器官"镰爪"</label>
<description>阿拉克涅虫群督虫使用的近战武装器官,状似一柄巨型镰刀,可以和辅肢通过神经束进行连接。得益于其巨大的体积,其每次挥击将造成范围性的伤害,一次性可以击倒多个相邻目标。</description> <description>阿拉克涅虫群督虫使用的近战武装器官,状似一柄巨型镰刀,可以和辅肢通过神经束进行连接。得益于其巨大的体积,其每次挥击将造成范围性的伤害,一次性可以击倒多个相邻目标。</description>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Melee</li> <li>ARA_Armed_Organ_Melee</li>
<li>ARA_Armed_Organ_T3</li> <li>ARA_Armed_Organ_T3</li>
</weaponTags> </weaponTags>
@@ -185,7 +185,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<statBases> <statBases>
<MarketValue>350</MarketValue> <MarketValue>1200</MarketValue>
<WorkToMake>3000</WorkToMake> <WorkToMake>3000</WorkToMake>
<Mass>5</Mass> <Mass>5</Mass>
<ARA_IncubationCost>350</ARA_IncubationCost> <ARA_IncubationCost>350</ARA_IncubationCost>
@@ -298,6 +298,9 @@
<ARA_Carapace>25</ARA_Carapace> <ARA_Carapace>25</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li> <li>ARA_Armed_Organ_Small_Ranged_Needle</li>
</weaponTags> </weaponTags>
<generateCommonality>0.01</generateCommonality> <generateCommonality>0.01</generateCommonality>
@@ -406,7 +409,7 @@
<ARA_Carapace>25</ARA_Carapace> <ARA_Carapace>25</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li> <li>ARA_Armed_Organ_Small_Ranged_Needle</li>
@@ -500,7 +503,7 @@
<ARA_Carapace>25</ARA_Carapace> <ARA_Carapace>25</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li> <li>ARA_Armed_Organ_Small_Ranged_Needle</li>
@@ -621,7 +624,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Huge</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Needle</li> <li>ARA_Armed_Organ_Huge_Ranged_Needle</li>
@@ -736,7 +739,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_Needle</li> <li>ARA_Armed_Organ_Small_Ranged_Needle</li>
@@ -835,7 +838,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li> <li>ARA_Armed_Organ_T1</li>
<li>ARA_Armed_Organ_Small_Ranged_Acid</li> <li>ARA_Armed_Organ_Small_Ranged_Acid</li>
@@ -947,8 +950,8 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_Huge</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li> <li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags> </weaponTags>
@@ -1093,8 +1096,8 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_Huge</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li> <li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags> </weaponTags>
@@ -1208,7 +1211,7 @@
<ARA_Carapace>25</ARA_Carapace> <ARA_Carapace>25</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T3</li> <li>ARA_Armed_Organ_T3</li>
<li>ARA_Armed_Organ_Small_Ranged_Acid</li> <li>ARA_Armed_Organ_Small_Ranged_Acid</li>
@@ -1338,8 +1341,8 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_Huge</li>
<li>ARA_Armed_Organ_T3</li> <li>ARA_Armed_Organ_T3</li>
<li>ARA_Armed_Organ_Huge_Ranged_Acid</li> <li>ARA_Armed_Organ_Huge_Ranged_Acid</li>
</weaponTags> </weaponTags>
@@ -1470,9 +1473,9 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_Base</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T1</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Small_Ranged_SP</li> <li>ARA_Armed_Organ_Small_Ranged_SP</li>
</weaponTags> </weaponTags>
<generateCommonality>0.01</generateCommonality> <generateCommonality>0.01</generateCommonality>
@@ -1624,8 +1627,8 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_Huge</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
<li>ARA_Armed_Organ_Huge_Ranged_Energy</li> <li>ARA_Armed_Organ_Huge_Ranged_Energy</li>
</weaponTags> </weaponTags>
@@ -2221,7 +2224,7 @@
<ARA_Carapace>50</ARA_Carapace> <ARA_Carapace>50</ARA_Carapace>
</costList> </costList>
<weaponTags Inherit="False"> <weaponTags Inherit="False">
<li>ARA_Armed_Organ</li> <li>ARA_Armed_Organ_SP</li>
<li>ARA_Armed_Organ_Ranged</li> <li>ARA_Armed_Organ_Ranged</li>
<li>ARA_Armed_Organ_T2</li> <li>ARA_Armed_Organ_T2</li>
</weaponTags> </weaponTags>

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
using RimWorld; using RimWorld;
using UnityEngine; using UnityEngine;
using Verse; using Verse;
using System.Reflection; using System.Reflection;
@@ -21,12 +21,15 @@ namespace ArachnaeSwarm
public float collisionRadius; public float collisionRadius;
public SoundDef impactSound; public SoundDef impactSound;
public bool damageHostileOnly; public bool damageHostileOnly;
public int maxFlightTicks; public int maxFlightTicks = 1000; // 最大飞行时间,防止无限飞行
// --- Internal state --- // --- Internal state ---
private bool homing = true; private bool homing = true;
private bool hasHitPrimaryTarget = false; private bool hasHitPrimaryTarget = false;
private Vector3 exactPosition; private Vector3 exactPosition;
private IntVec3? desiredLandingCell = null; // 新增:期望的降落位置
private bool isLanding = false; // 新增:标记是否正在降落
private bool positionAdjusted = false; // 新增:标记是否已调整位置
// --- Reflection Fields --- // --- Reflection Fields ---
private static FieldInfo TicksFlyingInfo; private static FieldInfo TicksFlyingInfo;
@@ -81,48 +84,248 @@ namespace ArachnaeSwarm
protected override void Tick() protected override void Tick()
{ {
// --- THE CORRECT APPROACH --- // --- 安全防护:防止无限飞行 ---
// Let the base class handle all flight mechanics (position, timing, etc.) int ticksFlying = (int)TicksFlyingInfo.GetValue(this);
// We only intervene to do two things: if (ticksFlying > maxFlightTicks)
// 1. Continuously update the destination to "steer" the flyer. {
// 2. Perform our own collision checks (for primary target and AOE). ArachnaeLog.Debug("TrackingCharge reached max flight ticks, forcing landing.");
ForceLanding();
return;
}
// --- 飞行中逻辑 ---
if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned) if (homing && primaryTarget.HasThing && primaryTarget.Thing.Spawned)
{ {
// Steer the flyer by constantly updating its destination cell. // 更新目的地以引导飞行器
DestCellInfo.SetValue(this, primaryTarget.Thing.Position); DestCellInfo.SetValue(this, primaryTarget.Thing.Position);
} }
// --- Primary Target Collision Check --- // --- 主目标碰撞检测 ---
if (!hasHitPrimaryTarget && primaryTarget.HasThing && primaryTarget.Thing.Spawned) if (!hasHitPrimaryTarget && primaryTarget.HasThing && primaryTarget.Thing.Spawned)
{ {
if ((this.DrawPos - primaryTarget.Thing.DrawPos).sqrMagnitude < this.collisionRadius * this.collisionRadius) float distanceToTargetSq = (this.DrawPos - primaryTarget.Thing.DrawPos).sqrMagnitude;
float collisionRadiusSq = this.collisionRadius * this.collisionRadius;
if (distanceToTargetSq <= collisionRadiusSq)
{ {
// --- Impact! --- // --- 碰撞发生! ---
if (this.impactSound != null) ImpactPrimaryTarget();
{
SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.Position, this.Map));
}
Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this);
float distance = (this.DrawPos - startPosition).magnitude;
float calculatedDamage = this.initialDamage + (distance * this.damagePerTile);
var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn);
primaryTarget.Thing.TakeDamage(dinfo);
hasHitPrimaryTarget = true;
homing = false;
Vector3 direction = (this.DrawPos - startPosition).normalized;
IntVec3 inertiaEndPos = (this.DrawPos + (direction * this.inertiaDistance)).ToIntVec3();
DestCellInfo.SetValue(this, inertiaEndPos);
} }
} }
// --- AOE Damage Logic --- // --- AOE伤害逻辑 ---
float distanceTravelled = ((Vector3)StartVecInfo.GetValue(this) - this.DrawPos).magnitude; ApplyAoeDamage();
// --- 基础Tick逻辑 ---
base.Tick();
// --- 到达目的地后的处理 ---
if (!homing && !isLanding)
{
HandlePostImpactMovement();
}
}
// 新增:处理主目标碰撞
private void ImpactPrimaryTarget()
{
// 播放音效
if (this.impactSound != null)
{
SoundStarter.PlayOneShot(this.impactSound, new TargetInfo(this.Position, this.Map));
}
// 计算伤害
Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this);
float distance = (this.DrawPos - startPosition).magnitude;
float calculatedDamage = this.initialDamage + (distance * this.damagePerTile);
var dinfo = new DamageInfo(this.collisionDamageDef, calculatedDamage, 1f, -1, this.FlyingPawn);
primaryTarget.Thing.TakeDamage(dinfo);
hasHitPrimaryTarget = true;
homing = false;
// 计算期望的降落位置(目标身后一格)
CalculateDesiredLandingCell();
}
// 新增:计算期望的降落位置
private void CalculateDesiredLandingCell()
{
if (!primaryTarget.HasThing || !primaryTarget.Thing.Spawned)
{
// 如果没有主目标,就停在当前位置
desiredLandingCell = this.Position;
return;
}
Vector3 startPos = (Vector3)StartVecInfo.GetValue(this);
Vector3 targetPos = primaryTarget.Thing.DrawPos;
// 计算从起点到目标的方向
Vector3 direction = (targetPos - startPos).normalized;
// 计算目标身后一格的位置(延长线方向)
Vector3 behindTargetPos = targetPos + direction * 1.0f; // 1格距离
IntVec3 candidateCell = behindTargetPos.ToIntVec3();
// 验证这个位置是否可用
if (IsValidLandingCell(candidateCell))
{
desiredLandingCell = candidateCell;
}
else
{
// 如果不可用,寻找最近的可用位置
desiredLandingCell = FindNearbyLandableCell(candidateCell);
}
if (desiredLandingCell.HasValue)
{
// 立即设置目的地
DestCellInfo.SetValue(this, desiredLandingCell.Value);
ArachnaeLog.Debug($"TrackingCharge will land at {desiredLandingCell.Value}");
}
}
// 新增:验证单元格是否适合降落
private bool IsValidLandingCell(IntVec3 cell)
{
if (cell == this.Position)
return true;
if (!cell.InBounds(this.Map))
return false;
// 检查单元格是否可行走
if (!cell.Walkable(this.Map))
return false;
// 检查是否有障碍物
if (cell.GetFirstThing<Building>(this.Map) != null)
return false;
// 检查是否有其他生物
Pawn pawnAtCell = cell.GetFirstPawn(this.Map);
if (pawnAtCell != null && pawnAtCell != this.FlyingPawn)
return false;
return true;
}
// 新增:寻找附近的可用降落单元格
private IntVec3 FindNearbyLandableCell(IntVec3 centerCell)
{
// 优先检查当前位置
if (IsValidLandingCell(this.Position))
return this.Position;
// 从近到远搜索可用单元格
for (int radius = 1; radius <= 5; radius++)
{
List<IntVec3> cellsInRadius = GenRadial.RadialCellsAround(centerCell, radius, true).ToList();
// 按与中心距离排序
cellsInRadius.Sort((a, b) =>
(a - centerCell).LengthHorizontalSquared.CompareTo((b - centerCell).LengthHorizontalSquared));
foreach (var cell in cellsInRadius)
{
if (IsValidLandingCell(cell))
return cell;
}
}
// 如果都找不到,返回最近的可行走单元格
CellFinder.TryFindRandomCellNear(centerCell, this.Map, 10,
cell => cell.Walkable(this.Map), out IntVec3 fallbackCell);
return fallbackCell;
}
// 新增:处理撞击后的移动
private void HandlePostImpactMovement()
{
int ticksFlying = (int)TicksFlyingInfo.GetValue(this);
int ticksFlightTime = (int)TicksFlightTimeInfo.GetValue(this);
// 如果已经到达目的地或接近目的地,强制降落
if (ticksFlying >= ticksFlightTime - 5) // 提前几tick准备降落
{
isLanding = true;
// 确保目的地是我们期望的位置
if (desiredLandingCell.HasValue && this.Position != desiredLandingCell.Value && !positionAdjusted)
{
// 如果不在期望的位置,尝试移动到那里
if (this.Position.DistanceTo(desiredLandingCell.Value) <= 2)
{
// 很近,直接设置位置
this.Position = desiredLandingCell.Value;
positionAdjusted = true;
ArachnaeLog.Debug($"TrackingCharge adjusted position to {desiredLandingCell.Value}");
}
}
}
// 额外的距离检查:如果已经超过惯性距离,强制结束飞行
Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this);
float traveledDistance = (this.DrawPos - startPosition).magnitude;
float maxAllowedDistance = (primaryTarget.HasThing && primaryTarget.Thing.Spawned)
? (startPosition - primaryTarget.Thing.DrawPos).magnitude + inertiaDistance + 2.0f // 多加2格容差
: inertiaDistance * 2;
if (traveledDistance > maxAllowedDistance)
{
ArachnaeLog.Debug($"TrackingCharge exceeded max allowed distance, forcing landing.");
ForceLanding();
}
}
// 新增:强制降落
private void ForceLanding()
{
// 如果还没有计算降落位置,现在计算
if (!desiredLandingCell.HasValue)
{
CalculateDesiredLandingCell();
}
// 确保有降落位置
if (!desiredLandingCell.HasValue)
{
desiredLandingCell = this.Position;
}
// 立即设置目的地并强制完成飞行
DestCellInfo.SetValue(this, desiredLandingCell.Value);
int ticksFlightTime = (int)TicksFlightTimeInfo.GetValue(this);
int currentTicksFlying = (int)TicksFlyingInfo.GetValue(this);
// 如果已经飞了很长时间,直接设置完成
if (currentTicksFlying >= ticksFlightTime - 1)
{
TicksFlyingInfo.SetValue(this, ticksFlightTime);
isLanding = true;
}
}
// 新增应用AOE伤害
private void ApplyAoeDamage()
{
if (!hasHitPrimaryTarget)
return;
Vector3 startPosition = (Vector3)StartVecInfo.GetValue(this);
float distanceTravelled = (this.DrawPos - startPosition).magnitude;
float currentAOEDamage = this.initialDamage + (distanceTravelled * this.damagePerTile); float currentAOEDamage = this.initialDamage + (distanceTravelled * this.damagePerTile);
// 只应用一次AOE伤害避免每帧都造成伤害
int ticksFlying = (int)TicksFlyingInfo.GetValue(this);
if (ticksFlying % 5 != 0) // 每5帧检查一次
return;
foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, this.collisionRadius, false)) foreach (var thing in GenRadial.RadialDistinctThingsAround(this.Position, this.Map, this.collisionRadius, false))
{ {
@@ -143,15 +346,93 @@ namespace ArachnaeSwarm
} }
} }
} }
// Let the base class do its thing. This is crucial.
base.Tick();
} }
// 新增:在飞行器销毁前调整位置
protected override void TickInterval(int delta)
{
// 先让基类处理基础逻辑
base.TickInterval(delta);
// 如果我们已经击中了目标,并且已经设置了期望的降落位置
// 在飞行即将结束时,确保位置正确
int ticksFlying = (int)TicksFlyingInfo.GetValue(this);
int ticksFlightTime = (int)TicksFlightTimeInfo.GetValue(this);
if (hasHitPrimaryTarget && desiredLandingCell.HasValue && ticksFlying >= ticksFlightTime - 2 && !positionAdjusted)
{
// 在飞行结束前2tick尝试调整到期望位置
if (this.Position != desiredLandingCell.Value && IsValidLandingCell(desiredLandingCell.Value))
{
this.Position = desiredLandingCell.Value;
positionAdjusted = true;
ArachnaeLog.Debug($"TrackingCharge final position adjustment to {desiredLandingCell.Value}");
}
}
}
// 修改:在降落时确保驾驶员在正确位置
protected override void RespawnPawn() protected override void RespawnPawn()
{ {
// This is the correct place to call the base method. // 降落前最后的位置修正
if (desiredLandingCell.HasValue && this.Position != desiredLandingCell.Value && !positionAdjusted)
{
// 检查期望位置是否可用
if (IsValidLandingCell(desiredLandingCell.Value))
{
this.Position = desiredLandingCell.Value;
positionAdjusted = true;
}
}
base.RespawnPawn(); base.RespawnPawn();
// 确保驾驶员处于正确状态
Pawn flyingPawn = this.FlyingPawn;
if (flyingPawn != null && flyingPawn.Spawned)
{
// 如果驾驶员不在期望位置,尝试移动
if (desiredLandingCell.HasValue && flyingPawn.Position != desiredLandingCell.Value && IsValidLandingCell(desiredLandingCell.Value))
{
flyingPawn.Position = desiredLandingCell.Value;
ArachnaeLog.Debug($"TrackingCharge moved pawn to desired position {desiredLandingCell.Value}");
}
// 停止所有工作,防止继续移动
flyingPawn.pather?.StopDead();
flyingPawn.jobs?.StopAll();
// 通知技能完成
ArachnaeLog.Debug($"TrackingCharge completed at {flyingPawn.Position}");
}
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref homing, "homing", true);
Scribe_Values.Look(ref hasHitPrimaryTarget, "hasHitPrimaryTarget", false);
Scribe_Values.Look(ref isLanding, "isLanding", false);
Scribe_Values.Look(ref positionAdjusted, "positionAdjusted", false);
if (Scribe.mode == LoadSaveMode.Saving)
{
if (desiredLandingCell.HasValue)
{
IntVec3 cell = desiredLandingCell.Value;
Scribe_Values.Look(ref cell, "desiredLandingCell");
}
}
else if (Scribe.mode == LoadSaveMode.LoadingVars)
{
IntVec3 cell = IntVec3.Invalid;
Scribe_Values.Look(ref cell, "desiredLandingCell");
if (cell.IsValid)
{
desiredLandingCell = cell;
}
}
} }
} }
} }