This commit is contained in:
2025-12-09 12:02:39 +08:00
parent 720487805f
commit 142df124dd
22 changed files with 991 additions and 539 deletions

View File

@@ -1269,7 +1269,7 @@
<points>4000</points>
<faction>Wula_PIA_Legion_Faction</faction>
<raidStrategy>ImmediateAttackFriendly</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
@@ -1295,7 +1295,7 @@
<points>4000</points>
<faction>Wula_PIA_Legion_Faction</faction>
<raidStrategy>ImmediateAttackFriendly</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
@@ -1321,7 +1321,7 @@
<points>1000</points>
<faction>Wula_PIA_Legion_Faction</faction>
<raidStrategy>ImmediateAttackFriendly</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
@@ -1345,9 +1345,9 @@
<effects>
<li Class="WulaFallenEmpire.Effect_TriggerRaid">
<points>6000</points>
<faction>Empire</faction>
<faction>Wula_Progressive_Faction</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
@@ -1371,9 +1371,9 @@
<effects>
<li Class="WulaFallenEmpire.Effect_TriggerRaid">
<points>6000</points>
<faction>Empire</faction>
<faction>Wula_Progressive_Faction</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>
@@ -1397,9 +1397,9 @@
<effects>
<li Class="WulaFallenEmpire.Effect_TriggerRaid">
<points>3000</points>
<faction>Empire</faction>
<faction>Wula_Progressive_Faction</faction>
<raidStrategy>ImmediateAttack</raidStrategy>
<raidArrivalMode>EdgeDropGroups</raidArrivalMode>
<raidArrivalMode>WULA_EdgeTeleport</raidArrivalMode>
<groupKind>Combat</groupKind>
<pawnGroupMakers>
<li>

View File

@@ -42,14 +42,16 @@
<basicMemberKind>Wula_PawnKind</basicMemberKind>
<pawnSingular>乌拉帝国合成人</pawnSingular>
<pawnsPlural>乌拉帝国合成人</pawnsPlural>
<categoryTag>WulaPIALegion</categoryTag>
<generateNewLeaderFromMapMembersOnly>true</generateNewLeaderFromMapMembersOnly>
<leaderTitle>总控</leaderTitle>
<leaderForceGenerateNewPawn>true</leaderForceGenerateNewPawn>
<fixedName>乌拉帝国 行星封锁机关</fixedName>
<fixedLeaderKinds>
<li>WULA_Legion_PawnKind</li>
</fixedLeaderKinds>
<raidsForbidden>true</raidsForbidden>
<requiredCountAtGameStart>1</requiredCountAtGameStart>
<factionNameMaker>NamerFaction_Wula_PIA_Legion_Faction</factionNameMaker>
<factionIconPath>Wula/World/WorldObjects/Expanding/Wula_PIA_Legion_Faction</factionIconPath>
<settlementGenerationWeight>0</settlementGenerationWeight>
<maxConfigurableAtWorldCreation>1</maxConfigurableAtWorldCreation>
@@ -139,4 +141,70 @@
<li>Wula_Backstory_Categories</li>
</backstoryCategories>
</FactionDef>
<FactionDef ParentName="FactionBase">
<defName>Wula_Progressive_Faction</defName>
<label>乌拉帝国 进步派</label>
<description>乌拉帝国内部的分裂者,高举推翻皇室的旗帜,势力在各个乌拉帝国星域中快速蔓延。她们将异族和保皇派视为死敌,会毫不留情地攻击和其不属于同一个派系的乌拉帝国合成人。\n\n目前她们在边缘世界的活动较为隐秘但是可以肯定的是即使没有成建制的舰队擅长游击战的她们依然有和行星封锁机关平起平坐的能力。</description>
<pawnSingular>乌拉帝国合成人</pawnSingular>
<pawnsPlural>乌拉帝国合成人</pawnsPlural>
<categoryTag>wulaProgressive</categoryTag>
<requiredCountAtGameStart>1</requiredCountAtGameStart>
<maxConfigurableAtWorldCreation>1</maxConfigurableAtWorldCreation>
<configurationListOrderPriority>2000</configurationListOrderPriority>
<displayInFactionSelection>false</displayInFactionSelection>
<fixedName>乌拉帝国 进步派</fixedName>
<canGenerateQuestSites>false</canGenerateQuestSites>
<factionIconPath>Wula/World/WorldObjects/Expanding/WULA_Progressive_Faction</factionIconPath>
<techLevel>Spacer</techLevel>
<backstoryFilters>
<li>
<categories>
<li>Offworld</li>
</categories>
</li>
</backstoryFilters>
<hidden>true</hidden>
<rescueesCanJoin>true</rescueesCanJoin>
<autoFlee>false</autoFlee>
<apparelStuffFilter>
<thingDefs>
<li>Hyperweave</li>
<li>Plasteel</li>
</thingDefs>
</apparelStuffFilter>
<allowedMemes>
<li MayRequire="Ludeon.RimWorld.Ideology">Structure_Archist</li>
<li MayRequire="Ludeon.RimWorld.Ideology">Transhumanist</li>
<li MayRequire="Ludeon.RimWorld.Ideology">HumanPrimacy</li>
<li MayRequire="Ludeon.RimWorld.Ideology">Loyalist</li>
</allowedMemes>
<requiredMemes>
<li MayRequire="Ludeon.RimWorld.Ideology">Structure_Archist</li>
<li MayRequire="Ludeon.RimWorld.Ideology">Transhumanist</li>
<li MayRequire="Ludeon.RimWorld.Ideology">HumanPrimacy</li>
<li MayRequire="Ludeon.RimWorld.Ideology">Loyalist</li>
</requiredMemes>
<maxPawnCostPerTotalPointsCurve>
<points>
<li>(100,100)</li>
<li>(10000,10000)</li>
</points>
</maxPawnCostPerTotalPointsCurve>
<raidsForbidden>true</raidsForbidden>
<raidCommonalityFromPointsCurve>
<points>
<li>(0, 0)</li>
</points>
</raidCommonalityFromPointsCurve>
<pawnGroupMakers>
<li>
<kindDef>Combat</kindDef>
<commonality>100</commonality>
<options>
<WULA_Hostile_Progressive_Light_Unit>1</WULA_Hostile_Progressive_Light_Unit>
</options>
</li>
</pawnGroupMakers>
<permanentEnemy>true</permanentEnemy>
</FactionDef>
</Defs>

View File

@@ -659,7 +659,7 @@
</lifeStages>
<minGenerationAge>18</minGenerationAge>
<maxGenerationAge>20</maxGenerationAge>
<combatPower>250</combatPower>
<combatPower>200</combatPower>
<initialWillRange>10~20</initialWillRange>
<initialResistanceRange>10~20</initialResistanceRange>
<itemQuality>Poor</itemQuality>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<PawnsArrivalModeDef>
<defName>WULA_EdgeTeleport</defName>
<workerClass>WulaFallenEmpire.PawnsArrivalModeWorker_EdgeTeleport</workerClass>
<layerWhitelist>
<li>Surface</li>
<li MayRequire="Ludeon.RimWorld.Odyssey">Orbit</li>
</layerWhitelist>
<minSpaceSelectionWeight>0.1</minSpaceSelectionWeight>
<selectionWeightCurve> <!-- not usable in many strategies and by many factions, so this gets boosted -->
<points>
<li>(1, 0)</li>
<li>(999999, 0)</li>
</points>
</selectionWeightCurve>
<minTechLevel>Ultra</minTechLevel>
<textEnemy>一群来自 {1} 的 {0} 通过传送进入了地图!</textEnemy>
<textFriendly>一群来自 {1} 的 {0} 援军通过传送进入了地图!</textFriendly>
<textWillArrive>{0_pawnsPluralDef} 将通过传送进入地图</textWillArrive>
</PawnsArrivalModeDef>
</Defs>

View File

