diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 507a7cd6..f121f1c5 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml b/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml
index 645a8741..6b53300f 100644
--- a/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml
+++ b/1.6/1.6/Defs/BackstoryDefs/Solid/Solid_Adult_WULA.xml
@@ -1040,6 +1040,21 @@
+
+ WULA_Adult_Backstory_Legion
+ Adulthood
+ 「军团」分体
+ 「军团」分体
+ [PAWN_nameDef]实际上没有自主心智,它直接链接乌拉帝国行星封锁机关的超级AI「军团」,作为其在外活动时的耳目。
+ AllWork
+ Thin
+ Thin
+ Thin
+
+ Wula_Backstory_Categories_Legion
+
+
+
WULA_Adult_Backstory999
diff --git a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml
index d5bffaf1..f51e9e94 100644
--- a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml
+++ b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml
@@ -40,6 +40,12 @@
Wula_PawnKind
乌拉帝国合成人
乌拉帝国合成人
+ true
+ 总控
+ true
+
+ WULA_Legion_PawnKind
+
1
NamerFaction_Wula_PIA_Legion_Faction
Wula/World/WorldObjects/Expanding/Wula_PIA_Legion_Faction
diff --git a/1.6/1.6/Defs/JobDefs/WULA_JobDefs.xml b/1.6/1.6/Defs/JobDefs/WULA_JobDefs.xml
index 29d970db..0621f514 100644
--- a/1.6/1.6/Defs/JobDefs/WULA_JobDefs.xml
+++ b/1.6/1.6/Defs/JobDefs/WULA_JobDefs.xml
@@ -34,4 +34,15 @@
WulaFallenEmpire.JobDriver_RecycleMechanoid
正在准备进入猫猫地堡。
+
+
+
+ WULA_InspectBuilding
+ WulaFallenEmpire.JobDriver_InspectBuilding
+ 正在考察TargetA.
+ true
+ Always
+ false
+ false
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml
index 61a4e445..4ca123b7 100644
--- a/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml
+++ b/1.6/1.6/Defs/PawnKinds/PawnKinds_Wula.xml
@@ -29,8 +29,6 @@
Wula_Apparel_Init
-
-
0
1
1000~2000
@@ -374,4 +372,99 @@
+
+
+
+ WULA_Legion_PawnKind
+ 「军团」
+ WulaSpecies
+
+
+
+ Wula/Item/WULA_Species_Icon
+ SRA/Pawn/Mechanoid/AllegianceOverlays/None
+ CutoutWithOverlay
+ Graphic_Multi
+ 1.1
+
+ (0.2, 0.3, 0.2)
+
+
+
+
+ 0
+ true
+ 18
+ 20
+ true
+ 10~20
+ 10~20
+ Wula_PIA_Legion_Faction
+ false
+
+ Wula_Legion_Apparel
+
+
+ Wula_Melee_Weapon_T2
+
+ 3000~8000
+ 0
+ 0
+ 99999~99999
+
+
+ Wula_PIA_Legion_Escort_Unit
+ 重装卫队
+ WulaSpecies
+
+
+
+ Wula/Item/WULA_Species_Icon
+ SRA/Pawn/Mechanoid/AllegianceOverlays/None
+ CutoutWithOverlay
+ Graphic_Multi
+ 1.1
+
+ (0.2, 0.3, 0.2)
+
+
+
+
+ 18
+ 20
+ 500
+ 10~20
+ 10~20
+ Poor
+ Poor
+ Poor
+ true
+
+ Wula_Armor_Super_Heavy
+
+
+ Wula_Melee_Weapon_T2
+
+
+ WULA_Heavy_Infantry_PowerArmor
+ WULA_Heavy_Infantry_Helmet
+
+ 3000~8000
+ 1
+ 1
+ 1
+ 999999~999999
+ 999999~999999
+
+ DeathAcidifier
+
+
+
+
+
+ Wula_Backstory_Categories
+
+
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_Tex_Quest.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_Tex_Quest.xml
new file mode 100644
index 00000000..eff06bf3
--- /dev/null
+++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_Tex_Quest.xml
@@ -0,0 +1,227 @@
+
+
+
+
+ WULA_GiveQuest_Base_Tex
+ GiveQuest
+ 纳税
+
+ Map_PlayerHome
+
+ WULA_Base_Tex_Quest
+ IncidentWorker_GiveQuest
+ 0
+ True
+
+
+ WULA_Base_Tex_Quest
+ 0
+ true
+ false
+ 1
+ true
+ false
+
+
+
+ questName->WULA_Base_Tex_Quest_questName
+
+
+
+
+ QuestHospitalityCommon
+
+
+ questDescription->WULA_Intro_Spy_questDescription
+
+
+
+
+
+
+
+
+
+
+ WULA_Base_Tex_Reward
+ permissionReward
+
+
+
+
+
+ WULA_GlobalStorageSenderPod
+
+
+ Wula_PIA_Legion_Faction
+
+
+
+ taxAmount
+ 1
+
+
+ taxInterval
+ 250
+
+
+
+ $points
+ 1
+ taxAmount
+
+
+ Silver
+ $taxAmount
+ $taxInterval
+ TaxPaymentSuccess
+ TaxPaymentFailed
+ true
+ true
+
+
+
+
+ 什一税
+ 唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n查看任务列表以了解更多。
+ NegativeEvent
+
+
+
+
+ TaxPaymentSuccess
+
+
+
+ 纳税完成
+ 帝国已经接收了税款,为了表彰你在纳税上的良好表现,一封税金缴纳凭证已经送到你的殖民地中!
+ PositiveEvent
+
+
+ $permissionReward
+
+
+ Wula_PIA_Legion_Faction
+ 10
+ WULA_Base_Tex_Quest_Handle_Intime
+
+
+ Success
+ false
+
+
+
+
+
+
+
+ 2
+ Handle_Outtime_Counter
+
+
+
+ 60000
+
+
+ Wula_PIA_Legion_Faction
+ -5
+ WULA_Base_Tex_Quest_Handle_Outtime
+
+
+
+
+
+
+ 180000
+
+
+
+
+ Handle_Outtime
+
+
+
+
+
+
+ Handle_Outtime
+
+
+
+ Handle_Outtime
+ WULA_Base_Tex_Quest_UI_1
+
+
+ 未按时纳税
+ 作为乌拉帝国的殖民地,你被发现未按时纳税——或许一次两次她们可以原谅你,但是一直拖欠必然会激怒她们!
+ NegativeEvent
+
+
+ Wula_PIA_Legion_Faction
+ -10
+ WULA_Base_Tex_Quest_Handle_Outtime
+
+
+ Fail
+
+
+
+
+
+
+
+
+ WULA_Base_Tex_Quest_Handle_Intime
+ 按时上交帝国什一税
+
+
+ WULA_Base_Tex_Quest_Handle_Outtime
+ 拖欠帝国什一税
+
+
+ WULA_Base_Tex_Reward
+
+
+
+ 1
+
+
+
+
+ WULA_Tex_Voucher
+
+
+ 1
+
+
+
+
+
+
+
+ WULA_Base_Tex_Quest_UI_1
+ 和P.I.A的通讯
+ Wula/Events/Portraits/WULA_Legion_6
+ 「军团」,P.I.A
+
+ 你们没有按时交税——你们应该知道吧?\n\n<color=#820D13><i>我们都希望局势不会进一步恶化。</i></color>
+
+
+
+ 下次一定
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml
new file mode 100644
index 00000000..53a6976c
--- /dev/null
+++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Colony_Promotion.xml
@@ -0,0 +1,457 @@
+
+
+
+
+ WULA_GiveQuest_Colony_Promotion
+ GiveQuest
+ 殖民地视察
+
+ Map_PlayerHome
+
+ WULA_Colony_Promotion
+ IncidentWorker_GiveQuest
+ 0
+
+
+ WULA_Colony_Promotion
+ 3
+ true
+ false
+ true
+
+
+
+ questName->WULA_Colony_Promotion_questName
+
+
+
+
+ QuestHospitalityCommon
+
+
+ questDescription->WULA_Colony_Promotion_questDescription
+
+
+
+
+
+
+
+
+ map.MapRemoved
+ Fail
+ NotYetAcceptedOnly
+
+
+ map.MapRemoved
+ Fail
+ OngoingOnly
+ true
+
+
+
+
+ WULA_Legion_PawnKind
+ Wula_PIA_Legion_Faction
+
+ true
+ WULA_Child_Backstory01
+ WULA_Adult_Backstory_Legion
+
+ asker
+
+
+
+
+ faction
+ $asker
+ false
+ true
+ true
+
+
+
+ faction.BecameHostileToPlayer
+ LetterLabelFactionBecameHostile
+ LetterTextFactionBecameHostile
+
+
+ faction.BecameHostileToPlayer
+ Fail
+
+
+ faction.BecameHostileToPlayer
+ InvalidPreAcceptance
+ NotYetAcceptedOnly
+
+
+
+
+
+ lodgers
+ $asker
+
+
+
+
+ 2
+
+ Wula_PIA_Legion_Faction
+ Wula_PIA_Legion_Escort_Unit
+ lodgers
+ 1
+ 1
+ true
+ false
+ false
+
+
+
+
+
+ $asker
+
+
+
+
+
+
+
+ $lodgers
+
+
+
+
+ $asker
+
+
+
+
+ $lodgers
+ false
+ lodgers.RanWild
+
+
+
+
+
+
+
+ $lodgers
+ true
+ false
+
+
+
+
+
+
+ Util_TransportShip_DropOff
+
+ $lodgers
+ Wula_PIA_Legion_Faction
+
+
+
+
+ goodwillChangeOnShuttleDestroyed
+ -50
+
+
+
+ pawnsLabelDef
+ [asker_nameDef]
+
+
+
+ dropoffShipThing.Destroyed
+
+
+
+ Shuttle destroyed
+ NegativeEvent
+ The shuttle sent to drop off [pawnsLabelDef] has been destroyed. You have failed the quest '[resolvedQuestName]'.\n\nYour relations with [asker_faction_name] have changed by [goodwillChangeOnShuttleDestroyed].
+
+
+ Fail
+ $goodwillChangeOnShuttleDestroyed
+ $asker
+ ShuttleDestroyed
+
+
+
+
+
+
+
+
+
+
+
+ asker.Destroyed
+ pickupShipThing.SentWithExtraColonists
+
+
+
+ Guest died: {SUBJECT_definite}
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect, has died. [failLetterEndingCommon]
+ OngoingOrNotYetAccepted
+
+
+ Fail
+ -25
+ $asker
+ QuestPawnLost
+ OngoingOrNotYetAccepted
+
+
+
+
+
+
+
+ shuttleDelayTicks
+ 720000
+
+
+ $shuttleDelayTicks
+ $lodgers
+
+
+
+ Util_TransportShip_Pickup
+
+ $(3*60000)
+ $lodgers
+ 999999999
+ $lodgers
+
+
+
+ $lodgers
+ Should depart on shuttle
+
+
+ Shuttle arrived
+ The shuttle has arrived to collect the [asker_faction_leaderTitle].\n\nAll of you can accompany the [asker_faction_leaderTitle] on the shuttle and travel to the Imperial flotilla to begin a new life.
+ $pickupShipThing
+
+
+
+
+
+
+
+
+
+
+
+
+
+ enemyFaction
+ Pirate
+
+
+
+
+ Raids
+ 1.0
+ 0.5
+ 0.04
+ 1~2
+ 1.75
+ 1000
+
+
+
+
+
+
+
+
+
+
+ lodgersMoodThreshold
+ 0.25
+
+
+ $asker
+ $lodgersMoodThreshold
+
+
+
+ {SUBJECT_bestRoyalTitle} unhappy
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect and keep happy, has been below the minimum mood of [lodgersMoodThreshold] too long. [failLetterEndingCommon]
+
+
+ Fail
+
+
+
+
+
+
+
+ lodgers.Arrested
+
+
+
+ Guest captured: {SUBJECT_definite}
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect, has been arrested. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ QuestPawnArrested
+
+
+
+
+
+
+
+ lodgers.SurgeryViolation
+
+
+
+ Unauthorized surgery: {SUBJECT_definite}
+ NegativeEvent
+ Unauthorized, violating surgery has been performed on {SUBJECT_definite}, who you were charged to protect. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ PerformedHarmfulSurgery
+
+
+
+
+
+
+
+ lodgers.XenogermAbsorbed
+
+
+
+ Xenogerm absorbed: {SUBJECT_definite}
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect, has had {SUBJECT_possessive} xenogerm forcibly absorbed. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ XenogermAbsorbed
+
+
+
+
+
+
+
+ asker.LeftMap
+
+
+
+ Guest lost: {SUBJECT_definite}
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect, has left the assigned settlement. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ QuestPawnLost
+
+
+
+
+
+
+
+ pickupShipThing.Destroyed
+
+
+
+ Shuttle destroyed
+ NegativeEvent
+ The shuttle sent to collect the [asker_faction_leaderTitle] has been destroyed. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ ShuttleDestroyed
+
+
+
+
+
+
+
+ asker.RanWild
+
+
+
+ Guest lost: {SUBJECT_definite}
+ NegativeEvent
+ {SUBJECT_definite}, who you were charged to protect, has run wild. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ QuestPawnLost
+
+
+
+
+
+
+
+ pickupShipThing.SentSatisfied
+
+ Success
+ true
+
+
+
+ pickupShipThing.SentUnsatisfied
+
+
+
+ Quest failed: [resolvedQuestName]
+ NegativeEvent
+ The shuttle sent to collect the [asker_faction_leaderTitle] has departed without [asker_objective]. [asker_pronoun] will now leave on foot. [failLetterEndingCommon]
+
+
+ Fail
+ -5
+ $asker
+ MemberMissedShuttle
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml
new file mode 100644
index 00000000..5b6ec346
--- /dev/null
+++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml
@@ -0,0 +1,413 @@
+
+
+
+ WULA_Intro_NewColony
+ 0
+ true
+ false
+ 1
+ true
+ false
+
+
+
+ questName->WULA_Intro_NewColony_questName
+
+
+
+
+ QuestHospitalityCommon
+
+
+ questDescription->WULA_Intro_NewColony_questDescription
+
+
+
+
+
+
+
+ 60
+
+
+
+
+ UI_Start
+
+
+ UI_Start
+ Wula_Intro_NewColony_UI_1
+
+
+ Success
+ false
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_1
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_2
+ 「军团」,P.I.A
+
+ 这里是行星封锁机关P.I.A,看起来你们已经成功抵达地表了。根据规划,你们应该是第一批部署在这个星球地表的乌拉帝国合成人——遵照异族接触法则做事,建立本地根据地,如果有必要就呼叫舰队的支援。
+
+
+
+ 你是谁?
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+
+
+
+
+
+
+ 我们需要做什么?(发展流程)
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_5
+
+
+
+
+
+
+ 收到,帝国荣光永存
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+ Wula_Intro_NewColony_UI_11
+
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_3
+ 「军团」,P.I.A
+
+ 第一次参加开拓任务?\n\n好吧,你们可以叫我「军团」,我是负责管理乌拉帝国行星封锁机关舰队的AI,根据你们的编制来说,我是你们的顶头上司。在登陆地表前,机械行会没有给你们设置正确的记忆扇区吗?
+
+
+
+ 行星封锁机关?
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_3
+
+
+
+
+
+
+ 机械行会?
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_4
+
+
+
+
+
+
+ 我们没有相关问题了···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_10
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_3
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_3
+ 「军团」,P.I.A
+
+ 行星封锁机关是隶属于乌拉帝国开发署的暴力机关,控制着开发署所有的舰队,负责在疆域开拓中的侵略性接触。\n\n通常来说,类似边缘世界这样的星球,我们会直接封锁轨道,轰炸所有现存聚居地然后再投放殖民者,不过看起来这个世界还有救,所以你们作为第一批先遣队投放到星球上,和其他异族接触试探一下,明白了吗?
+
+
+
+ 我们还有别的问题···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+
+
+
+
+
+
+ 我们没有相关问题了···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_10
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_4
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_3
+ 「军团」,P.I.A
+
+ 乌拉帝国机械行会负责所有的合成人的生产、审查、投放和初始化,你们在部署到舰队上时,应该会有一个机械师帮你们设置好预载了记忆的扇区,但是很显然那家伙失职了,才让你们在这里拿着一堆你们早该知道的事情来烦我。
+
+
+
+ 我们还有别的问题···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+
+
+
+
+
+
+ 我们没有相关问题了···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_10
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_5
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_3
+ 「军团」,P.I.A
+
+ 你们的意思是,你们连不知道要干什么就被丢下来了?\n\n哎,你们要做的就是施展你们的百般武艺活下来,建立一个根据地。根据帝国税收法,你们每个一段时间需要上交税款——作为帝国殖民地,舰队和机群将成为你们的后盾。\n\n如果你们觉得你们准备好了,可以申请权限进阶审查,我会部署一个带卫队的分体去你们的殖民地考察一段时间,然后根据评级决定是否给你们晋升。晋升后的殖民地会获得更多的许可,允许调用更加强大的武备和支援。
+
+
+
+ 我们还有别的问题···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+
+
+
+
+
+
+ 我们没有相关问题了···
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_10
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_10
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_2
+ 「军团」,P.I.A
+
+ 还有什么事吗?
+
+
+
+ 你是谁?
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_2
+
+
+
+
+
+
+ 我们需要做什么?(发展流程)
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+ Wula_Intro_NewColony_UI_5
+
+
+
+
+
+
+ 收到,帝国荣光永存
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+ Wula_Intro_NewColony_UI_11
+
+
+
+
+
+
+
+
+
+ Wula_Intro_NewColony_UI_11
+ 未知通讯
+ Wula/Events/Portraits/WULA_Legion_2
+ 「军团」,P.I.A
+
+ 帝国荣光永存。\n\n快去吧,有一整个世界在等着我们征服。
+
+
+
+ (结束通讯)
+ true
+ (255,255,255,255)
+ (157,201,185,195)
+ (255,255,255,255)
+ (255,255,255,255)
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml
similarity index 52%
rename from 1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml
rename to 1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml
index ab98eb50..0a9836fe 100644
--- a/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml
+++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_Spy.xml
@@ -1,428 +1,16 @@
-
- WULA_Intro_NewColony
- 0
- true
- false
- 1
- true
- false
-
-
-
- questName->WULA_Intro_NewColony_questName
-
-
-
-
- QuestHospitalityCommon
-
-
- questDescription->WULA_Intro_NewColony_questDescription
-
-
-
-
-
-
-
- 60
-
-
-
-
- UI_Start
-
-
- UI_Start
- Wula_Intro_NewColony_UI_1
-
-
- Success
- false
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_1
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_2
- 「军团」,P.I.A
-
- 这里是行星封锁机关P.I.A,看起来你们已经成功抵达地表了。根据规划,你们应该是第一批部署在这个星球地表的乌拉帝国合成人——遵照异族接触法则做事,建立本地根据地,如果有必要就呼叫舰队的支援。
-
-
-
- 你是谁?
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
-
-
-
-
-
-
- 我们需要做什么?(发展流程)
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_5
-
-
-
-
-
-
- 收到,帝国荣光永存
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
- Wula_Intro_NewColony_UI_11
-
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_3
- 「军团」,P.I.A
-
- 第一次参加开拓任务?\n\n好吧,你们可以叫我「军团」,我是负责管理乌拉帝国行星封锁机关舰队的AI,根据你们的编制来说,我是你们的顶头上司。在登陆地表前,机械行会没有给你们设置正确的记忆扇区吗?
-
-
-
- 行星封锁机关?
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_3
-
-
-
-
-
-
- 机械行会?
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_4
-
-
-
-
-
-
- 我们没有相关问题了···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_10
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_3
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_3
- 「军团」,P.I.A
-
- 行星封锁机关是隶属于乌拉帝国开发署的暴力机关,控制着开发署所有的舰队,负责在疆域开拓中的侵略性接触。\n\n通常来说,类似边缘世界这样的星球,我们会直接封锁轨道,轰炸所有现存聚居地然后再投放殖民者,不过看起来这个世界还有救,所以你们作为第一批先遣队投放到星球上,和其他异族接触试探一下,明白了吗?
-
-
-
- 我们还有别的问题···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
-
-
-
-
-
-
- 我们没有相关问题了···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_10
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_4
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_3
- 「军团」,P.I.A
-
- 乌拉帝国机械行会负责所有的合成人的生产、审查、投放和初始化,你们在部署到舰队上时,应该会有一个机械师帮你们设置好预载了记忆的扇区,但是很显然那家伙失职了,才让你们在这里拿着一堆你们早该知道的事情来烦我。
-
-
-
- 我们还有别的问题···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
-
-
-
-
-
-
- 我们没有相关问题了···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_10
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_5
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_3
- 「军团」,P.I.A
-
- 你们的意思是,你们连不知道要干什么就被丢下来了?\n\n哎,你们要做的就是施展你们的百般武艺活下来,建立一个根据地。根据帝国税收法,你们每个一段时间需要上交税款——作为帝国殖民地,舰队和机群将成为你们的后盾。\n\n如果你们觉得你们准备好了,可以申请权限进阶审查,我会部署一个带卫队的分体去你们的殖民地考察一段时间,然后根据评级决定是否给你们晋升。晋升后的殖民地会获得更多的许可,允许调用更加强大的武备和支援。
-
-
-
- 我们还有别的问题···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
-
-
-
-
-
-
- 我们没有相关问题了···
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_10
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_10
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_2
- 「军团」,P.I.A
-
- 还有什么事吗?
-
-
-
- 你是谁?
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_2
-
-
-
-
-
-
- 我们需要做什么?(发展流程)
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
- Wula_Intro_NewColony_UI_5
-
-
-
-
-
-
- 收到,帝国荣光永存
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
- Wula_Intro_NewColony_UI_11
-
-
-
-
-
-
-
-
-
- Wula_Intro_NewColony_UI_11
- 未知通讯
- Wula/Events/Portraits/WULA_Legion_2
- 「军团」,P.I.A
-
- 帝国荣光永存。\n\n快去吧,有一整个世界在等着我们征服。
-
-
-
- (结束通讯)
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
-
-
-
-
-
-
WULA_GiveQuest_Intro_Spy
GiveQuest
- SPY
+ 掩护间谍
Map_PlayerHome
WULA_Intro_Spy
IncidentWorker_GiveQuest
0
- True
WULA_Intro_Spy
@@ -520,7 +108,7 @@
points
- 50
+ 350
@@ -1021,229 +609,4 @@
-
-
-
- WULA_GiveQuest_Base_Tex
- GiveQuest
- 纳税
-
- Map_PlayerHome
-
- WULA_Base_Tex_Quest
- IncidentWorker_GiveQuest
- 0
- True
-
-
- WULA_Base_Tex_Quest
- 0
- true
- false
- 1
- true
- false
-
-
-
- questName->WULA_Base_Tex_Quest_questName
-
-
-
-
- QuestHospitalityCommon
-
-
- questDescription->WULA_Intro_Spy_questDescription
-
-
-
-
-
-
-
-
-
-
- WULA_Base_Tex_Reward
- permissionReward
-
-
-
-
-
- WULA_GlobalStorageSenderPod
-
-
- Wula_PIA_Legion_Faction
-
-
-
- taxAmount
- 1
-
-
- taxInterval
- 250
-
-
-
- $points
- 1
- taxAmount
-
-
- Silver
- $taxAmount
- $taxInterval
- TaxPaymentSuccess
- TaxPaymentFailed
- true
- true
-
-
-
-
- 什一税
- 唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n查看任务列表以了解更多。
- NegativeEvent
-
-
-
-
- TaxPaymentSuccess
-
-
-
- 纳税完成
- 帝国已经接收了税款,为了表彰你在纳税上的良好表现,一封税金缴纳凭证已经送到你的殖民地中!
- PositiveEvent
-
-
- $permissionReward
-
-
- Wula_PIA_Legion_Faction
- 10
- WULA_Base_Tex_Quest_Handle_Intime
-
-
- Success
- false
-
-
-
-
-
-
-
- 2
- Handle_Outtime_Counter
-
-
-
- 60000
-
-
- Wula_PIA_Legion_Faction
- -5
- WULA_Base_Tex_Quest_Handle_Outtime
-
-
-
-
-
-
- 180000
-
-
-
-
- Handle_Outtime
-
-
-
-
-
-
- Handle_Outtime
-
-
-
- Handle_Outtime
- WULA_Base_Tex_Quest_UI_1
-
-
- 未按时纳税
- 作为乌拉帝国的殖民地,你被发现未按时纳税——或许一次两次她们可以原谅你,但是一直拖欠必然会激怒她们!
- NegativeEvent
-
-
- Wula_PIA_Legion_Faction
- -10
- WULA_Base_Tex_Quest_Handle_Outtime
-
-
- Fail
-
-
-
-
-
-
-
-
- WULA_Base_Tex_Quest_Handle_Intime
- 按时上交帝国什一税
-
-
- WULA_Base_Tex_Quest_Handle_Outtime
- 拖欠帝国什一税
-
-
- WULA_Base_Tex_Reward
-
-
-
- 1
-
-
-
-
- WULA_Tex_Voucher
-
-
- 1
-
-
-
-
-
-
-
- WULA_Base_Tex_Quest_UI_1
- 和P.I.A的通讯
- Wula/Events/Portraits/WULA_Legion_6
- 「军团」,P.I.A
-
- 你们没有按时交税——你们应该知道吧?\n\n<color=#820D13><i>我们都希望局势不会进一步恶化。</i></color>
-
-
-
- 下次一定
- true
- (255,255,255,255)
- (157,201,185,195)
- (255,255,255,255)
- (255,255,255,255)
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/1.6/1.6/Defs/StoryTellers/WULA_Storytellers.xml b/1.6/1.6/Defs/StoryTellers/WULA_Storytellers.xml
index 388414f8..c45aa107 100644
--- a/1.6/1.6/Defs/StoryTellers/WULA_Storytellers.xml
+++ b/1.6/1.6/Defs/StoryTellers/WULA_Storytellers.xml
@@ -198,6 +198,23 @@
Map_PlayerHome
+
+
+
+ WULA_Colony_License_LV1_Technology
+ WULA_GiveQuest_Base_Tex
+ WULA_Base_Tex_Quest
+
+
+ 0
+ 15
+
+
+ false
+ false
+
+ Wula_PIA_Legion_Faction
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
index d2d431dc..07a87676 100644
--- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
+++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
@@ -670,7 +670,7 @@
Wula/Building/Flag/WULA_Flag_Building_A
(3,3)
0
- (0,0,3)
+ (0,1,3)
1.5
0.2
0
@@ -679,7 +679,7 @@
Wula/Building/Flag/WULA_Flag_Building_Mount
(1,1)
1
- (0,0,0)
+ (0,1,0)
0
0
0
diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Apperals/WULA_Apparel.xml b/1.6/1.6/Defs/ThingDefs_Misc/Apperals/WULA_Apparel.xml
index 2770cd34..56c137b4 100644
--- a/1.6/1.6/Defs/ThingDefs_Misc/Apperals/WULA_Apparel.xml
+++ b/1.6/1.6/Defs/ThingDefs_Misc/Apperals/WULA_Apparel.xml
@@ -337,6 +337,9 @@
Wula/Apparel/WULA_Bodystocking
+
+ Wula_Legion_Apparel
+
Wula/Apparel/WULA_Bodystocking
@@ -381,6 +384,39 @@
+
+ WULA_Eggplant_Hat
+ 茄子帽
+ 这也是帽子吗——茄子柄有了,那茄子在哪呢?
+
+ Wula/Apparel/WULA_Eggplant_Hat
+
+
+ WULA_Synth_Clothes_1_Technology
+
+
+
+ UpperHead
+
+
+ Middle
+
+ Wula/Apparel/WULA_Eggplant_Hat
+ false
+ false
+ false
+
+
+ 20
+
+
+ 200
+ 500
+ 2
+ 0.1
+ 0
+
+
WULA_Maid_Uniform
@@ -463,6 +499,44 @@
0.05
+
+
+ WULA_Legion_Cloth
+ 乌拉帝国指挥官制服
+ 由乌拉帝国指挥官所穿的鎏金四溢的华服。\n\n你还想听什么介绍?你觉得这个东西你有足够的身份穿吗?
+
+ Wula/Apparel/WULA_Legion_Cloth
+
+
+
+ Wula_Legion_Apparel
+
+
+ Torso
+ Neck
+ Shoulders
+ Arms
+ Legs
+
+
+ Middle
+
+ Wula/Apparel/WULA_Legion_Cloth
+ false
+ false
+ false
+
+
+ 300
+ 100
+
+
+ 500
+ 12000
+ 1
+ 1
+
+
WULA_Assault_Troop_PowerArmor
@@ -677,7 +751,7 @@
1.5
1.5
2.0
- 15
+ 5
-0.1
diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
index 9dd51465..bab1412f 100644
--- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
+++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml
@@ -257,9 +257,6 @@
Wula_Melee_Weapon_T2
-
- RewardStandardQualitySuper
-
Wula/Weapon/WULA_MW_ChainSword/WULA_MW_ChainSword_Anim
@@ -969,9 +966,6 @@
Wula_Ranged_Weapon_T2
-
- RewardStandardQualitySuper
-
diff --git a/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
index bfe770d1..1909e0d2 100644
--- a/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
+++ b/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
@@ -402,6 +402,22 @@
Humanlike_PostMain
+
+
+
+
+ WULA_Legion_PawnKind
+
+
+ Misc
+
+
+ 4.0
+
+
+
+
+
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml
new file mode 100644
index 00000000..45a7358b
--- /dev/null
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml
@@ -0,0 +1,9 @@
+
+
+
+ questName->什一税税收
+
+
+ questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国每隔一个季度(15天)收一次什一税,什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果拖延,则每延期一天都会惹其不快,最后甚至有可能被定性为叛国!
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml
new file mode 100644
index 00000000..ee6e40e3
--- /dev/null
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml
@@ -0,0 +1,62 @@
+
+
+
+ questName->殖民地考察
+
+
+ questDescription->殖民地已经承接了视察任务。\n\n行星封锁机关的总控AI已经派遣了自己的一个分体和护卫队抵达殖民地。考察持续12天,她会检查殖民地方方面面的运转情况,你需要确保其心情始终高于25%。考察完成后,她和卫队会搭乘穿梭机离开,如果一切顺利你们将获得殖民地晋升的机会,以解锁更多的许可科技。\n\n小心,附近的敌对派系已经知道了殖民地来了一个大人物,这些劫掠者会尝试袭击殖民地并抓住这个分体,你可能需要面对大量袭击!
+
+ 任务失败:[resolvedQuestName]
+
+ [faction_name]开始敌视你。
+
+ 穿梭机被破坏
+
+ 被派遣来运输[asker_nameDef]的穿梭机已被破坏。
+
+ [asker_nameDef]已抵达
+
+ [asker_nameDef]的分体和她的卫队已经抵达殖民地。\n\n你必须在穿梭机抵达前[shuttleDelayTicks_duration]内为[asker_objective]提供护卫并且满足[asker_possessive]各种需求。
+
+ 宾客{SUBJECT_definite}死亡。
+
+ 需要你护卫的{SUBJECT_definite}已经死亡。[failLetterEndingCommon]
+
+ 应该乘坐穿梭机离开
+
+ 穿梭机已抵达
+
+ 穿梭机已经前来迎接[asker_nameDef]。
+
+ {SUBJECT_bestRoyalTitle}情绪低落
+
+ 需要你护卫和满足需求的{SUBJECT_definite},其情绪值已经长时间低于最低限度[lodgersMoodThreshold]。[failLetterEndingCommon]
+
+ 宾客{SUBJECT_definite}被俘。
+
+ 需要你护卫的{SUBJECT_definite}已经被俘虏。[failLetterEndingCommon]
+
+ 未授权手术:{SUBJECT_definite}
+
+ 需要你护卫的{SUBJECT_definite}接受了一场未授权的多余手术。[failLetterEndingCommon]
+
+ 异种胚芽被吸收
+
+ 指定由你保护的{SUBJECT_definite}在你的殖民地被吸收了异种胚芽。[failLetterEndingCommon]
+
+ 宾客失踪:{SUBJECT_definite}
+
+ 需要你护卫的{SUBJECT_definite}失踪在你的殖民地。[failLetterEndingCommon]
+
+ 穿梭机已被毁
+
+ 前来迎接[asker_faction_leaderTitle]的穿梭机被摧毁了。[failLetterEndingCommon]
+
+ 宾客失踪:{SUBJECT_definite}
+
+ 需要你护卫的{SUBJECT_definite}在你的殖民地回归自然。[failLetterEndingCommon]
+
+ 任务失败:[resolvedQuestName]
+
+ 前来迎接[asker_faction_leaderTitle]的穿梭机没有接到[asker_objective]。[asker_pronoun]现在只能走回去。[failLetterEndingCommon]
+
\ No newline at end of file
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml
new file mode 100644
index 00000000..4f2c9d02
--- /dev/null
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml
@@ -0,0 +1,9 @@
+
+
+
+ questName->新殖民地
+
+
+ questDescription->乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml
similarity index 86%
rename from 1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml
rename to 1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml
index f7882bd0..4452ada8 100644
--- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml
@@ -1,12 +1,5 @@
-
- questName->新殖民地
-
-
- questDescription->乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。
-
-
questName->掩护帝国密探
@@ -62,11 +55,4 @@
任务失败:[resolvedQuestName]
前来迎接[asker_nameDef]的穿梭机在离开时因为一些原因落下了[asker_objective]。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon]
-
-
- questName->什一税税收
-
-
- questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国的什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果拖延,则每延期一天都会惹其不快,最后甚至有可能被定性为叛国!
-
\ No newline at end of file
diff --git a/Content/Textures/Wula/Apparel/WULA_Body_Suit.png b/Content/Textures/Wula/Apparel/WULA_Body_Suit.png
deleted file mode 100644
index 790f53b6..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Body_Suit.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_east.png
deleted file mode 100644
index ac3c9e07..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_north.png
deleted file mode 100644
index 7ad97ed8..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_south.png
deleted file mode 100644
index 8a429797..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Body_Suit_Thin_south.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat.png b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat.png
new file mode 100644
index 00000000..d769d2fb
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_east.png
new file mode 100644
index 00000000..c6f196f4
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_east.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_north.png
new file mode 100644
index 00000000..beabd7bf
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_north.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_south.png
new file mode 100644
index 00000000..a303f45a
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Eggplant_Hat_Thin_south.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Heavy_Infantry_Helmet.png b/Content/Textures/Wula/Apparel/WULA_Heavy_Infantry_Helmet.png
index a473d26d..bc5f26e3 100644
Binary files a/Content/Textures/Wula/Apparel/WULA_Heavy_Infantry_Helmet.png and b/Content/Textures/Wula/Apparel/WULA_Heavy_Infantry_Helmet.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet.png b/Content/Textures/Wula/Apparel/WULA_Knight_Helmet.png
deleted file mode 100644
index 88c50670..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_east.png b/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_east.png
deleted file mode 100644
index 148ec6c1..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_north.png b/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_north.png
deleted file mode 100644
index c5dbe5aa..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_south.png b/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_south.png
deleted file mode 100644
index 045b4430..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_Helmet_south.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor.png b/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor.png
deleted file mode 100644
index 2dbb1410..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_east.png
deleted file mode 100644
index 3cbd7109..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_north.png
deleted file mode 100644
index d8849be4..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_south.png
deleted file mode 100644
index a7ec9597..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_south.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_west.png b/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_west.png
deleted file mode 100644
index 7c2cd5a4..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Knight_PowerArmor_Thin_west.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Legion_Cloth.png b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth.png
new file mode 100644
index 00000000..7b3047ba
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_east.png
new file mode 100644
index 00000000..df13c068
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_east.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_north.png
new file mode 100644
index 00000000..3c1d0b56
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_north.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_south.png
new file mode 100644
index 00000000..f14bde80
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Legion_Cloth_Thin_south.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_east.png
index 0e9d0b54..7382eb25 100644
Binary files a/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_east.png and b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_east.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_north.png
new file mode 100644
index 00000000..b403e2cc
Binary files /dev/null and b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_north.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_south.png
index 19efa43f..967083eb 100644
Binary files a/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_south.png and b/Content/Textures/Wula/Apparel/WULA_Maid_Uniform_Headband_Thin_south.png differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic.png b/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic.png
deleted file mode 100644
index 3573208f..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_east.png
deleted file mode 100644
index c932f157..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_north.png
deleted file mode 100644
index b3b52580..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_south.png
deleted file mode 100644
index aee38ecb..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Shield_Prismatic_Thin_south.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform.png
deleted file mode 100644
index a6ea0387..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_east.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_east.png
deleted file mode 100644
index 4f0a2c15..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_north.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_north.png
deleted file mode 100644
index ae5a9ff1..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_south.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_south.png
deleted file mode 100644
index f7c53703..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_Uniform_Thin_south.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_veil.png
deleted file mode 100644
index c326f288..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_east.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_east.png
deleted file mode 100644
index 7a582a92..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_east.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_north.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_north.png
deleted file mode 100644
index 9973517c..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_north.png and /dev/null differ
diff --git a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_south.png b/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_south.png
deleted file mode 100644
index 95d3d12e..00000000
Binary files a/Content/Textures/Wula/Apparel/WULA_Skitarii_veil_south.png and /dev/null differ
diff --git a/Source/WulaFallenEmpire/Job/JobDriver_InspectBuilding.cs b/Source/WulaFallenEmpire/Job/JobDriver_InspectBuilding.cs
new file mode 100644
index 00000000..e239c6ff
--- /dev/null
+++ b/Source/WulaFallenEmpire/Job/JobDriver_InspectBuilding.cs
@@ -0,0 +1,112 @@
+using System.Collections.Generic;
+using RimWorld;
+using Verse;
+using Verse.AI;
+
+namespace WulaFallenEmpire
+{
+ public class JobDriver_InspectBuilding : JobDriver
+ {
+ private const TargetIndex BuildingIndex = TargetIndex.A;
+
+ private int ticksLeft;
+
+ // 定义考察效果 - 可以使用现有的效果或创建自定义效果
+ private static readonly EffecterDef InspectEffect = EffecterDefOf.Research; // 使用研究效果作为临时替代
+ private static readonly SoundDef InspectSound = SoundDefOf.Interact_CleanFilth; // 使用建造声音作为临时替代
+
+ public override bool TryMakePreToilReservations(bool errorOnFailed)
+ {
+ // 预订目标建筑
+ return pawn.Reserve(job.targetA, job, 1, 1, null, errorOnFailed);
+ }
+
+ protected override IEnumerable MakeNewToils()
+ {
+ // 失败条件
+ this.FailOnDestroyedOrNull(BuildingIndex);
+ this.FailOnDespawnedOrNull(BuildingIndex);
+ this.FailOn(() => !pawn.health.capacities.CapableOf(PawnCapacityDefOf.Moving));
+
+ // 第一步:前往目标建筑
+ yield return Toils_Goto.GotoCell(BuildingIndex, PathEndMode.Touch)
+ .FailOnSomeonePhysicallyInteracting(BuildingIndex);
+
+ // 第二步:进行考察(带动画效果)
+ Toil inspectToil = CreateInspectionToil();
+ yield return inspectToil;
+ }
+
+ ///
+ /// 创建带动画效果的考察工作
+ ///
+ private Toil CreateInspectionToil()
+ {
+ Toil inspectToil = new Toil();
+
+ inspectToil.initAction = () =>
+ {
+ ticksLeft = job.expiryInterval;
+
+ // 记录日志
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobDriver_InspectBuilding] {pawn.Name} started inspecting {TargetThingA.Label} for {ticksLeft} ticks");
+ }
+ };
+
+ inspectToil.tickAction = () =>
+ {
+ ticksLeft--;
+
+ // 每 tick 检查是否完成
+ if (ticksLeft <= 0)
+ {
+ ReadyForNextToil();
+ }
+ };
+
+ inspectToil.defaultCompleteMode = ToilCompleteMode.Delay;
+ inspectToil.defaultDuration = job.expiryInterval;
+
+ // 添加动画效果
+ inspectToil.WithEffect(InspectEffect, BuildingIndex);
+
+ // 添加音效
+ inspectToil.PlaySustainerOrSound(() => InspectSound);
+
+ // 添加进度条(可选)
+ inspectToil.WithProgressBar(BuildingIndex,
+ () => 1f - ((float)ticksLeft / job.expiryInterval),
+ interpolateBetweenActorAndTarget: true);
+
+ inspectToil.AddFinishAction(() =>
+ {
+ // 考察完成后的处理
+ OnInspectionComplete();
+ });
+
+ return inspectToil;
+ }
+
+ ///
+ /// 考察完成时的处理
+ ///
+ private void OnInspectionComplete()
+ {
+ // 可以在这里添加考察完成后的效果
+ // 例如:增加技能经验、触发事件等
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobDriver_InspectBuilding] {pawn.Name} completed inspection of {TargetThingA.Label}");
+ }
+ }
+
+ public override void ExposeData()
+ {
+ base.ExposeData();
+ Scribe_Values.Look(ref ticksLeft, "ticksLeft", 0);
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/Job/JobGiver_InspectBuilding.cs b/Source/WulaFallenEmpire/Job/JobGiver_InspectBuilding.cs
new file mode 100644
index 00000000..30513f24
--- /dev/null
+++ b/Source/WulaFallenEmpire/Job/JobGiver_InspectBuilding.cs
@@ -0,0 +1,307 @@
+using RimWorld;
+using RimWorld.Planet;
+using System.Collections.Generic;
+using System.Linq;
+using Verse;
+using Verse.AI;
+
+namespace WulaFallenEmpire
+{
+ public class JobGiver_InspectBuilding : ThinkNode_JobGiver
+ {
+ // 检查间隔(ticks)
+ private const int CheckInterval = 120; // 2秒检查一次
+
+ // 最大考察距离
+ private const float MaxDistance = 20f;
+
+ // 默认最小间隔(ticks)- 5分钟
+ private const int DefaultMinIntervalTicks = 300 * 60; // 5分钟 * 60秒/分钟 * 60ticks/秒
+
+ // 存储每个 Pawn 的最后考察时间
+ private static Dictionary lastInspectionTicks = new Dictionary();
+
+ protected override Job TryGiveJob(Pawn pawn)
+ {
+ // 检查 Pawn 是否有效
+ if (pawn == null || pawn.Destroyed || !pawn.Spawned || pawn.Map == null)
+ return null;
+
+ // 检查 Pawn 是否能够工作
+ if (pawn.Downed || pawn.InMentalState || !pawn.health.capacities.CanBeAwake)
+ return null;
+
+ // 检查 Pawn 是否能够移动
+ if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Moving))
+ return null;
+
+ // 检查背景故事是否为军团背景
+ if (!HasLegionBackstory(pawn))
+ return null;
+
+ // 检查是否已经有工作
+ if (pawn.CurJob != null && pawn.CurJob.def == JobDefOf_WULA.WULA_InspectBuilding)
+ return null;
+
+ // 检查冷却时间
+ if (!CanInspectNow(pawn))
+ return null;
+
+ // 寻找合适的考察目标
+ Thing inspectionTarget = FindRandomInspectionTarget(pawn);
+ if (inspectionTarget == null)
+ return null;
+
+ // 创建考察工作
+ Job job = JobMaker.MakeJob(JobDefOf_WULA.WULA_InspectBuilding, inspectionTarget);
+ job.expiryInterval = Rand.Range(300, 600); // 5-10秒的随机时间
+ job.checkOverrideOnExpire = true;
+
+ // 记录开始考察时间
+ RecordInspectionStart(pawn);
+
+ // 记录调试信息
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] Assigned inspection job to {pawn.Name} at {inspectionTarget.Label}");
+ }
+
+ return job;
+ }
+
+ ///
+ /// 检查 Pawn 是否具有军团背景故事
+ ///
+ private bool HasLegionBackstory(Pawn pawn)
+ {
+ if (pawn.story == null)
+ return false;
+
+ // 检查成年背景故事是否为军团背景
+ if (pawn.story.Adulthood != null && pawn.story.Adulthood.identifier == "WULA_Adult_Backstory_Legion")
+ return true;
+
+ return false;
+ }
+
+ ///
+ /// 检查 Pawn 是否可以开始新的考察(冷却时间检查)
+ ///
+ private bool CanInspectNow(Pawn pawn)
+ {
+ // 获取设置的最小间隔时间
+ int minIntervalTicks = GetMinInspectionIntervalTicks();
+
+ // 如果 Pawn 没有记录,说明可以立即开始
+ if (!lastInspectionTicks.ContainsKey(pawn))
+ return true;
+
+ int lastTick = lastInspectionTicks[pawn];
+ int currentTick = Find.TickManager.TicksGame;
+ int elapsedTicks = currentTick - lastTick;
+
+ // 检查是否已经过了最小间隔时间
+ bool canInspect = elapsedTicks >= minIntervalTicks;
+
+ if (Prefs.DevMode && !canInspect)
+ {
+ int remainingTicks = minIntervalTicks - elapsedTicks;
+ float remainingSeconds = remainingTicks / 60f;
+ Log.Message($"[JobGiver_InspectBuilding] {pawn.Name} must wait {remainingSeconds:F1} seconds before next inspection");
+ }
+
+ return canInspect;
+ }
+
+ ///
+ /// 记录 Pawn 开始考察的时间
+ ///
+ private void RecordInspectionStart(Pawn pawn)
+ {
+ lastInspectionTicks[pawn] = Find.TickManager.TicksGame;
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] Recorded inspection start for {pawn.Name} at tick {lastInspectionTicks[pawn]}");
+ }
+ }
+
+ ///
+ /// 获取最小考察间隔时间(ticks)
+ ///
+ private int GetMinInspectionIntervalTicks()
+ {
+ // 这里可以从 Mod 设置中获取值
+ // 暂时返回默认值,您可以根据需要修改
+ return DefaultMinIntervalTicks;
+ }
+
+ ///
+ /// 随机寻找合适的考察目标
+ ///
+ private Thing FindRandomInspectionTarget(Pawn pawn)
+ {
+ // 获取地图上所有符合条件的建筑
+ List validBuildings = new List();
+
+ // 遍历地图上的所有建筑
+ foreach (Thing thing in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.BuildingArtificial))
+ {
+ if (IsValidInspectionTarget(thing, pawn))
+ {
+ validBuildings.Add(thing);
+ }
+ }
+
+ // 如果没有找到合适的建筑,返回null
+ if (validBuildings.Count == 0)
+ {
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] No valid inspection targets found for {pawn.Name}");
+ }
+ return null;
+ }
+
+ // 随机选择一个建筑
+ Thing selectedBuilding = validBuildings.RandomElement();
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] Randomly selected {selectedBuilding.Label} from {validBuildings.Count} valid targets");
+ }
+
+ return selectedBuilding;
+ }
+
+ ///
+ /// 检查是否有效的考察目标
+ ///
+ private bool IsValidInspectionTarget(Thing thing, Pawn pawn)
+ {
+ // 基本检查
+ if (thing == null || thing.Destroyed)
+ return false;
+
+ // 检查是否玩家拥有
+ if (thing.Faction != Faction.OfPlayer)
+ return false;
+
+ // 检查是否可到达
+ if (!pawn.CanReach(thing, PathEndMode.Touch, Danger.None))
+ return false;
+
+ // 排除一些不适合的建筑类型
+ if (thing.def.IsFrame || thing.def.IsBlueprint)
+ return false;
+
+ // 确保建筑是完整的
+ if (thing is Building building && (building.IsBurning() || building.IsBrokenDown()))
+ return false;
+
+ // 确保不是禁止进入的区域
+ if (thing.IsForbidden(pawn))
+ return false;
+
+ // 确保没有其他 Pawn 正在考察这个建筑
+ if (IsBeingInspectedByOther(thing, pawn))
+ return false;
+
+ // 排除墙壁建筑
+ if (IsWall(thing))
+ return false;
+
+ // 距离检查(可选,但为了性能考虑可以保留)
+ if (pawn.Position.DistanceTo(thing.Position) > MaxDistance)
+ return false;
+
+ return true;
+ }
+
+ ///
+ /// 检查是否为墙壁
+ ///
+ private bool IsWall(Thing thing)
+ {
+ // 检查建筑的 def 中是否有 isWall 标签
+ if (thing.def?.building != null && thing.def.building.isWall)
+ {
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] Excluding wall: {thing.Label}");
+ }
+ return true;
+ }
+
+ // 额外的检查:通过 defName 或标签判断
+ if (thing.def?.defName == "Wall" ||
+ (thing.def?.thingCategories?.Any(c => c.defName == "Walls") ?? false))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ ///
+ /// 检查是否有其他 Pawn 正在考察这个建筑
+ ///
+ private bool IsBeingInspectedByOther(Thing thing, Pawn currentPawn)
+ {
+ foreach (Pawn otherPawn in thing.Map.mapPawns.AllPawnsSpawned)
+ {
+ if (otherPawn != currentPawn &&
+ otherPawn.CurJob != null &&
+ otherPawn.CurJob.def == JobDefOf_WULA.WULA_InspectBuilding &&
+ otherPawn.CurJob.targetA.Thing == thing)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ ///
+ /// 清理不再存在的 Pawn 的记录
+ ///
+ public static void CleanupInspectionRecords()
+ {
+ List toRemove = new List();
+
+ foreach (var pair in lastInspectionTicks)
+ {
+ if (pair.Key.Destroyed || !pair.Key.Spawned)
+ {
+ toRemove.Add(pair.Key);
+ }
+ }
+
+ foreach (Pawn pawn in toRemove)
+ {
+ lastInspectionTicks.Remove(pawn);
+ }
+
+ if (Prefs.DevMode && toRemove.Count > 0)
+ {
+ Log.Message($"[JobGiver_InspectBuilding] Cleaned up {toRemove.Count} inspection records");
+ }
+ }
+
+ public class InspectionCleanupComponent : WorldComponent
+ {
+ private int lastCleanupTick = 0;
+ private const int CleanupIntervalTicks = 6000; // 每100秒清理一次
+ public InspectionCleanupComponent(World world) : base(world) { }
+ public override void WorldComponentTick()
+ {
+ base.WorldComponentTick();
+ int currentTick = Find.TickManager.TicksGame;
+ if (currentTick - lastCleanupTick > CleanupIntervalTicks)
+ {
+ JobGiver_InspectBuilding.CleanupInspectionRecords();
+ lastCleanupTick = currentTick;
+ }
+ }
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/QuestNodes/QuestNode_AddInspectionJob.cs b/Source/WulaFallenEmpire/QuestNodes/QuestNode_AddInspectionJob.cs
new file mode 100644
index 00000000..2c5fffe2
--- /dev/null
+++ b/Source/WulaFallenEmpire/QuestNodes/QuestNode_AddInspectionJob.cs
@@ -0,0 +1,221 @@
+using RimWorld;
+using RimWorld.QuestGen;
+using Verse;
+using Verse.AI;
+
+namespace WulaFallenEmpire
+{
+ public class QuestNode_AddInspectionJob : QuestNode
+ {
+ public SlateRef pawn; // 直接接收 Pawn 对象
+
+ public SlateRef inspectionJobDef; // 考察工作定义
+ public SlateRef inspectionDuration; // 考察停留时间(秒)
+ public SlateRef requirePlayerOwned; // 是否要求玩家拥有
+ public SlateRef requireAccessible; // 是否要求可到达
+
+ protected override bool TestRunInt(Slate slate)
+ {
+ if (inspectionJobDef.GetValue(slate) == null)
+ {
+ Log.Error("[QuestNode_AddInspectionJob] inspectionJobDef is null");
+ return false;
+ }
+
+ return true;
+ }
+
+ protected override void RunInt()
+ {
+ Slate slate = QuestGen.slate;
+
+ // 直接获取 Pawn 对象
+ Pawn pawnValue = pawn.GetValue(slate);
+ if (pawnValue == null)
+ {
+ Log.Error("[QuestNode_AddInspectionJob] pawn is null");
+ return;
+ }
+
+ // 检查 Pawn 是否有效且已生成
+ if (!IsPawnValidAndSpawned(pawnValue))
+ {
+ // 如果 Pawn 无效或未生成,记录调试信息但不报错
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Pawn {pawnValue.Name} is not ready for job assignment (Destroyed: {pawnValue.Destroyed}, Spawned: {pawnValue.Spawned}, Map: {pawnValue.Map?.Index ?? -1})");
+ }
+ return;
+ }
+
+ // 获取工作定义
+ JobDef jobDef = inspectionJobDef.GetValue(slate) ?? JobDefOf.Wait;
+
+ // 创建并分配工作
+ Job job = CreateInspectionJob(pawnValue, jobDef, slate);
+ if (job != null)
+ {
+ pawnValue.jobs.TryTakeOrderedJob(job, JobTag.Misc);
+
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Assigned inspection job to {pawnValue.Name} at position {pawnValue.Position}");
+ }
+ }
+ else
+ {
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Failed to create inspection job for {pawnValue.Name}");
+ }
+ }
+ }
+
+ ///
+ /// 检查 Pawn 是否有效且已生成
+ ///
+ private bool IsPawnValidAndSpawned(Pawn pawn)
+ {
+ if (pawn == null || pawn.Destroyed)
+ return false;
+
+ if (!pawn.Spawned)
+ return false;
+
+ if (pawn.Map == null)
+ return false;
+
+ return true;
+ }
+
+ ///
+ /// 创建考察工作
+ ///
+ private Job CreateInspectionJob(Pawn pawn, JobDef jobDef, Slate slate)
+ {
+ // 寻找合适的考察目标
+ Thing inspectionTarget = FindInspectionTarget(pawn, slate);
+ if (inspectionTarget == null)
+ {
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] No valid inspection target found for {pawn.Name} on map {pawn.Map}");
+ }
+ return null;
+ }
+
+ // 创建工作
+ Job job = JobMaker.MakeJob(jobDef, inspectionTarget);
+
+ // 设置停留时间(转换为 ticks)
+ float duration = inspectionDuration.GetValue(slate);
+ if (duration > 0)
+ {
+ job.expiryInterval = (int)(duration * 60f); // 秒转换为 ticks
+ }
+ else
+ {
+ job.expiryInterval = Rand.Range(180, 300); // 3-5 秒的随机时间
+ }
+
+ // 设置工作标签
+ job.def.joyDuration = job.expiryInterval;
+
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Created inspection job for {pawn.Name} at {inspectionTarget.Label} (Position: {inspectionTarget.Position})");
+ }
+
+ return job;
+ }
+
+ ///
+ /// 寻找考察目标
+ ///
+ private Thing FindInspectionTarget(Pawn pawn, Slate slate)
+ {
+ bool requirePlayerOwnedValue = requirePlayerOwned.GetValue(slate);
+ bool requireAccessibleValue = requireAccessible.GetValue(slate);
+
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Searching for inspection target for {pawn.Name}");
+ Log.Message($"[QuestNode_AddInspectionJob] Require player owned: {requirePlayerOwnedValue}, Require accessible: {requireAccessibleValue}");
+ }
+
+ // 寻找玩家拥有的建筑
+ Thing target = GenClosest.ClosestThingReachable(
+ pawn.Position,
+ pawn.Map,
+ ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial),
+ PathEndMode.Touch,
+ TraverseParms.For(pawn),
+ maxDistance: 50f,
+ validator: (Thing t) => IsValidInspectionTarget(t, pawn, requirePlayerOwnedValue, requireAccessibleValue)
+ );
+
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ if (target != null)
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Found target: {target.Label} at {target.Position}");
+ }
+ else
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] No target found within range");
+ }
+ }
+
+ return target;
+ }
+
+ ///
+ /// 检查是否有效的考察目标
+ ///
+ private bool IsValidInspectionTarget(Thing thing, Pawn pawn, bool requirePlayerOwned, bool requireAccessible)
+ {
+ // 基本检查
+ if (thing == null || thing.Destroyed)
+ return false;
+
+ // 检查是否玩家拥有
+ if (requirePlayerOwned && thing.Faction != Faction.OfPlayer)
+ {
+ if (QuestGen.slate.Get("debugLogging", false) && thing.Faction != null)
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Target {thing.Label} faction: {thing.Faction.Name}, required: Player");
+ }
+ return false;
+ }
+
+ // 检查是否可到达
+ if (requireAccessible && !pawn.CanReach(thing, PathEndMode.Touch, Danger.None))
+ {
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Target {thing.Label} at {thing.Position} is not reachable by {pawn.Name}");
+ }
+ return false;
+ }
+
+ // 排除一些不适合的建筑类型
+ if (thing.def.IsFrame || thing.def.IsBlueprint)
+ return false;
+
+ // 确保建筑是完整的
+ if (thing is Building building && (building.IsBurning() || building.IsBrokenDown()))
+ return false;
+
+ // 确保不是禁止进入的区域
+ if (thing.IsForbidden(pawn))
+ return false;
+
+ if (QuestGen.slate.Get("debugLogging", false))
+ {
+ Log.Message($"[QuestNode_AddInspectionJob] Target {thing.Label} at {thing.Position} is valid");
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/QuestNodes/QuestNode_GeneratePawnWithCustomization.cs b/Source/WulaFallenEmpire/QuestNodes/QuestNode_GeneratePawnWithCustomization.cs
new file mode 100644
index 00000000..43e03a23
--- /dev/null
+++ b/Source/WulaFallenEmpire/QuestNodes/QuestNode_GeneratePawnWithCustomization.cs
@@ -0,0 +1,194 @@
+using System.Collections.Generic;
+using System.Linq;
+using RimWorld;
+using RimWorld.Planet;
+using RimWorld.QuestGen;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ public class QuestNode_GeneratePawnWithCustomization : QuestNode
+ {
+ [NoTranslate]
+ public SlateRef storeAs;
+
+ [NoTranslate]
+ public SlateRef addToList;
+
+ [NoTranslate]
+ public SlateRef> addToLists;
+
+ public SlateRef kindDef;
+
+ public SlateRef faction;
+
+ public SlateRef forbidAnyTitle;
+
+ public SlateRef ensureNonNumericName;
+
+ public SlateRef> forcedTraits;
+
+ public SlateRef> prohibitedTraits;
+
+ public SlateRef extraPawnForExtraRelationChance;
+
+ public SlateRef relationWithExtraPawnChanceFactor;
+
+ public SlateRef allowAddictions;
+
+ public SlateRef biocodeWeaponChance;
+
+ public SlateRef biocodeApparelChance;
+
+ public SlateRef mustBeCapableOfViolence;
+
+ public SlateRef isChild;
+
+ public SlateRef allowPregnant;
+
+ public SlateRef fixedGender;
+
+ public SlateRef giveDependentDrugs;
+
+ // 只保留自定义背景故事功能
+ public SlateRef childhoodBackstory;
+ public SlateRef adulthoodBackstory;
+ public SlateRef useCustomBackstories;
+
+ private const int MinExpertSkill = 11;
+
+ protected override bool TestRunInt(Slate slate)
+ {
+ return true;
+ }
+
+ protected virtual DevelopmentalStage GetDevelopmentalStage(Slate slate)
+ {
+ if (!Find.Storyteller.difficulty.ChildrenAllowed || !isChild.GetValue(slate))
+ {
+ return DevelopmentalStage.Adult;
+ }
+ return DevelopmentalStage.Child;
+ }
+
+ protected override void RunInt()
+ {
+ Slate slate = QuestGen.slate;
+ PawnKindDef value = kindDef.GetValue(slate);
+ Faction value2 = faction.GetValue(slate);
+ bool flag = allowAddictions.GetValue(slate) ?? true;
+ bool value3 = allowPregnant.GetValue(slate);
+ IEnumerable value4 = forcedTraits.GetValue(slate);
+ IEnumerable value5 = prohibitedTraits.GetValue(slate);
+ float value6 = biocodeWeaponChance.GetValue(slate);
+ bool value7 = mustBeCapableOfViolence.GetValue(slate);
+ Pawn value8 = extraPawnForExtraRelationChance.GetValue(slate);
+ float value9 = relationWithExtraPawnChanceFactor.GetValue(slate);
+ Gender? value10 = fixedGender.GetValue(slate);
+ float value11 = biocodeApparelChance.GetValue(slate);
+ DevelopmentalStage developmentalStage = GetDevelopmentalStage(slate);
+
+ // 获取自定义背景故事设置
+ BackstoryDef childhoodBackstoryValue = childhoodBackstory.GetValue(slate);
+ BackstoryDef adulthoodBackstoryValue = adulthoodBackstory.GetValue(slate);
+ bool useCustomBackstoriesValue = useCustomBackstories.GetValue(slate);
+
+ PawnGenerationRequest request = new PawnGenerationRequest(
+ value, value2, PawnGenerationContext.NonPlayer, null,
+ forceGenerateNewPawn: false, allowDead: false, allowDowned: false,
+ canGeneratePawnRelations: true, value7, 1f, forceAddFreeWarmLayerIfNeeded: false,
+ allowGay: true, value3, allowFood: true, flag, inhabitant: false,
+ certainlyBeenInCryptosleep: false, forceRedressWorldPawnIfFormerColonist: false,
+ worldPawnFactionDoesntMatter: false, value6, value11, value8, value9,
+ null, null, value4, value5, null, null, null, value10, null, null, null,
+ null, forceNoIdeo: false, forceNoBackstory: false, forbidAnyTitle: false,
+ forceDead: false, null, null, null, null, null, 0f, developmentalStage);
+
+ request.BiocodeApparelChance = biocodeApparelChance.GetValue(slate);
+ request.ForbidAnyTitle = forbidAnyTitle.GetValue(slate);
+
+ Pawn pawn = PawnGenerator.GeneratePawn(request);
+
+ // 确保名字不是数字(如果设置了)
+ if (ensureNonNumericName.GetValue(slate) && (pawn.Name == null || pawn.Name.Numerical))
+ {
+ pawn.Name = PawnBioAndNameGenerator.GeneratePawnName(pawn);
+ }
+
+ // 应用自定义背景故事
+ if (useCustomBackstoriesValue)
+ {
+ ApplyCustomBackstories(pawn, childhoodBackstoryValue, adulthoodBackstoryValue);
+ }
+
+ if (giveDependentDrugs.GetValue(slate) && ModsConfig.BiotechActive && pawn.genes != null)
+ {
+ foreach (Gene item in pawn.genes.GenesListForReading)
+ {
+ if (item.Active)
+ {
+ Gene_ChemicalDependency dep = item as Gene_ChemicalDependency;
+ if (dep != null && DefDatabase.AllDefs.Where((ThingDef x) => x.IsDrug && x.GetCompProperties().chemical == dep.def.chemical).TryRandomElementByWeight((ThingDef x) => x.generateCommonality, out var result))
+ {
+ Thing thing = ThingMaker.MakeThing(result);
+ thing.stackCount = Rand.Range(1, 3);
+ pawn.inventory.innerContainer.TryAddOrTransfer(thing);
+ }
+ }
+ }
+ }
+
+ if (storeAs.GetValue(slate) != null)
+ {
+ QuestGen.slate.Set(storeAs.GetValue(slate), pawn);
+ }
+
+ if (addToList.GetValue(slate) != null)
+ {
+ QuestGenUtility.AddToOrMakeList(QuestGen.slate, addToList.GetValue(slate), pawn);
+ }
+
+ if (addToLists.GetValue(slate) != null)
+ {
+ foreach (string item2 in addToLists.GetValue(slate))
+ {
+ QuestGenUtility.AddToOrMakeList(QuestGen.slate, item2, pawn);
+ }
+ }
+
+ QuestGen.AddToGeneratedPawns(pawn);
+ if (!pawn.IsWorldPawn())
+ {
+ Find.WorldPawns.PassToWorld(pawn);
+ }
+ }
+
+ ///
+ /// 应用自定义背景故事
+ ///
+ private void ApplyCustomBackstories(Pawn pawn, BackstoryDef childhood, BackstoryDef adulthood)
+ {
+ if (childhood != null)
+ {
+ pawn.story.Childhood = childhood;
+ }
+
+ if (adulthood != null)
+ {
+ pawn.story.Adulthood = adulthood;
+ }
+
+ // 重新计算技能,因为背景故事会影响技能
+ if (pawn.skills != null)
+ {
+ pawn.skills.Notify_SkillDisablesChanged();
+ }
+
+ // 重新计算工作类型
+ if (pawn.workSettings != null)
+ {
+ pawn.workSettings.Notify_DisabledWorkTypesChanged();
+ }
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/Storyteller/StorytellerCompProperties_ImportantQuestWithFactionFilter.cs b/Source/WulaFallenEmpire/Storyteller/WULA_ImportantQuestWithFactionFilter/StorytellerCompProperties_ImportantQuestWithFactionFilter.cs
similarity index 100%
rename from Source/WulaFallenEmpire/Storyteller/StorytellerCompProperties_ImportantQuestWithFactionFilter.cs
rename to Source/WulaFallenEmpire/Storyteller/WULA_ImportantQuestWithFactionFilter/StorytellerCompProperties_ImportantQuestWithFactionFilter.cs
diff --git a/Source/WulaFallenEmpire/Storyteller/StorytellerComp_ImportantQuestWithFactionFilter.cs b/Source/WulaFallenEmpire/Storyteller/WULA_ImportantQuestWithFactionFilter/StorytellerComp_ImportantQuestWithFactionFilter.cs
similarity index 100%
rename from Source/WulaFallenEmpire/Storyteller/StorytellerComp_ImportantQuestWithFactionFilter.cs
rename to Source/WulaFallenEmpire/Storyteller/WULA_ImportantQuestWithFactionFilter/StorytellerComp_ImportantQuestWithFactionFilter.cs
diff --git a/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerCompProperties_SimpleTechnologyTrigger.cs b/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerCompProperties_SimpleTechnologyTrigger.cs
new file mode 100644
index 00000000..e4e880d9
--- /dev/null
+++ b/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerCompProperties_SimpleTechnologyTrigger.cs
@@ -0,0 +1,40 @@
+using RimWorld;
+using System.Collections.Generic;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ public class StorytellerCompProperties_SimpleTechnologyTrigger : StorytellerCompProperties
+ {
+ // 必需配置
+ public ResearchProjectDef technology; // 要检测的科技
+ public IncidentDef incident; // 要触发的事件
+
+ // 时间配置
+ public float fireAfterDaysPassed = 0f; // 游戏开始后多少天开始检测
+ public float checkIntervalDays = 5f; // 检查间隔(天)
+
+ // 任务相关配置
+ public QuestScriptDef questDef; // 关联的任务定义(可选)
+ public bool preventDuplicateQuests = true; // 防止重复任务
+
+ // 派系关系校验 - 新增字段
+ public FactionDef requiredFaction; // 必须存在的派系
+ public bool requireNonHostileRelation = true; // 是否要求非敌对关系(默认true)
+ public bool requireFactionExists = true; // 是否要求派系必须存在(默认true)
+
+ // 调试配置
+ public bool debugLogging = false; // 启用调试日志
+
+ // 派系过滤(可选)
+ public List factionTypeWhitelist;
+ public List factionTypeBlacklist;
+ public bool useFactionFilter = false;
+ public FactionFilterDefaultBehavior defaultBehavior = FactionFilterDefaultBehavior.Allow;
+
+ public StorytellerCompProperties_SimpleTechnologyTrigger()
+ {
+ compClass = typeof(StorytellerComp_SimpleTechnologyTrigger);
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerComp_SimpleTechnologyTrigger.cs b/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerComp_SimpleTechnologyTrigger.cs
new file mode 100644
index 00000000..fca17fde
--- /dev/null
+++ b/Source/WulaFallenEmpire/Storyteller/WULA_SimpleTechnologyTrigger/StorytellerComp_SimpleTechnologyTrigger.cs
@@ -0,0 +1,308 @@
+using RimWorld;
+using System.Collections.Generic;
+using Verse;
+using System.Linq;
+using System.Text;
+using RimWorld.Planet;
+
+namespace WulaFallenEmpire
+{
+ public class StorytellerComp_SimpleTechnologyTrigger : StorytellerComp
+ {
+ private StorytellerCompProperties_SimpleTechnologyTrigger SimpleProps =>
+ (StorytellerCompProperties_SimpleTechnologyTrigger)props;
+
+ // 重新实现基类的私有属性
+ private static int IntervalsPassed => Find.TickManager.TicksGame / 1000;
+
+ public override IEnumerable MakeIntervalIncidents(IIncidentTarget target)
+ {
+ // 检查基础条件(天数)
+ if (IntervalsPassed <= SimpleProps.fireAfterDaysPassed * 60)
+ yield break;
+
+ // 检查是否满足周期
+ if (!PassesIntervalCheck())
+ yield break;
+
+ // 检查派系关系条件 - 新增检查
+ if (!PassesRequiredFactionCheck())
+ yield break;
+
+ // 检查派系过滤条件
+ if (!PassesFactionFilter(target))
+ yield break;
+
+ // 检查科技条件
+ if (!PassesTechnologyCheck())
+ yield break;
+
+ // 检查是否防止重复任务
+ if (SimpleProps.preventDuplicateQuests && HasActiveQuest())
+ yield break;
+
+ // 触发事件
+ IncidentDef techIncident = SimpleProps.incident;
+ if (techIncident.TargetAllowed(target))
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Triggering incident {techIncident.defName} for technology {SimpleProps.technology.defName}");
+ }
+
+ yield return new FiringIncident(techIncident, this, GenerateParms(techIncident.category, target));
+ }
+ }
+
+ ///
+ /// 检查必需派系关系条件 - 新增方法
+ ///
+ private bool PassesRequiredFactionCheck()
+ {
+ // 如果没有配置必需派系,直接通过
+ if (SimpleProps.requiredFaction == null)
+ return true;
+
+ // 查找派系
+ Faction requiredFactionInstance = Find.FactionManager.FirstFactionOfDef(SimpleProps.requiredFaction);
+
+ // 检查派系是否存在
+ if (SimpleProps.requireFactionExists)
+ {
+ if (requiredFactionInstance == null || requiredFactionInstance.defeated)
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Required faction {SimpleProps.requiredFaction.defName} does not exist or is defeated");
+ }
+ return false;
+ }
+ }
+
+ // 检查派系关系
+ if (SimpleProps.requireNonHostileRelation && requiredFactionInstance != null)
+ {
+ Faction playerFaction = Faction.OfPlayer;
+ if (requiredFactionInstance.HostileTo(playerFaction))
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Required faction {SimpleProps.requiredFaction.defName} is hostile to player");
+ }
+ return false;
+ }
+ }
+
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Required faction {SimpleProps.requiredFaction.defName} check passed");
+ }
+
+ return true;
+ }
+
+ ///
+ /// 检查是否满足触发周期
+ ///
+ private bool PassesIntervalCheck()
+ {
+ // 简单的周期检查:每 X 天检查一次
+ int currentInterval = IntervalsPassed;
+ int checkInterval = (int)(SimpleProps.checkIntervalDays * 60);
+
+ // 如果检查间隔为0,则每个间隔都检查
+ if (checkInterval <= 0)
+ return true;
+
+ return currentInterval % checkInterval == 0;
+ }
+
+ ///
+ /// 检查科技条件
+ ///
+ private bool PassesTechnologyCheck()
+ {
+ if (SimpleProps.technology == null)
+ {
+ Log.Error("[SimpleTechnologyTrigger] No technology specified in props");
+ return false;
+ }
+
+ // 简单检查科技是否已研究完成
+ bool hasTechnology = SimpleProps.technology.IsFinished;
+
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Technology {SimpleProps.technology.defName} research status: {hasTechnology}");
+ }
+
+ return hasTechnology;
+ }
+
+ ///
+ /// 检查派系过滤条件
+ ///
+ private bool PassesFactionFilter(IIncidentTarget target)
+ {
+ // 如果不启用派系过滤,直接通过
+ if (!SimpleProps.useFactionFilter)
+ return true;
+
+ // 获取目标的派系
+ Faction faction = GetTargetFaction(target);
+ if (faction == null)
+ return false;
+
+ // 检查黑名单
+ if (SimpleProps.factionTypeBlacklist != null &&
+ SimpleProps.factionTypeBlacklist.Contains(faction.def))
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Faction {faction.def.defName} is in blacklist");
+ }
+ return false;
+ }
+
+ // 检查白名单
+ if (SimpleProps.factionTypeWhitelist != null &&
+ SimpleProps.factionTypeWhitelist.Count > 0)
+ {
+ bool inWhitelist = SimpleProps.factionTypeWhitelist.Contains(faction.def);
+
+ switch (SimpleProps.defaultBehavior)
+ {
+ case FactionFilterDefaultBehavior.Allow:
+ // 白名单模式:在白名单中或默认允许
+ if (SimpleProps.debugLogging && !inWhitelist)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Faction {faction.def.defName} not in whitelist, but default behavior is Allow");
+ }
+ return true;
+ case FactionFilterDefaultBehavior.Deny:
+ // 白名单模式:只有在白名单中才允许
+ if (inWhitelist)
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Faction {faction.def.defName} is in whitelist");
+ }
+ return true;
+ }
+ else
+ {
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Faction {faction.def.defName} not in whitelist and default behavior is Deny");
+ }
+ return false;
+ }
+ }
+ }
+
+ // 如果没有设置白名单,根据默认行为决定
+ switch (SimpleProps.defaultBehavior)
+ {
+ case FactionFilterDefaultBehavior.Allow:
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] No whitelist, default behavior is Allow");
+ }
+ return true;
+ case FactionFilterDefaultBehavior.Deny:
+ if (SimpleProps.debugLogging)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] No whitelist, default behavior is Deny");
+ }
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ ///
+ /// 获取目标的派系
+ ///
+ private Faction GetTargetFaction(IIncidentTarget target)
+ {
+ if (target is Map map)
+ {
+ return map.ParentFaction ?? Faction.OfPlayer;
+ }
+ else if (target is World world)
+ {
+ return Faction.OfPlayer;
+ }
+ else if (target is Caravan caravan)
+ {
+ return caravan.Faction;
+ }
+
+ return Faction.OfPlayer;
+ }
+
+ ///
+ /// 检查是否存在活跃的相同任务
+ ///
+ private bool HasActiveQuest()
+ {
+ if (SimpleProps.questDef == null)
+ return false;
+
+ bool hasActiveQuest = Find.QuestManager.QuestsListForReading.Any((Quest q) =>
+ q.root == SimpleProps.questDef && !q.Historical);
+
+ if (SimpleProps.debugLogging && hasActiveQuest)
+ {
+ Log.Message($"[SimpleTechnologyTrigger] Active quest {SimpleProps.questDef.defName} found, skipping trigger");
+ }
+
+ return hasActiveQuest;
+ }
+
+ ///
+ /// 调试方法:显示当前科技触发状态
+ ///
+ public string GetSimpleTechnologyTriggerStatus()
+ {
+ StringBuilder status = new StringBuilder();
+ status.AppendLine($"Simple Technology Trigger: {SimpleProps.technology?.defName ?? "NULL"}");
+ status.AppendLine($"Research Status: {(PassesTechnologyCheck() ? "✅ COMPLETED" : "❌ NOT COMPLETED")}");
+ status.AppendLine($"Required Faction: {SimpleProps.requiredFaction?.defName ?? "NONE"}");
+ status.AppendLine($"Faction Relation: {(PassesRequiredFactionCheck() ? "✅ VALID" : "❌ INVALID")}");
+ status.AppendLine($"Check Interval: {SimpleProps.checkIntervalDays} days");
+ status.AppendLine($"Current Interval: {IntervalsPassed}");
+ status.AppendLine($"Next Check: {GetNextCheckInterval()} intervals");
+ status.AppendLine($"Can Trigger Now: {PassesIntervalCheck() && PassesTechnologyCheck() && PassesRequiredFactionCheck()}");
+
+ // 详细派系信息
+ if (SimpleProps.requiredFaction != null)
+ {
+ Faction faction = Find.FactionManager.FirstFactionOfDef(SimpleProps.requiredFaction);
+ if (faction != null)
+ {
+ status.AppendLine($"Required Faction Status: {(faction.defeated ? "DEFEATED" : "ACTIVE")}");
+ status.AppendLine($"Relation with Player: {(faction.HostileTo(Faction.OfPlayer) ? "HOSTILE" : "NON-HOSTILE")}");
+ }
+ else
+ {
+ status.AppendLine($"Required Faction Status: NOT FOUND IN GAME");
+ }
+ }
+
+ return status.ToString();
+ }
+
+ ///
+ /// 计算下一次检查的间隔
+ ///
+ private int GetNextCheckInterval()
+ {
+ int checkInterval = (int)(SimpleProps.checkIntervalDays * 60);
+ if (checkInterval <= 0) return 0;
+
+ int currentInterval = IntervalsPassed;
+ return ((currentInterval / checkInterval) + 1) * checkInterval;
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/WulaDefOf.cs b/Source/WulaFallenEmpire/WulaDefOf.cs
index 9f9adc77..62b68b75 100644
--- a/Source/WulaFallenEmpire/WulaDefOf.cs
+++ b/Source/WulaFallenEmpire/WulaDefOf.cs
@@ -23,6 +23,7 @@ namespace WulaFallenEmpire
{
public static JobDef WULA_EnterMaintenancePod;
public static JobDef WULA_HaulToMaintenancePod;
+ public static JobDef WULA_InspectBuilding;
static JobDefOf_WULA()
{
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index 61d88bb1..c3279e8a 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -177,6 +177,8 @@
+
+
@@ -228,14 +230,18 @@
+
+
-
-
+
+
+
+
diff --git a/美术与文本源文件/Wula/Apparel/WULA_Eggplant_Hat_south.sai2 b/美术与文本源文件/Wula/Apparel/WULA_Eggplant_Hat_south.sai2
new file mode 100644
index 00000000..8691b541
Binary files /dev/null and b/美术与文本源文件/Wula/Apparel/WULA_Eggplant_Hat_south.sai2 differ
diff --git a/美术与文本源文件/Wula/Apparel/WULA_Legion_Cloth_Thin_south.sai2 b/美术与文本源文件/Wula/Apparel/WULA_Legion_Cloth_Thin_south.sai2
new file mode 100644
index 00000000..ba8877ad
Binary files /dev/null and b/美术与文本源文件/Wula/Apparel/WULA_Legion_Cloth_Thin_south.sai2 differ
diff --git a/美术与文本源文件/Wula/Apparel/WULA_Maid_Uniform_Headband.sai2 b/美术与文本源文件/Wula/Apparel/WULA_Maid_Uniform_Headband.sai2
index b49d8036..7675838b 100644
Binary files a/美术与文本源文件/Wula/Apparel/WULA_Maid_Uniform_Headband.sai2 and b/美术与文本源文件/Wula/Apparel/WULA_Maid_Uniform_Headband.sai2 differ
diff --git a/美术与文本源文件/Wula/Projectile/WULA_Mortar_Shell.png b/美术与文本源文件/Wula/Projectile/WULA_Mortar_Shell.png
deleted file mode 100644
index 6c01ec2f..00000000
Binary files a/美术与文本源文件/Wula/Projectile/WULA_Mortar_Shell.png and /dev/null differ