11
This commit is contained in:
Binary file not shown.
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
<!-- 辅虫群单位 -->
|
<!-- 辅虫群单位 -->
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
<!-- 身形大小 -->
|
<!-- 身形大小 -->
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user