@@ -1,258 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<QuestScriptDef>
<defName>WULA_Attack_Robber_Camp</defName>
<rootSelectionWeight>0</rootSelectionWeight>
<expireDaysRange>1</expireDaysRange>
<autoAccept>false</autoAccept>
<sendAvailableLetter>true</sendAvailableLetter>
<isRootSpecial>true</isRootSpecial> <!-- 特殊任务 -->
<questNameRules>
<rulesStrings>
<li>questName->WULA_Attack_Robber_Camp_questName</li>
</rulesStrings>
</questNameRules>
<questDescriptionRules>
<rulesStrings>
<li>questDescription->WULA_Attack_Robber_Camp_questDescription</li>
</rulesStrings>
</questDescriptionRules>
<root Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_SubScript">
<def>Util_RandomizePointsChallengeRating</def>
<parms>
<pointsFactorTwoStar>1.5</pointsFactorTwoStar>
<pointsFactorThreeStar>2</pointsFactorThreeStar>
</parms>
</li>
<li Class="QuestNode_SubScript">
<def>Util_AdjustPointsForDistantFight</def>
</li>
<li Class="QuestNode_GetMap">
<canBeSpace>false</canBeSpace>
</li>
<li Class="QuestNode_GetFaction">
<storeAs>siteFaction</storeAs>
<allowEnemy>true</allowEnemy>
<mustBePermanentEnemy>true</mustBePermanentEnemy>
</li>
<li Class="QuestEditor_Library.QuestNode_RandomCustomMap">
<datas>
<li>
<key>WULA_Camp_Captured_By_Robber</key>
<value>1</value>
</li>
</datas>
<buffer>5</buffer>
<bufferMin>10</bufferMin>
<siteIconPath>Things/Building/Natural/Hive/HiveC</siteIconPath>
<expandingIconPath>Things/Building/Natural/Hive/HiveC</expandingIconPath>
<storeAs>site</storeAs>
<overrideFaction>$siteFaction</overrideFaction>
<distance>
<min>5</min>
<max>10</max>
</distance>
<blacklist />
</li>
<li Class="QuestNode_SubScript">
<def>Util_GetDefaultRewardValueFromPoints</def>
<parms>
<!-- Use the actual threat points generated (some site parts define a minimum threshold) -->
<points>$points</points>
</parms>
</li>
<!-- If we enter and leave, the map is destroyed. Fail the quest. -->
<li Class="QuestNode_Signal">
<inSignal>site.Destroyed</inSignal>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_Letter">
<label TKey="LetterLabelQuestFailed">Quest failed: [resolvedQuestName]</label>
<text TKey="LetterTextQuestFailed">After being discovered, the bandit camp has dispersed. The quest [resolvedQuestName] has ended.</text>
</li>
<li Class="QuestNode_End">
<outcome>Fail</outcome>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_Signal">
<inSignal>site.AllEnemiesDefeated</inSignal>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_Notify_PlayerRaidedSomeone">
<getRaidersFromMapParent>$site</getRaidersFromMapParent>
</li>
<li Class="QuestNode_GiveRewards">
<parms>
<allowGoodwill>true</allowGoodwill>
<allowRoyalFavor>true</allowRoyalFavor>
<chosenPawnSignal>ChosenPawnForReward</chosenPawnSignal>
</parms>
<addCampLootReward>true</addCampLootReward>
<customLetterLabel TKey="LetterLabelPaymentArrived">Payment arrived</customLetterLabel>
<customLetterText TKey="LetterTextPaymentArrived">You have defeated the bandit camp!\n\nThe payment from [asker_faction_name] has arrived.</customLetterText>
<nodeIfChosenPawnSignalUsed Class="QuestNode_Letter">
<letterDef>ChoosePawn</letterDef>
<label TKey="LetterLabelFavorReceiver">[asker_faction_royalFavorLabel]</label>
<text TKey="LetterTextFavorReceiver">These colonists participated in the victory for the quest [resolvedQuestName]. [asker_definite] wants to know who should receive the [royalFavorReward_amount] [asker_faction_royalFavorLabel] for this service.</text>
<useColonistsOnMap>$site</useColonistsOnMap>
<chosenPawnSignal>ChosenPawnForReward</chosenPawnSignal>
</nodeIfChosenPawnSignalUsed>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_End">
<inSignal>site.AllEnemiesDefeated</inSignal>
<outcome>Success</outcome>
</li>
</nodes>
</root>
</QuestScriptDef>
<QuestEditor_Library.CustomMapDataDef>
<defName>WULA_Camp_Captured_By_Robber</defName>
<label>被异族占据的哨站</label>
<size>(44, 1, 44)</size>
<isPart>true</isPart>
<commonality>0</commonality>
<faction>MapFaction</faction>
<pawns>
<li>
<key>(21, 0, 24)</key>
<value>
<li Class="QuestEditor_Library.PawnSpawnData_Faction">
<dataName>Robber</dataName>
<enableLord>true</enableLord>
<lordDataName>RobberGroup</lordDataName>
<faction>MapFaction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
<point>1000~2000</point>
</li>
</value>
</li>
</pawns>
<thingDatas>
<li>
<def>WULA_TransportPod</def>
<allRect>
<li>(24,20,24,20)</li>
<li>(24,23,24,23)</li>
</allRect>
</li>
<li>
<def>Brazier</def>
<stuff>Steel</stuff>
<position>(16,0,22)</position>
</li>
<li>
<def>Bedroll</def>
<stuff>Cloth</stuff>
<rotation>3</rotation>
<allRect>
<li>(23,14,23,16)</li>
</allRect>
</li>
<li>
<def>Wula_Fusion_Generators</def>
<storedEnergy>29.99023</storedEnergy>
<position>(30,0,27)</position>
</li>
<li>
<def>WULA_Wall_Flag_Building</def>
<allRect>
<li>(16,13,16,13)</li>
<li>(25,30,25,30)</li>
<li>(27,30,27,30)</li>
</allRect>
</li>
<li>
<def>WULA_Machine_Recharger</def>
<position>(14,0,16)</position>
</li>
<li>
<def>WulaWall</def>
<allRect>
<li>(12,14,16,14)</li>
<li>(12,15,12,18)</li>
<li>(11,18,11,18)</li>
<li>(10,20,10,21)</li>
<li>(9,21,9,27)</li>
<li>(20,12,22,12)</li>
<li>(22,13,23,13)</li>
<li>(25,13,29,13)</li>
<li>(10,27,11,27)</li>
<li>(11,28,11,29)</li>
<li>(12,29,12,29)</li>
<li>(29,14,30,14)</li>
<li>(30,15,31,16)</li>
<li>(14,32,14,35)</li>
<li>(31,17,31,21)</li>
<li>(33,16,35,16)</li>
<li>(15,35,21,35)</li>
<li>(35,17,35,18)</li>
<li>(21,33,24,33)</li>
<li>(24,31,25,31)</li>
<li>(21,34,21,34)</li>
<li>(24,32,24,32)</li>
<li>(36,18,37,18)</li>
<li>(32,25,34,25)</li>
<li>(27,31,27,32)</li>
<li>(32,26,32,29)</li>
<li>(37,19,37,22)</li>
<li>(34,24,34,24)</li>
<li>(31,29,31,32)</li>
<li>(28,32,30,32)</li>
</allRect>
</li>
<li>
<def>WulaDoor</def>
<allRect>
<li>(32,16,32,16)</li>
<li>(26,31,26,31)</li>
</allRect>
</li>
<li>
<def>Wula_Sonar_Mine</def>
<allRect>
<li>(10,22,10,22)</li>
<li>(28,14,28,14)</li>
<li>(30,31,30,31)</li>
</allRect>
</li>
<li>
<def>Bedroll</def>
<stuff>Cloth</stuff>
<rotation>1</rotation>
<allRect>
<li>(10,24,10,26)</li>
</allRect>
</li>
<li>
<def>WulaShelter</def>
<allRect>
<li>(12,6,15,6)</li>
<li>(9,10,12,10)</li>
<li>(12,7,12,9)</li>
<li>(7,32,7,36)</li>
<li>(34,9,38,9)</li>
<li>(8,36,10,36)</li>
<li>(38,10,38,12)</li>
<li>(35,35,38,35)</li>
<li>(38,32,38,34)</li>
</allRect>
</li>
</thingDatas>
</QuestEditor_Library.CustomMapDataDef>
</Defs>

View File

@@ -97,10 +97,10 @@
</datas>
<buffer>5</buffer>
<bufferMin>10</bufferMin>
<siteIconPath>Things/Building/Natural/Hive/HiveC</siteIconPath>
<expandingIconPath>Things/Building/Natural/Hive/HiveC</expandingIconPath>
<siteIconPath>Wula/World/WorldObjects/Expanding/WULA_Progressive_Faction</siteIconPath>
<expandingIconPath>Wula/World/WorldObjects/Expanding/WULA_Progressive_Faction</expandingIconPath>
<storeAs>site</storeAs>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<disdestroyBecauseOfNoColonist>true</disdestroyBecauseOfNoColonist>
<distance>
<min>5</min>
@@ -177,7 +177,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Sniper_Cat_Group</lordDataName>
<count>2~3</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -192,7 +192,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Sniper_Cat_Group</lordDataName>
<count>2~3</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -207,7 +207,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Sniper_Cat_Group</lordDataName>
<count>2~3</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -222,7 +222,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Sniper_Cat_Group</lordDataName>
<count>2~3</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -237,7 +237,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Hostile_Group</lordDataName>
<count>3~4</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -252,7 +252,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Hostile_Group</lordDataName>
<count>3~4</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -267,7 +267,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Hostile_Group</lordDataName>
<count>3~4</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -282,7 +282,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Hostile_Group</lordDataName>
<count>3~4</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -336,7 +336,7 @@
<thingDatas>
<li>
<def>WulaShelter</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(10,10,14,10)</li>
<li>(10,11,10,14)</li>
@@ -484,7 +484,7 @@
</li>
<li>
<def>WulaWall</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(17,17,26,17)</li>
<li>(17,18,17,26)</li>
@@ -607,7 +607,7 @@
</li>
<li>
<def>WulaDoor</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(21,26,21,26)</li>
<li>(35,19,35,19)</li>
@@ -630,7 +630,7 @@
<li>
<def>WulaDoor</def>
<rotation>1</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(26,21,26,21)</li>
<li>(19,35,19,35)</li>
@@ -652,7 +652,7 @@
</li>
<li>
<def>FloodLight</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(14,14,14,14)</li>
<li>(16,35,16,35)</li>
@@ -670,7 +670,7 @@
</li>
<li>
<def>WULA_Cat_Bunker</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(12,12,12,12)</li>
<li>(12,24,12,24)</li>
@@ -696,7 +696,7 @@
</li>
<li>
<def>Wula_Base_Laser_Turret</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(18,14,18,14)</li>
<li>(14,18,14,18)</li>
@@ -734,7 +734,7 @@
</li>
<li>
<def>Wula_Base_ATGun_Turret</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(32,13,32,13)</li>
<li>(13,32,13,32)</li>
@@ -748,7 +748,7 @@
</li>
<li>
<def>Wula_Base_Mortar_Turret</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(20,20,20,20)</li>
<li>(20,23,20,23)</li>
@@ -770,7 +770,7 @@
</li>
<li>
<def>WULA_MechAssembler</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(38,38,38,38)</li>
<li>(41,38,41,38)</li>
@@ -780,7 +780,7 @@
</li>
<li>
<def>WULA_MechAssembler_Huge</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(39,34,39,34)</li>
<li>(34,39,34,39)</li>
@@ -790,7 +790,7 @@
</li>
<li>
<def>Wula_DarkEnergy_Generators</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<storedEnergy>2</storedEnergy>
<allRect>
<li>(25,32,25,32)</li>
@@ -805,7 +805,7 @@
</li>
<li>
<def>Wula_Disturber_Turret</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(32,32,32,32)</li>
<li>(32,47,32,47)</li>

View File

@@ -3,7 +3,7 @@
<IncidentDef>
<defName>WULA_GiveQuest_Progressive_Ship_Attack_Quest</defName>
<category>GiveQuest</category>
<label>突击舰队攻击</label>
<label>进步派攻击</label>
<targetTags>
<li>Map_PlayerHome</li>
</targetTags>
@@ -43,6 +43,34 @@
<!-- 随机 -->
<li Class="QuestNode_RandomNode">
<nodes>
<!-- 游击队 -->
<li Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_ResolveQuestName">
<rules>
<rulesStrings>
<li>questName->叛军游击队</li>
</rulesStrings>
</rules>
</li>
<li Class="QuestNode_ResolveQuestDescription">
<rules>
<rulesStrings>
<li>questDescription->一群乌拉帝国进步派的游击队攻击了你的殖民地!</li>
</rulesStrings>
</rules>
</li>
<li Class="QuestNode_RandomRaid">
<faction>Wula_Progressive_Faction</faction>
<useCurrentThreatPoints>true</useCurrentThreatPoints>
<currentThreatPointsFactor>2</currentThreatPointsFactor>
<arrivalMode>WULA_EdgeTeleport</arrivalMode>
<customLetterLabel TKey="LetterLabelChasing">乌拉帝国 进步派的游击队</customLetterLabel>
<customLetterText TKey="LetterTextChasing">一群乌拉帝国进步派的游击队正在攻击你的殖民地!</customLetterText>
</li>
</nodes>
</li>
<!-- 突击舰 -->
<li Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_ResolveQuestName">
@@ -66,7 +94,7 @@
</li>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mini_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -79,7 +107,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mini_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>4</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -95,7 +123,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>2</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -107,12 +135,11 @@
<value1>$points</value1>
<value2>5999</value2>
<!-- Lodgers arrive by shuttle -->
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mid_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -125,7 +152,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>3</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -139,13 +166,12 @@
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>7999</value2>
<!-- Lodgers arrive by shuttle -->
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mid_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -158,7 +184,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>3</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -172,13 +198,12 @@
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>9999</value2>
<!-- Lodgers arrive by shuttle -->
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mid_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -191,7 +216,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>2</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -206,19 +231,18 @@
<value1>$points</value1>
<value2>12999</value2>
<!-- Lodgers arrive by shuttle -->
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mini_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>4</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mid_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -231,7 +255,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>3</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -245,20 +269,19 @@
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>15999</value2>
<!-- Lodgers arrive by shuttle -->
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mini_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>4</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Mid_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -271,7 +294,7 @@
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>WULA_Progressive_Ship_Small_Beacon_Cleanzone</thingDef>
<faction>Wula_PIA_Legion_Faction</faction>
<faction>Wula_Progressive_Faction</faction>
<spawnCount>3</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
@@ -284,10 +307,90 @@
</li>
</nodes>
</li>
<!-- 猫猫特战 -->
<li Class="QuestNode_Sequence">
<nodes>
<li Class="QuestNode_ResolveQuestName">
<rules>
<rulesStrings>
<li>questName->微型空投舱</li>
</rulesStrings>
</rules>
</li>
<li Class="QuestNode_ResolveQuestDescription">
<rules>
<rulesStrings>
<li>questDescription->几个可疑的黑点落到了殖民地附近···</li>
</rulesStrings>
</rules>
</li>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>Mech_WULA_Cat_Cloak_Sniper_Incoming</thingDef>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>2999</value2>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>Mech_WULA_Cat_Cloak_Sniper_Incoming</thingDef>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>5999</value2>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>Mech_WULA_Cat_Cloak_Sniper_Incoming</thingDef>
<spawnCount>1</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
</nodes>
</node>
</li>
<li Class="QuestNode_Greater">
<value1>$points</value1>
<value2>9999</value2>
<node Class="QuestNode_Sequence">
<nodes>
<li Class="WulaFallenEmpire.QuestNode_SpawnPrefabSkyfallerCaller">
<thingDef>Mech_WULA_Cat_Cloak_Sniper_Incoming</thingDef>
<spawnCount>2</spawnCount>
<sendMessageOnSuccess>false</sendMessageOnSuccess>
<sendMessageOnFailure>false</sendMessageOnFailure>
</li>
</nodes>
</node>
</li>
</nodes>
</li>
</nodes>
</li>
<li Class="QuestNode_ChangeFactionGoodwill">
<faction>Wula_PIA_Legion_Faction</faction>
<change>10</change>
<reason>WULA_Attack_Progressive</reason>
</li>
<li Class="QuestNode_End" />
</nodes>
</root>
</QuestScriptDef>
<HistoryEventDef>
<defName>WULA_Attack_Progressive</defName>
<label>对抗乌拉帝国叛军</label>
</HistoryEventDef>
</Defs>

View File

@@ -578,7 +578,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -593,7 +593,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -608,7 +608,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -623,7 +623,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -638,7 +638,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -653,7 +653,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -668,7 +668,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -683,7 +683,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -698,7 +698,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -713,7 +713,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -728,7 +728,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -743,7 +743,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -758,7 +758,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -773,7 +773,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -788,7 +788,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -803,7 +803,7 @@
<enableLord>true</enableLord>
<lordDataName>WULA_Defender_Group</lordDataName>
<count>1</count>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<duty>DefendBase</duty>
<spawnType>MapGeneration</spawnType>
</li>
@@ -839,12 +839,12 @@
<thingDatas>
<li>
<def>WULA_Machine_Recharger</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<position>(21,0,23)</position>
</li>
<li>
<def>WULA_Charging_Station_Synth</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(20,19,20,19)</li>
<li>(22,19,22,19)</li>
@@ -852,7 +852,7 @@
</li>
<li>
<def>WulaWall</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(17,10,24,10)</li>
<li>(15,13,19,13)</li>
@@ -899,26 +899,26 @@
<li>
<def>Table1x2c</def>
<stuff>WULA_Alloy</stuff>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<position>(18,0,21)</position>
</li>
<li>
<def>DiningChair</def>
<stuff>Uranium</stuff>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<position>(18,0,20)</position>
</li>
<li>
<def>DiningChair</def>
<stuff>Uranium</stuff>
<rotation>2</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<position>(18,0,23)</position>
</li>
<li>
<def>WULA_Wall_Flag_Building</def>
<rotation>3</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(25,20,25,20)</li>
<li>(25,23,25,23)</li>
@@ -926,7 +926,7 @@
</li>
<li>
<def>HiddenConduit</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(19,17,19,17)</li>
<li>(16,20,16,20)</li>
@@ -940,7 +940,7 @@
</li>
<li>
<def>WULA_Wall_Flag_Building</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(19,17,19,17)</li>
<li>(22,17,22,17)</li>
@@ -949,7 +949,7 @@
<li>
<def>Sandbags</def>
<stuff>Cloth</stuff>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(7,8,10,8)</li>
<li>(7,9,7,11)</li>
@@ -972,7 +972,7 @@
<li>
<def>WULA_Wall_Flag_Building</def>
<rotation>2</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(19,26,19,26)</li>
<li>(22,26,22,26)</li>
@@ -981,7 +981,7 @@
<li>
<def>WULA_Wall_Flag_Building</def>
<rotation>1</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(16,20,16,20)</li>
<li>(16,23,16,23)</li>
@@ -989,7 +989,7 @@
</li>
<li>
<def>Wula_Fusion_Generators</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<storedEnergy>29.432827</storedEnergy>
<allRect>
<li>(17,15,17,15)</li>
@@ -1005,7 +1005,7 @@
<li>
<def>Turret_MiniTurret</def>
<stuff>Steel</stuff>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<storedEnergy>60</storedEnergy>
<allRect>
<li>(16,17,16,17)</li>
@@ -1016,7 +1016,7 @@
</li>
<li>
<def>Wula_Base_Laser_Turret</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(13,14,13,14)</li>
<li>(28,14,28,14)</li>
@@ -1026,7 +1026,7 @@
</li>
<li>
<def>TrapIED_Incendiary</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(18,12,18,12)</li>
<li>(11,19,11,19)</li>
@@ -1040,7 +1040,7 @@
</li>
<li>
<def>WulaDoor</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(11,18,11,18)</li>
<li>(11,25,11,25)</li>
@@ -1051,7 +1051,7 @@
<li>
<def>WulaDoor</def>
<rotation>1</rotation>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(17,12,17,12)</li>
<li>(24,12,24,12)</li>
@@ -1061,7 +1061,7 @@
</li>
<li>
<def>WULA_Cat_Bunker</def>
<faction>AncientsHostile</faction>
<faction>Wula_Progressive_Faction</faction>
<allRect>
<li>(9,10,9,10)</li>
<li>(32,10,32,10)</li>

View File

@@ -63,7 +63,7 @@
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>0</techprintMarketValue>
<heldByFactionCategoryTags>
<li>Wula_PIA_Legion_Faction</li>
<li>WulaPIALegion</li>
</heldByFactionCategoryTags>
<prerequisites>
<li>Electricity</li>
@@ -125,7 +125,7 @@
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>0</techprintMarketValue>
<heldByFactionCategoryTags>
<li>Wula_PIA_Legion_Faction</li>
<li>WulaPIALegion</li>
</heldByFactionCategoryTags>
<prerequisites>
<li>WULA_Colony_License_LV1_Technology</li>
@@ -187,7 +187,7 @@
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>0</techprintMarketValue>
<heldByFactionCategoryTags>
<li>Wula_PIA_Legion_Faction</li>
<li>WulaPIALegion</li>
</heldByFactionCategoryTags>
<prerequisites>
<li>Fabrication</li>
@@ -472,7 +472,7 @@
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>0</techprintMarketValue>
<heldByFactionCategoryTags>
<li>Wula_PIA_Legion_Faction</li>
<li>WulaPIALegion</li>
</heldByFactionCategoryTags>
</ResearchProjectDef>
<!-- 防御 -->
@@ -529,7 +529,7 @@
<techprintCommonality>0</techprintCommonality>
<techprintMarketValue>0</techprintMarketValue>
<heldByFactionCategoryTags>
<li>Wula_PIA_Legion_Faction</li>
<li>WulaPIALegion</li>
</heldByFactionCategoryTags>
</ResearchProjectDef>

View File

@@ -571,4 +571,106 @@
</li>
</comps>
</ThingDef>
<!-- 特战猫猫(非玩家用) -->
<ThingDef ParentName="BuildingBase">
<defName>Mech_WULA_Cat_Cloak_Sniper_Cleanzone</defName>
<label>奇怪的空投区</label>
<description>奇怪的空投区</description>
<minifiedDef>MinifiedThing</minifiedDef>
<tickerType>Normal</tickerType>
<tradeability>None</tradeability>
<thingCategories Inherit="False">
<li>BuildingsMisc</li>
</thingCategories>
<graphicData>
<texPath>Wula/Building/WULA_Dropping_Building_Cleanzone</texPath>
<graphicClass>Graphic_Multi</graphicClass>
<drawSize>(1,1)</drawSize>
<damageData>
<enabled>false</enabled>
</damageData>
</graphicData>
<costList Inherit="False">
<WULA_Alloy>4</WULA_Alloy>
</costList>
<altitudeLayer>Building</altitudeLayer>
<passability>PassThroughOnly</passability>
<castEdgeShadows>false</castEdgeShadows>
<fillPercent>0.5</fillPercent>
<canOverlapZones>false</canOverlapZones>
<pathCost>0</pathCost>
<hasInteractionCell>false</hasInteractionCell>
<rotatable>false</rotatable>
<statBases>
<MarketValue>0</MarketValue>
<MaxHitPoints>1</MaxHitPoints>
<WorkToBuild>0</WorkToBuild>
<Mass>1</Mass>
<Flammability>0</Flammability>
</statBases>
<size>(1,1)</size>
<constructionSkillPrerequisite>0</constructionSkillPrerequisite>
<resourcesFractionWhenDeconstructed>0</resourcesFractionWhenDeconstructed>
<building>
<destroySound>BuildingDestroyed_Metal_Small</destroySound>
</building>
<placeWorkers>
<li>WulaFallenEmpire.PlaceWorker_CustomRadius</li>
</placeWorkers>
<comps>
<li Class="WulaFallenEmpire.CompProperties_SkyfallerCaller">
<skyfallerDef>Mech_WULA_Cat_Cloak_Sniper_Incoming</skyfallerDef> <!-- 替换为您想要的Skyfaller类型 -->
<destroyBuilding>true</destroyBuilding>
<delayTicks>1</delayTicks>
<allowThinRoof>true</allowThinRoof>
<allowThickRoof>false</allowThickRoof>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="SkyfallerBase">
<defName>Mech_WULA_Cat_Cloak_Sniper_Incoming</defName>
<label>奇怪的空投舱(空投中)</label>
<size>(1,1)</size>
<thingClass>WulaFallenEmpire.Skyfaller_PawnSpawner</thingClass>
<graphicData>
<texPath>Wula/Building/WULA_DropPod/WULA_DropPod_Incoming</texPath>
<graphicClass>Graphic_Single</graphicClass>
<shaderType>CutoutFlying</shaderType>
<drawSize>1</drawSize>
</graphicData>
<skyfaller>
<movementType>Accelerate</movementType>
<shadow>Things/Skyfaller/SkyfallerShadowDropPod</shadow>
<shadowSize>(1, 1)</shadowSize>
<anticipationSoundTicks>100</anticipationSoundTicks>
<motesPerCell>0</motesPerCell>
<anticipationSound>DropPod_Fall_Mechanoid</anticipationSound>
<impactSound>DropPod_Impact</impactSound>
<cameraShake>0.1</cameraShake>
<rotationCurve>
<points>
<li>(0,0)</li>
<li>(1, 1)</li>
</points>
</rotationCurve>
<angleCurve>
<points>
<li>(0,0)</li>
<li>(1, 1)</li>
</points>
</angleCurve>
</skyfaller>
<comps>
<li Class="CompProperties_Effecter">
<effecterDef>Smoke_Joint</effecterDef>
</li>
<li Class="WulaFallenEmpire.CompProperties_SkyfallerPawnSpawner">
<pawnKind>Mech_WULA_Cat_Cloak_Sniper</pawnKind>
<faction>Wula_Progressive_Faction</faction>
<spawnDrafted>false</spawnDrafted>
<spawnHostile>true</spawnHostile>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -674,7 +674,7 @@
<effecterDef>Smoke_Joint</effecterDef>
</li>
<li Class="WulaFallenEmpire.CompProperties_SkyfallerFaction">
<factionDef>AncientsHostile</factionDef>
<factionDef>Wula_Progressive_Faction</factionDef>
</li>
</comps>
</ThingDef>
@@ -797,7 +797,7 @@
<effecterDef>Smoke_Joint</effecterDef>
</li>
<li Class="WulaFallenEmpire.CompProperties_SkyfallerFaction">
<factionDef>AncientsHostile</factionDef>
<factionDef>Wula_Progressive_Faction</factionDef>
</li>
</comps>
</ThingDef>
@@ -920,7 +920,7 @@
<effecterDef>Smoke_Joint</effecterDef>
</li>
<li Class="WulaFallenEmpire.CompProperties_SkyfallerFaction">
<factionDef>AncientsHostile</factionDef>
<factionDef>Wula_Progressive_Faction</factionDef>
</li>
</comps>
</ThingDef>

View File

@@ -1031,11 +1031,28 @@
<!-- <WorkSpeedGlobal>2</WorkSpeedGlobal> -->
<MoveSpeed>6</MoveSpeed>
</statBases>
<tools Inherit="False">
<li>
<label>猫爪刀</label>
<capacities>
<li>Cut</li>
</capacities>
<power>30</power>
<cooldownTime>1.5</cooldownTime>
<linkedBodyPartsGroup>Torso</linkedBodyPartsGroup>
<ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable>
</li>
</tools>
<comps>
<li Class="WulaFallenEmpire.CompProperties_FighterInvisible">
<InvisibilityDef>WULA_Cat_Invisibility</InvisibilityDef>
<stealthCooldownTicks>120</stealthCooldownTicks>
<revealOnEnemyInSight>true</revealOnEnemyInSight>
<sendLetterOnReveal>true</sendLetterOnReveal>
<letterTitle>狙!击!手!</letterTitle>
<letterText>附近有狙击手,快寻找掩体!</letterText>
</li>
<li Class="WulaFallenEmpire.CompProperties_HediffGiver">
<hediffs>
@@ -1044,6 +1061,15 @@
<addChance>1.0</addChance>
<allowDuplicates>false</allowDuplicates>
</li>
<li Class="CompProperties_Stunnable">
<affectedDamageDefs>
<li>Stun</li>
<li>EMP</li>
</affectedDamageDefs>
<adaptableDamageDefs>
<li>EMP</li>
</adaptableDamageDefs>
</li>
</comps>
</AlienRace.ThingDef_AlienRace>

View File

@@ -4,16 +4,6 @@
<defName>WULA_AutonomousMech</defName>
<thinkRoot Class="ThinkNode_Priority">
<subNodes>
<li Class="ThinkNode_ConditionalPawnKind">
<pawnKind>Mech_WULA_Cat_Cloak_Sniper</pawnKind>
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>500</targetAcquireRadius>
<targetKeepRadius>500</targetKeepRadius>
</li>
</subNodes>
</li>
<!-- Despawned -->
<li Class="ThinkNode_Subtree">
<treeDef>Despawned</treeDef>
@@ -31,6 +21,21 @@
<treeDef>Downed</treeDef>
</li>
<!-- 特战猫猫的思考树 -->
<li Class="ThinkNode_ConditionalPawnKind">
<pawnKind>Mech_WULA_Cat_Cloak_Sniper</pawnKind>
<subNodes>
<li Class="JobGiver_AIFightEnemies">
<targetAcquireRadius>500</targetAcquireRadius>
<targetKeepRadius>500</targetKeepRadius>
</li>
<li Class="JobGiver_WanderAnywhere">
<maxDanger>Deadly</maxDanger>
</li>
</subNodes>
</li>
<!-- 紧急能量状态:临界能量时立即寻找充电站 -->
<li Class="WulaFallenEmpire.ThinkNode_ConditionalEmergencyRecharge">
<emergencyThreshold>0.05</emergencyThreshold>

View File

@@ -43,4 +43,28 @@
</li>
</value>
</Operation>
<!-- 乌拉族进步派袭击 -->
<Operation Class="PatchOperationAdd">
<xpath>Defs/StorytellerDef[@Name="BaseStoryteller"]/comps</xpath>
<value>
<li Class="WulaFallenEmpire.StorytellerCompProperties_SimpleTechnologyTrigger">
<technology>WULA_Colony_License_LV3_Technology</technology>
<!-- 时间配置 -->
<fireAfterDaysPassed>0</fireAfterDaysPassed>
<checkIntervalDays>20</checkIntervalDays>
<!-- 可选配置 -->
<preventDuplicateQuests>false</preventDuplicateQuests>
<debugLogging>false</debugLogging>
<requireNonHostileRelation>true</requireNonHostileRelation>
<requiredFaction>Wula_PIA_Legion_Faction</requiredFaction>
<incident>WULA_GiveQuest_Progressive_Ship_Attack_Quest</incident>
<incidentIfHostile>WULA_GiveQuest_Progressive_Ship_Attack_Quest</incidentIfHostile>
</li>
</value>
</Operation>
</Patch>

View File

@@ -15,9 +15,10 @@ namespace WulaFallenEmpire
// 图形缓存 - 现在包含Shader信息
private Dictionary<string, Graphic> graphicsCache = new Dictionary<string, Graphic>();
// 动画状态 - 每个图层的独立浮动
// 动画状态 - 每个图层的独立状态
private Dictionary<int, float> layerHoverOffsets = new Dictionary<int, float>();
private Dictionary<int, float> layerAnimationTimes = new Dictionary<int, float>();
private Dictionary<int, float> layerRotationAngles = new Dictionary<int, float>();
private int lastTick = -1;
public ExtraGraphicsExtension ModExtension
@@ -122,8 +123,8 @@ namespace WulaFallenEmpire
{
// 不调用基类的 DrawAt完全自定义渲染
// 更新悬浮动画
UpdateHoverAnimation();
// 更新动画状态
UpdateAnimations();
// 绘制所有配置的图形层
DrawGraphicLayers(drawLoc, flip);
// 新增:绘制护盾
@@ -152,7 +153,7 @@ namespace WulaFallenEmpire
}
}
// 绘制单个图形层
// 绘制单个图形层 - 现在支持旋转动画
private void DrawGraphicLayer(Vector3 baseDrawPos, bool flip, GraphicLayerData layer)
{
if (string.IsNullOrEmpty(layer.texturePath))
@@ -167,27 +168,89 @@ namespace WulaFallenEmpire
// 获取图形现在传入Shader
Graphic graphic = GetCachedGraphic(layer.texturePath, layer.scale, layer.color, shader);
// 计算图层动偏移
float hoverOffset = 0f;
if (layer.enableHover)
// 计算图层动偏移
Vector3 animationOffset = Vector3.zero;
float rotationAngle = 0f;
int layerIndex = ModExtension.graphicLayers.IndexOf(layer);
// 根据动画类型应用不同的动画效果
switch (layer.animationType)
{
int layerIndex = ModExtension.graphicLayers.IndexOf(layer);
if (layerHoverOffsets.ContainsKey(layerIndex))
{
hoverOffset = layerHoverOffsets[layerIndex];
}
case AnimationType.Hover:
if (layer.enableAnimation && layerHoverOffsets.ContainsKey(layerIndex))
{
animationOffset.z = layerHoverOffsets[layerIndex];
}
break;
case AnimationType.Rotate:
if (layer.enableAnimation && layerRotationAngles.ContainsKey(layerIndex))
{
rotationAngle = layerRotationAngles[layerIndex];
}
break;
}
// 最终绘制位置 = 基础位置 + 图层偏移 + 动偏移
Vector3 drawPos = baseDrawPos + layer.offset;
drawPos.z += hoverOffset;
// 绘制图形
graphic.Draw(drawPos, flip ? base.Rotation.Opposite : base.Rotation, this, 0f);
// 最终绘制位置 = 基础位置 + 图层偏移 + 动偏移
Vector3 drawPos = baseDrawPos + layer.offset + animationOffset;
// 如果启用了旋转动画,使用矩阵变换绘制
if (layer.animationType == AnimationType.Rotate && layer.enableAnimation && rotationAngle != 0f)
{
DrawWithRotation(graphic, drawPos, flip, rotationAngle, layer);
}
else
{
// 普通绘制
graphic.Draw(drawPos, flip ? base.Rotation.Opposite : base.Rotation, this, 0f);
}
}
// 更新每个图层的独立悬浮动画
private void UpdateHoverAnimation()
// 使用矩阵变换绘制旋转图形
private void DrawWithRotation(Graphic graphic, Vector3 drawPos, bool flip, float rotationAngle, GraphicLayerData layer)
{
try
{
// 获取网格和材质
Mesh mesh = graphic.MeshAt(flip ? base.Rotation.Opposite : base.Rotation);
Material mat = graphic.MatAt(flip ? base.Rotation.Opposite : base.Rotation);
if (mesh == null || mat == null)
{
Log.Warning($"Building_ExtraGraphics: Unable to get mesh or material for rotating layer");
return;
}
// 创建旋转矩阵
Quaternion rotation = Quaternion.Euler(0f, 0f, rotationAngle);
// 如果图层有旋转中心偏移,需要调整位置
Vector3 pivotOffset = new Vector3(layer.pivotOffset.x, layer.pivotOffset.y, 0f);
// 计算最终矩阵
Matrix4x4 matrix = Matrix4x4.TRS(
drawPos + pivotOffset, // 位置
rotation, // 旋转
new Vector3(layer.scale.x, layer.scale.y, 1f) // 缩放
);
// 绘制网格
Graphics.DrawMesh(mesh, matrix, mat, 0);
// 如果需要,绘制第二面(双面渲染)
if (layer.doubleSided)
{
Graphics.DrawMesh(mesh, matrix, mat, 0, null, 0, null, UnityEngine.Rendering.ShadowCastingMode.Off, true);
}
}
catch (Exception ex)
{
Log.Error($"Building_ExtraGraphics: Error drawing rotating layer: {ex}");
}
}
// 更新所有图层的动画状态
private void UpdateAnimations()
{
int currentTick = Find.TickManager.TicksGame;
@@ -198,23 +261,47 @@ namespace WulaFallenEmpire
{
var layer = ModExtension.graphicLayers[i];
if (layer.enableHover)
if (!layer.enableAnimation)
continue;
// 初始化动画时间
if (!layerAnimationTimes.ContainsKey(i))
{
// 初始化动画时间
if (!layerAnimationTimes.ContainsKey(i))
{
layerAnimationTimes[i] = 0f;
}
// 更新动画时间
layerAnimationTimes[i] += Time.deltaTime;
// 计算该图层的悬浮偏移
float hoverSpeed = layer.hoverSpeed > 0 ? layer.hoverSpeed : ModExtension.globalHoverSpeed;
float hoverIntensity = layer.hoverIntensity > 0 ? layer.hoverIntensity : ModExtension.globalHoverIntensity;
float hoverOffset = Mathf.Sin(layerAnimationTimes[i] * hoverSpeed + layer.hoverPhase) * hoverIntensity;
layerHoverOffsets[i] = hoverOffset;
layerAnimationTimes[i] = layer.animationStartTime;
}
// 更新动画时间
layerAnimationTimes[i] += Time.deltaTime;
// 根据动画类型更新不同的状态
switch (layer.animationType)
{
case AnimationType.Hover:
// 计算该图层的悬浮偏移
float hoverSpeed = layer.animationSpeed > 0 ? layer.animationSpeed : ModExtension.globalAnimationSpeed;
float hoverIntensity = layer.animationIntensity > 0 ? layer.animationIntensity : ModExtension.globalAnimationIntensity;
float hoverOffset = Mathf.Sin(layerAnimationTimes[i] * hoverSpeed + layer.animationPhase) * hoverIntensity;
layerHoverOffsets[i] = hoverOffset;
break;
case AnimationType.Rotate:
// 计算该图层的旋转角度
float rotateSpeed = layer.animationSpeed > 0 ? layer.animationSpeed : ModExtension.globalAnimationSpeed;
float maxAngle = layer.animationIntensity > 0 ? layer.animationIntensity : ModExtension.globalAnimationIntensity;
// 旋转角度(循环)
float rotationAngle = (layerAnimationTimes[i] * rotateSpeed * 360f) % 360f;
// 限制旋转角度范围(如果设置了最大角度)
if (maxAngle > 0 && maxAngle < 360f)
{
// 使用正弦波限制旋转角度范围
rotationAngle = Mathf.Sin(layerAnimationTimes[i] * rotateSpeed) * maxAngle;
}
layerRotationAngles[i] = rotationAngle;
break;
}
}
@@ -230,12 +317,20 @@ namespace WulaFallenEmpire
}
}
// 动画类型枚举
public enum AnimationType
{
None, // 无动画
Hover, // 上下浮动
Rotate // 自旋转
}
// 主要的 ModExtension 定义
public class ExtraGraphicsExtension : DefModExtension
{
// 全局悬浮参数(作为默认值)
public float globalHoverSpeed = 2f; // 全局悬浮速度
public float globalHoverIntensity = 0.1f; // 全局悬浮强度
// 全局动画参数(作为默认值)
public float globalAnimationSpeed = 2f; // 全局动画速度
public float globalAnimationIntensity = 0.1f; // 全局动画强度
// 图形层配置
public List<GraphicLayerData> graphicLayers = new List<GraphicLayerData>();
@@ -250,7 +345,7 @@ namespace WulaFallenEmpire
}
}
// 单个图形层的配置数据 - 添加shaderName字段
// 单个图形层的配置数据 - 增强版
public class GraphicLayerData
{
// 基础配置
@@ -258,16 +353,56 @@ namespace WulaFallenEmpire
public Vector2 scale = Vector2.one; // 缩放比例
public Color color = Color.white; // 颜色
public int drawOrder = 0; // 绘制顺序(数字小的先绘制)
public string shaderName = "TransparentPostLight"; // Shader名称(新增)
public string shaderName = "TransparentPostLight"; // Shader名称
// 位置配置 - 使用环世界坐标系
// X: 左右偏移, Y: 图层深度, Z: 上下偏移
public Vector3 offset = Vector3.zero;
// 独立悬浮配置
public bool enableHover = true; // 是否启用悬浮
public float hoverSpeed = 0f; // 悬浮速度0表示使用全局速度
public float hoverIntensity = 0f; // 悬浮强0表示使用全局度)
public float hoverPhase = 0f; // 悬浮相位(用于错开浮动
// 动画配置
public AnimationType animationType = AnimationType.Hover; // 动画类型
public bool enableAnimation = true; // 是否启用动画
public float animationSpeed = 0f; // 动画速0表示使用全局度)
public float animationIntensity = 0f; // 动画强度0表示使用全局强度
public float animationPhase = 0f; // 动画相位(用于错开动画)
public float animationStartTime = 0f; // 动画开始时间偏移
// 旋转动画专用配置
public Vector2 pivotOffset = Vector2.zero; // 旋转中心偏移(相对于图层的中心)
public bool doubleSided = false; // 是否双面渲染(对于旋转物体)
// 兼容旧字段(为了向后兼容)
[Obsolete("Use enableAnimation instead")]
public bool enableHover
{
get => enableAnimation && animationType == AnimationType.Hover;
set
{
enableAnimation = value;
if (value && animationType == AnimationType.None)
animationType = AnimationType.Hover;
}
}
[Obsolete("Use animationSpeed instead")]
public float hoverSpeed
{
get => animationSpeed;
set => animationSpeed = value;
}
[Obsolete("Use animationIntensity instead")]
public float hoverIntensity
{
get => animationIntensity;
set => animationIntensity = value;
}
[Obsolete("Use animationPhase instead")]
public float hoverPhase
{
get => animationPhase;
set => animationPhase = value;
}
}
}

View File

@@ -201,15 +201,22 @@ namespace WulaFallenEmpire
{
if (MechPawn == null || !CanBeAutonomous)
yield break;
// 工作模式切换按钮
if (CanWorkAutonomously)
{
yield return new DroneGizmo(this);
DroneGizmo droneGizmo = new DroneGizmo(this);
if (droneGizmo != null)
{
yield return droneGizmo;
}
}
// 更换武器按钮 - 确保不返回null
Gizmo weaponSwitchGizmo = CreateWeaponSwitchGizmo();
if (weaponSwitchGizmo != null)
{
yield return weaponSwitchGizmo;
}
// 更换武器按钮
yield return CreateWeaponSwitchGizmo();
}
/// <summary>
@@ -217,20 +224,43 @@ namespace WulaFallenEmpire
/// </summary>
private Gizmo CreateWeaponSwitchGizmo()
{
// 检查Pawn是否属于玩家派系
if (MechPawn?.Faction != Faction.OfPlayer)
try
{
return null; // 非玩家派系时不显示
// 检查Pawn是否属于玩家派系
if (MechPawn?.Faction != Faction.OfPlayer)
{
return null; // 非玩家派系时不显示
}
// 检查Pawn是否有效
if (MechPawn == null || MechPawn.Dead || MechPawn.Destroyed)
{
return null;
}
// 检查equipment是否有效
if (MechPawn.equipment == null)
{
return null;
}
Command_Action switchWeaponCommand = new Command_Action
{
defaultLabel = "WULA_SwitchWeapon".Translate(),
defaultDesc = "WULA_SwitchWeapon_Desc".Translate(),
icon = ContentFinder<Texture2D>.Get("Wula/UI/Abilities/WULA_WeaponSwitchAbility", false) ?? BaseContent.BadTex,
action = SwitchWeapon,
};
// 确保Command不为null
if (switchWeaponCommand == null)
{
Log.Error($"Failed to create weapon switch gizmo for {MechPawn?.LabelCap}");
return null;
}
return switchWeaponCommand;
}
Command_Action switchWeaponCommand = new Command_Action
catch (System.Exception ex)
{
defaultLabel = "WULA_SwitchWeapon".Translate(),
defaultDesc = "WULA_SwitchWeapon_Desc".Translate(),
icon = ContentFinder<Texture2D>.Get("Wula/UI/Abilities/WULA_WeaponSwitchAbility", false) ?? BaseContent.BadTex,
action = SwitchWeapon
};
return switchWeaponCommand;
Log.Error($"Error creating weapon switch gizmo: {ex}");
return null;
}
}
/// <summary>

View File

@@ -20,6 +20,9 @@ namespace WulaFallenEmpire
// 新增:记录最后一次检查敌人的时间
private int lastEnemyCheckTick = -99999;
// 新增:记录最后一次发信的时间
private int lastLetterTick = -99999;
public HediffDef GetTargetInvisibilityDef()
{
return Props.InvisibilityDef;
@@ -49,6 +52,7 @@ namespace WulaFallenEmpire
Scribe_Values.Look(ref lastDetectedTick, "lastDetectedTick", 0);
Scribe_Values.Look(ref lastRevealedTick, "lastRevealedTick", 0);
Scribe_Values.Look(ref lastEnemyCheckTick, "lastEnemyCheckTick", 0);
Scribe_Values.Look(ref lastLetterTick, "lastLetterTick", 0);
}
public override void CompTick()
@@ -78,6 +82,9 @@ namespace WulaFallenEmpire
Invisibility.BecomeVisible();
lastDetectedTick = Find.TickManager.TicksGame;
// 触发显现事件
TrySendLetter("attack");
}
/// <summary>
@@ -85,7 +92,6 @@ namespace WulaFallenEmpire
/// </summary>
private void CheckForEnemiesInSight()
{
// 检查频率每30 tick检查一次约0.5秒)
if (!Sightstealer.IsHashIntervalTick(30) ||
Find.TickManager.TicksGame <= lastEnemyCheckTick + 30)
@@ -95,12 +101,6 @@ namespace WulaFallenEmpire
lastEnemyCheckTick = Find.TickManager.TicksGame;
// 如果配置为只在战斗状态时检查,且当前不在战斗状态,则跳过
if (Props.onlyCheckInCombat && !IsInCombatState())
{
return;
}
// 检查视线内是否有敌人
bool enemyInSight = false;
List<Pawn> enemiesInSight = new List<Pawn>();
@@ -156,108 +156,110 @@ namespace WulaFallenEmpire
lastDetectedTick = Find.TickManager.TicksGame;
lastRevealedTick = Find.TickManager.TicksGame;
// 可选:添加视觉或声音效果
if (Props.showRevealEffect)
// 触发显现事件
TrySendLetter("detected", enemiesInSight);
}
}
/// <summary>
/// 尝试发送信件
/// </summary>
private void TrySendLetter(string cause, List<Pawn> enemies = null)
{
// 检查是否应该发送信件
if (!ShouldSendLetter())
return;
// 发送信件
SendLetter(cause, enemies);
}
/// <summary>
/// 检查是否应该发送信件
/// </summary>
private bool ShouldSendLetter()
{
// 如果配置为不发信直接返回false
if (!Props.sendLetterOnReveal)
return false;
// 检查发送间隔
int currentTick = Find.TickManager.TicksGame;
if (currentTick < lastLetterTick + Props.letterIntervalTicks)
{
// 还没到发送间隔
return false;
}
// 检查Pawn是否非玩家控制
if (Sightstealer.Faction == Faction.OfPlayer)
{
// 玩家控制的Pawn不发送信件
return false;
}
return true;
}
/// <summary>
/// 发送信件
/// </summary>
private void SendLetter(string cause, List<Pawn> enemies = null)
{
try
{
int currentTick = Find.TickManager.TicksGame;
// 获取信件标题和内容
string title = Props.letterTitle;
string text = Props.letterText;
// 如果标题或内容为空,使用默认值
if (string.IsNullOrEmpty(title))
title = "隐身单位现身";
if (string.IsNullOrEmpty(text))
{
ShowRevealEffect(enemiesInSight);
string enemyInfo = "";
if (enemies != null && enemies.Count > 0)
{
if (enemies.Count == 1)
{
enemyInfo = $"被 {enemies[0].LabelCap} 发现";
}
else
{
enemyInfo = $"被 {enemies.Count} 个敌人发现";
}
}
else if (cause == "attack")
{
enemyInfo = "发动了攻击";
}
text = $"{Sightstealer.LabelCap}{Sightstealer.Faction?.Name ?? ""})在 {Sightstealer.Map?.Parent?.LabelCap ?? ""} 现身了。\n\n{enemyInfo}\n位置{Sightstealer.Position}";
}
// 可选:发送消息
if (Props.sendRevealMessage && Sightstealer.Faction == Faction.OfPlayer)
{
SendRevealMessage(enemiesInSight);
}
}
}
/// <summary>
/// 检查是否处于战斗状态
/// </summary>
private bool IsInCombatState()
{
// 如果有当前工作且是战斗相关工作
if (Sightstealer.CurJob != null)
{
JobDef jobDef = Sightstealer.CurJob.def;
if (jobDef == JobDefOf.AttackMelee ||
jobDef == JobDefOf.AttackStatic ||
jobDef == JobDefOf.Wait_Combat ||
jobDef == JobDefOf.Flee ||
jobDef == JobDefOf.FleeAndCower)
{
return true;
}
}
// 如果有敌人目标
if (Sightstealer.mindState.enemyTarget != null)
{
return true;
}
// 如果最近受到过伤害
if (Find.TickManager.TicksGame - Sightstealer.mindState.lastHarmTick < 300) // 最近5秒内受到伤害
{
return true;
}
// 如果最近攻击过目标
if (Find.TickManager.TicksGame - Sightstealer.mindState.lastAttackTargetTick < 300)
{
return true;
}
return false;
}
/// <summary>
/// 显示解除隐身的效果
/// </summary>
private void ShowRevealEffect(List<Pawn> enemies)
{
if (Sightstealer.Map == null) return;
// 创建一个闪光效果
FleckMaker.ThrowLightningGlow(Sightstealer.Position.ToVector3Shifted(),
Sightstealer.Map, 2f);
// 可选:播放声音
if (Props.revealSound != null)
{
Props.revealSound.PlayOneShot(new TargetInfo(Sightstealer.Position, Sightstealer.Map));
}
}
/// <summary>
/// 发送解除隐身消息
/// </summary>
private void SendRevealMessage(List<Pawn> enemies)
{
if (enemies.Count == 0) return;
string message;
if (enemies.Count == 1)
{
message = "WFE.RevealedBySingleEnemy".Translate(
Sightstealer.LabelShort,
enemies[0].LabelShort
// 发送信件
Letter letter = LetterMaker.MakeLetter(
title,
text,
LetterDefOf.NeutralEvent,
new LookTargets(Sightstealer)
);
Find.LetterStack.ReceiveLetter(letter);
// 更新最后发信时间
lastLetterTick = currentTick;
}
else
catch (System.Exception ex)
{
message = "WFE.RevealedByMultipleEnemies".Translate(
Sightstealer.LabelShort,
enemies.Count
);
Log.Error($"CompFighterInvisible: Error sending letter for {Sightstealer?.LabelCap}: {ex}");
}
Messages.Message(message, Sightstealer, MessageTypeDefOf.NeutralEvent);
}
/// <summary>
/// 获取下次可以隐身的时间
/// </summary>
public int NextInvisibilityTick => lastDetectedTick + Props.stealthCooldownTicks;
// ... 其他方法保持不变 ...
/// <summary>
/// 手动触发解除隐身(供外部调用)
@@ -269,6 +271,11 @@ namespace WulaFallenEmpire
Invisibility.BecomeVisible();
lastDetectedTick = Find.TickManager.TicksGame;
lastRevealedTick = Find.TickManager.TicksGame;
// 尝试发送信件
TrySendLetter("manual");
}
// ... 其他方法保持不变 ...
}
}

View File

@@ -46,24 +46,31 @@ namespace WulaFallenEmpire
// 新增:是否忽略某些状态的敌人(如倒地、死亡等)
public bool ignoreDownedEnemies = true;
public bool ignoreSleepingEnemies = false;
// 新增:简化发信配置
public bool sendLetterOnReveal = false;
public string letterTitle = "";
public string letterText = "";
public int letterIntervalTicks = 1200;
public CompProperties_FighterInvisible()
{
compClass = typeof(CompFighterInvisible);
}
public override IEnumerable<string> ConfigErrors(ThingDef parentDef)
{
foreach (string error in base.ConfigErrors(parentDef))
{
yield return error;
}
if (InvisibilityDef == null)
{
yield return "InvisibilityDef is not defined for CompProperties_FighterInvisible";
}
if (revealDetectionRadius <= 0)
{
revealDetectionRadius = FirstDetectedRadius;

View File

@@ -0,0 +1,183 @@
using System.Collections.Generic;
using RimWorld;
using Verse;
using Verse.AI;
using Verse.Sound;
namespace WulaFallenEmpire
{
public class PawnsArrivalModeWorker_EdgeTeleport : PawnsArrivalModeWorker
{
public override void Arrive(List<Pawn> pawns, IncidentParms parms)
{
Map map = (Map)parms.target;
// 如果没有指定生成中心则使用EdgeDrop的查找方式
if (!parms.spawnCenter.IsValid)
{
parms.spawnCenter = DropCellFinder.FindRaidDropCenterDistant(map);
}
// 为每个Pawn分配一个传送位置在生成中心附近
foreach (Pawn pawn in pawns)
{
if (pawn == null || pawn.Dead || pawn.Destroyed)
continue;
// 找到可用的传送位置
IntVec3 teleportPos = FindTeleportPosition(map, parms.spawnCenter);
// 如果Pawn已经在其他地图需要先将其移到当前地图
if (pawn.Map != map)
{
// 确保Pawn不在任何地图中
if (pawn.Spawned)
{
pawn.DeSpawn();
}
// 将Pawn放入当前地图
GenSpawn.Spawn(pawn, teleportPos, map, parms.spawnRotation);
}
else
{
// 如果已经在当前地图,直接移动位置
pawn.Position = teleportPos;
pawn.Notify_Teleported(true, false);
}
// 播放传送效果
PlayTeleportEffect(pawn, teleportPos, map);
// 确保Pawn有适当的状态
EnsurePawnStateAfterTeleport(pawn);
}
}
public override bool TryResolveRaidSpawnCenter(IncidentParms parms)
{
Map map = (Map)parms.target;
// 与EdgeDrop相同的方式解析生成中心
if (!parms.spawnCenter.IsValid)
{
parms.spawnCenter = DropCellFinder.FindRaidDropCenterDistant(map);
}
parms.spawnRotation = Rot4.Random;
return true;
}
/// <summary>
/// 找到可用的传送位置
/// </summary>
private IntVec3 FindTeleportPosition(Map map, IntVec3 center)
{
// 在中心点附近寻找可用的单元格
// 我们使用与EdgeWalkInGroups类似的逻辑但立即传送
if (CellFinder.TryFindRandomCellNear(center, map, 10,
c => c.Standable(map) &&
!c.Fogged(map) &&
c.GetRoof(map) != RoofDefOf.RoofRockThick && // 排除厚岩顶
map.reachability.CanReachColony(c),
out IntVec3 result))
{
return result;
}
// 如果找不到合适的单元格,使用备选方案
if (RCellFinder.TryFindRandomPawnEntryCell(out result, map, CellFinder.EdgeRoadChance_Hostile))
{
return result;
}
// 最后的手段:使用中心点
return center;
}
/// <summary>
/// 播放传送效果
/// </summary>
private void PlayTeleportEffect(Pawn pawn, IntVec3 pos, Map map)
{
try
{
// 播放Skip_ExitNoDelay效果
EffecterDef teleportEffect = DefDatabase<EffecterDef>.GetNamed("Skip_ExitNoDelay");
if (teleportEffect != null)
{
Effecter effecter = teleportEffect.Spawn();
effecter.ticksLeft = 30; // 设置效果持续时间
effecter.Trigger(new TargetInfo(pos, map), new TargetInfo(pos, map));
effecter.Cleanup();
}
else
{
// 如果找不到指定的效果,使用跳跃效果
EffecterDef jumpEffect = EffecterDefOf.Skip_Exit;
if (jumpEffect != null)
{
Effecter effecter = jumpEffect.Spawn();
effecter.ticksLeft = 30;
effecter.Trigger(new TargetInfo(pos, map), new TargetInfo(pos, map));
effecter.Cleanup();
}
}
// 可选:播放声音效果
SoundDef sound = SoundDefOf.PsychicPulseGlobal;
if (sound != null)
{
sound.PlayOneShot(new TargetInfo(pos, map));
}
}
catch (System.Exception ex)
{
Log.Warning($"Failed to play teleport effect for {pawn?.LabelCap}: {ex}");
}
}
/// <summary>
/// 确保Pawn传送后的状态
/// </summary>
private void EnsurePawnStateAfterTeleport(Pawn pawn)
{
if (pawn == null)
return;
// 重置当前工作
if (pawn.CurJob != null)
{
pawn.jobs.StopAll();
}
// 如果是殖民者或友军,设置为等待战斗状态
if (pawn.Faction == Faction.OfPlayer || !pawn.HostileTo(Faction.OfPlayer))
{
pawn.jobs.StartJob(new Job(JobDefOf.Wait_Combat, 600, true),
JobCondition.InterruptForced, null, false, true, null, null, false);
}
// 重置心理状态
if (pawn.mindState != null)
{
pawn.mindState.enemyTarget = null;
pawn.mindState.mentalStateHandler?.Reset();
}
// 如果是机械族,可能需要特殊处理
if (pawn.RaceProps.IsMechanoid)
{
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp != null)
{
// 如果是自主机械,确保进入适当状态
if (!pawn.Drafted && pawn.Faction == Faction.OfPlayer)
{
pawn.drafter.Drafted = false;
}
}
}
}
}
}

View File

@@ -53,9 +53,6 @@ namespace WulaFallenEmpire
{
pawn.drafter.Drafted = true;
}
// 发送生成消息
Messages.Message("SkyfallerPawnLanded".Translate(pawn.LabelShortCap), pawn, MessageTypeDefOf.NeutralEvent);
}
private Faction GetFaction()

View File

@@ -250,6 +250,7 @@
<Compile Include="HediffComp\WULA_HediffSpawner\Tools.cs" />
<Compile Include="Job\JobDriver_InspectBuilding.cs" />
<Compile Include="Job\JobGiver_InspectBuilding.cs" />
<Compile Include="PawnsArrivalMode\PawnsArrivalModeWorker_EdgeTeleport.cs" />
<Compile Include="Pawn\Comp_MultiTurretGun.cs" />
<Compile Include="Pawn\Comp_PawnRenderExtra.cs" />
<Compile Include="Pawn\WULA_AutoMechCarrier\CompAutoMechCarrier.cs" />