diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 6370f9f6..d9046afa 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/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml
index 3cb469e6..800e3aa2 100644
--- 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
@@ -4,6 +4,6 @@
questName->什一税税收
- questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国每隔30天收一次什一税,什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果拖延,则每延期一天都会惹其不快,最后甚至有可能被定性为叛国!
+ questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国每隔10天收一次什一税,什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果拖延,则每延期一天都会惹其不快,最后甚至有可能被定性为叛国!
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_FE_Manpack_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_FE_Manpack_Weapon.xml
deleted file mode 100644
index 0386153d..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_FE_Manpack_Weapon.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Flyover_Ability.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Flyover_Ability.xml
deleted file mode 100644
index e669e0a1..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Flyover_Ability.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Ability.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Ability.xml
deleted file mode 100644
index 62689eb7..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Ability.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Hediffs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Hediffs.xml
deleted file mode 100644
index d785aa96..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/AbilityDef/WULA_Misc_Hediffs.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ApparelLayerDef/WULA_Apparel.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ApparelLayerDef/WULA_Apparel.xml
deleted file mode 100644
index 3b7addd9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ApparelLayerDef/WULA_Apparel.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Adult_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Adult_WULA.xml
deleted file mode 100644
index 68b3d167..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Adult_WULA.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Child_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Child_WULA.xml
deleted file mode 100644
index 2e0263d8..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/BackstoryDef/Solid_Child_WULA.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/BodyDef/Bodyparts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/BodyDef/Bodyparts_WULA.xml
deleted file mode 100644
index c873540c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/BodyDef/Bodyparts_WULA.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/BodyPartDef/Bodyparts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/BodyPartDef/Bodyparts_WULA.xml
deleted file mode 100644
index e3dafc8c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/BodyPartDef/Bodyparts_WULA.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/Damages_Wula.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/Damages_Wula.xml
deleted file mode 100644
index 47017478..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/Damages_Wula.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/WULA_FE_Manpack_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/WULA_FE_Manpack_Weapon.xml
deleted file mode 100644
index 8f8b10c4..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/DamageDef/WULA_FE_Manpack_Weapon.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/DesignationCategoryDef/WULA_DesignationCategoryDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/DesignationCategoryDef/WULA_DesignationCategoryDefs.xml
deleted file mode 100644
index 316e52c8..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/DesignationCategoryDef/WULA_DesignationCategoryDefs.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/FacialAnimation.EyeballShapeDef/EyeShape.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/FacialAnimation.EyeballShapeDef/EyeShape.xml
deleted file mode 100644
index 66e076c2..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/FacialAnimation.EyeballShapeDef/EyeShape.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/FactionDef/WULA_Factions.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/FactionDef/WULA_Factions.xml
deleted file mode 100644
index 41f378ba..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/FactionDef/WULA_Factions.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HairDef/WULA_Hairs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HairDef/WULA_Hairs.xml
deleted file mode 100644
index 1c30fadd..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HairDef/WULA_Hairs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_BodyParts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_BodyParts_WULA.xml
deleted file mode 100644
index 594a13fb..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_BodyParts_WULA.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_WULA_Damage_Effect.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_WULA_Damage_Effect.xml
deleted file mode 100644
index 2c901b50..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Hediffs_WULA_Damage_Effect.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Solid_Child_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Solid_Child_WULA.xml
deleted file mode 100644
index 82f0d695..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/Solid_Child_WULA.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Apparel.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Apparel.xml
deleted file mode 100644
index 7de4d817..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Apparel.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FE_Manpack_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FE_Manpack_Weapon.xml
deleted file mode 100644
index bad82c25..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FE_Manpack_Weapon.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FM_Hediffs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FM_Hediffs.xml
deleted file mode 100644
index 564e0fce..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_FM_Hediffs.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Misc_Hediffs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Misc_Hediffs.xml
deleted file mode 100644
index 012530a3..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HediffDef/WULA_Misc_Hediffs.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Base_Tex_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Base_Tex_Quest.xml
deleted file mode 100644
index b76ff0b6..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Base_Tex_Quest.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Sky_Lock.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Sky_Lock.xml
deleted file mode 100644
index 1d329051..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Sky_Lock.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Super_Fortress.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Super_Fortress.xml
deleted file mode 100644
index eb1884e9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Boss_Super_Fortress.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Progressive_Ship_Attack_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Progressive_Ship_Attack_Quest.xml
deleted file mode 100644
index 3242ff25..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Progressive_Ship_Attack_Quest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index 327054e0..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/HistoryEventDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Base_Tex_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Base_Tex_Quest.xml
deleted file mode 100644
index 822940bf..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Base_Tex_Quest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Colony_Promotion.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Colony_Promotion.xml
deleted file mode 100644
index 8b4bc0f9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Colony_Promotion.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Hostile_PIA_Attack_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Hostile_PIA_Attack_Quest.xml
deleted file mode 100644
index 97c65ed7..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Hostile_PIA_Attack_Quest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_NewColony.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_NewColony.xml
deleted file mode 100644
index e0a5142b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_NewColony.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_Spy.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_Spy.xml
deleted file mode 100644
index 155eb9fe..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Intro_Spy.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Progressive_Ship_Attack_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Progressive_Ship_Attack_Quest.xml
deleted file mode 100644
index 256372fb..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Progressive_Ship_Attack_Quest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index ab54f3ec..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/IncidentDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_GlobalWorkTable_Jobs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_GlobalWorkTable_Jobs.xml
deleted file mode 100644
index 28efe693..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_GlobalWorkTable_Jobs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_JobDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_JobDefs.xml
deleted file mode 100644
index ad9149d4..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/JobDef/WULA_JobDefs.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/LifeStageDef/LifeStages_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/LifeStageDef/LifeStages_WULA.xml
deleted file mode 100644
index d20db79b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/LifeStageDef/LifeStages_WULA.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/MapGeneratorDef/MapGenerator_WULA_PocketSpace_Small.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/MapGeneratorDef/MapGenerator_WULA_PocketSpace_Small.xml
deleted file mode 100644
index c40a48a4..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/MapGeneratorDef/MapGenerator_WULA_PocketSpace_Small.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/MentalBreakDef/MentalBreaks_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/MentalBreakDef/MentalBreaks_WULA.xml
deleted file mode 100644
index 326c951d..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/MentalBreakDef/MentalBreaks_WULA.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/MentalStateDef/MentalStates_WULA_Broken.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/MentalStateDef/MentalStates_WULA_Broken.xml
deleted file mode 100644
index f129b94c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/MentalStateDef/MentalStates_WULA_Broken.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/NeedDef/WULA_Needs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/NeedDef/WULA_Needs.xml
deleted file mode 100644
index 27ad9598..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/NeedDef/WULA_Needs.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnColumnDef/PawnTables_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/PawnColumnDef/PawnTables_WULA.xml
deleted file mode 100644
index 03f4e566..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnColumnDef/PawnTables_WULA.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/PawnKinds_Wula.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/PawnKinds_Wula.xml
deleted file mode 100644
index 1da63973..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/PawnKinds_Wula.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/Races_Wulaspecies.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/Races_Wulaspecies.xml
deleted file mode 100644
index d50d7850..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnKindDef/Races_Wulaspecies.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnsArrivalModeDef/WULA_PawnsArrivalModes.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/PawnsArrivalModeDef/WULA_PawnsArrivalModes.xml
deleted file mode 100644
index bdf6e172..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/PawnsArrivalModeDef/WULA_PawnsArrivalModes.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Sky_Lock.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Sky_Lock.xml
deleted file mode 100644
index 07652a3a..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Sky_Lock.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Super_Fortress.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Super_Fortress.xml
deleted file mode 100644
index d14a260b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Boss_Super_Fortress.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index 3f0e1eec..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestEditor_Library.CustomMapDataDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml
deleted file mode 100644
index 4abff1a9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Base_Tex_Quest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
- questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国每隔10天收一次什一税,什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果拖延,则每延期一天都会惹其不快,最后甚至有可能被定性为叛国!
-
-
-
- questName->什一税税收
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Sky_Lock.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Sky_Lock.xml
deleted file mode 100644
index 478d37bb..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Sky_Lock.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
- questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个特殊的请求,一台部署在运输舰上的乌拉帝国战争机械——<color=#AA74E5><i>灵能泰坦</i></color>——因为失控而无差别攻击,行星封锁机关不得不让运输舰坠向星球表面以阻止事态扩大。\n\n可惜的是,<color=#AA74E5><i>灵能泰坦</i></color>没有因为运输舰坠毁而受到伤害,其仍然在星球表面大肆杀戮,殖民地必须直面这台骇人的巨兽。行星封锁机关为殖民地提供了以下信息:\n\n<color=#9F0400><i>-内驱回路</i></color> PAt-6"灵能泰坦"虽然是一台强大的灵能战争机器,但是其灵能回路是以封闭循环的方式刻印的,外部的灵能攻击无法影响它\n<color=#9F0400><i>-死亡使者</i></color> PAt-6"灵能泰坦"的灵能尖啸可以无差别粉碎所有的目标,除非有足够的信心和手段控制住它,否则不要与其正面交锋\n<color=#9F0400><i>-连环天锁</i></color> PAt-6"灵能泰坦"一定会和天锁一起出现,天锁是纯粹的灵能造物,可以吸收灵能泰坦受到的伤害。在所有的天锁被摧毁前,灵能泰坦不会受到伤害。\n<color=#9F0400><i>-网络控制</i></color> PAt-6"灵能泰坦"的控制了附近在坠毁中幸存的战车集群,因此坠毁地区很可能不只有一个敌人\n\n行星封锁机关承诺,一旦击败了暴走的<color=#AA74E5><i>灵能泰坦</i></color>,她们可以回收其灵能回路的核心,以此为殖民地建造一台全新的灵能泰坦。
-
-
-
- questName->特殊任务:击毁灵能泰坦
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Super_Fortress.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Super_Fortress.xml
deleted file mode 100644
index 84070a11..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Boss_Super_Fortress.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
- questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个特殊的请求,一座装备了火山炮的<color=#C87451><i>巨型要塞</i></color>被发现,它不处于行星封锁机关的控制下,很可能是叛军的一个根据地,你的殖民地必须使用一切力量将其消灭。行星封锁机关为殖民地提供了以下信息:\n\n<color=#9F0400><i>-先发制人</i></color> 这个要塞已经被乌拉帝国舰队的EMP炮弹攻击过,需要一段时间才能重启防御系统——但是从轰炸效果来说,这个空窗时间可能不会太长\n<color=#9F0400><i>-炼狱号角</i></color> 要塞中有四门火山炮,一旦其重启完成,将对所有进攻部队造成毁灭性打击,应该优先解决\n<color=#9F0400><i>-碉楼林立</i></color> 要塞被多层防御设施所保护,正面攻击会非常花费时间,并且要塞的顶部进行了特别加厚,厚度堪比岩顶\n<color=#9F0400><i>-草木皆兵</i></color> 要塞附近很可能有别的不可见的埋伏,舰队在此处检测到的活动迹象与目视不匹配\n\n行星封锁机关承诺,一旦摧毁<color=#C87451><i>巨型要塞</i></color>,她们就会派遣舰队轰炸残余的设施,并为殖民地开放火山炮的申请权限。
-
-
-
- questName->特殊任务:清扫巨型要塞
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml
deleted file mode 100644
index 789e2e58..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Colony_Promotion.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
- questDescription->殖民地已经承接了视察任务。\n\n行星封锁机关的总控AI已经派遣了自己的一个分体和护卫队抵达殖民地。考察持续12天,她会检查殖民地方方面面的运转情况,你需要确保其心情始终高于25%。考察完成后,她和卫队会搭乘穿梭机离开,如果一切顺利你们将获得殖民地晋升的机会,以解锁更多的许可科技。\n\n小心,附近的敌对派系已经知道了殖民地来了一个大人物,这些劫掠者会尝试袭击殖民地并抓住这个分体,你可能需要面对大量袭击!
-
-
-
- questName->晋级任务:殖民地考察
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Hostile_PIA_Attack_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Hostile_PIA_Attack_Quest.xml
deleted file mode 100644
index d6005de1..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Hostile_PIA_Attack_Quest.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml
deleted file mode 100644
index a12782f1..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
- questDescription->(因为不看提示问我乌拉族科技怎么升的全部砍死)\n\n乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。
-
-
-
- questName->新殖民地
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml
deleted file mode 100644
index df12b824..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_Spy.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
- questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个请求。一位乌拉帝国密探已经暴露,正在遭受其他派系追杀——密探手无寸铁且携带重要信息,殖民地需要掩护它直到乌拉帝国的穿梭机抵达并将其接走。虽然对方未透露更多信息,不过她指明袭击不会太剧烈,密探已经甩掉了大部分敌人。
-
-
-
- questName->掩护帝国密探
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Progressive_Ship_Attack_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Progressive_Ship_Attack_Quest.xml
deleted file mode 100644
index 26800526..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Progressive_Ship_Attack_Quest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index 54c06be5..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
- questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个特殊的请求,有一个装着皇室机密的保险箱被乌拉帝国的进步派叛军控制了,殖民地必须将其回收,随后将其交回乌拉帝国舰队。如果保险箱已经被打开,就要杀光在场的所有人。\n\n目前叛军很可能在试图打开这个保险箱,你需要检查其哨站内的工作台。大约有<color=#AA3020><i>10~20个叛军合成人</i></color>被拍摄到,现场同时发现了正在运作的<color=#AA3020><i>若干炮台</i></color>。\n\n你只有5天的时间处理这个任务,取得保险箱后,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将保险箱输送到位于轨道上的舰队。
-
-
-
- questName->晋级任务:回收皇家机密
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Vacation_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Vacation_Quest.xml
deleted file mode 100644
index 0b3979e6..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Vacation_Quest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
- questDescription->行星封锁机关的总控AI在舰队上待得太闷了,想出来溜达一段时间。\n\n除非与乌拉帝国行星封锁机关敌对,否则看起来你的上司是要一直赖在殖民地了,你可以删除此任务,以免其占据任务列表。
-
-
-
- questName->特殊任务:度假
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Hediffs_BodyParts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Hediffs_BodyParts_WULA.xml
deleted file mode 100644
index bb9dc60c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Hediffs_BodyParts_WULA.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Recipes_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Recipes_WULA.xml
deleted file mode 100644
index 4c553bab..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/RecipeDef/Recipes_WULA.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchProjectDef/WULA_ResearchProjects.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchProjectDef/WULA_ResearchProjects.xml
deleted file mode 100644
index 4193c1ae..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchProjectDef/WULA_ResearchProjects.xml
+++ /dev/null
@@ -1,234 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchTabDef/ResearchTabs_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchTabDef/ResearchTabs_WULA.xml
deleted file mode 100644
index bf6d88ff..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ResearchTabDef/ResearchTabs_WULA.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/RulePackDef/RulePacks_Namers_Factions_Wula.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/RulePackDef/RulePacks_Namers_Factions_Wula.xml
deleted file mode 100644
index 92f4d9f6..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/RulePackDef/RulePacks_Namers_Factions_Wula.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ScenarioDef/Scenarios_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ScenarioDef/Scenarios_WULA.xml
deleted file mode 100644
index e727dd6a..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ScenarioDef/Scenarios_WULA.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/StatCategoryDef/WULA_Stats.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/StatCategoryDef/WULA_Stats.xml
deleted file mode 100644
index a881a9be..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/StatCategoryDef/WULA_Stats.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/StatDef/WULA_Stats.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/StatDef/WULA_Stats.xml
deleted file mode 100644
index 88cd7195..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/StatDef/WULA_Stats.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/StorytellerDef/WULA_Storytellers.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/StorytellerDef/WULA_Storytellers.xml
deleted file mode 100644
index e244065b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/StorytellerDef/WULA_Storytellers.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/StyleItemCategoryDef/WULA_StyleItemCategoryDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/StyleItemCategoryDef/WULA_StyleItemCategoryDefs.xml
deleted file mode 100644
index 042273be..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/StyleItemCategoryDef/WULA_StyleItemCategoryDefs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/TerrainDef/WULA_Drop_Buildings.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/TerrainDef/WULA_Drop_Buildings.xml
deleted file mode 100644
index e347da11..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/TerrainDef/WULA_Drop_Buildings.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Hediffs_BodyParts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Hediffs_BodyParts_WULA.xml
deleted file mode 100644
index 80970609..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Hediffs_BodyParts_WULA.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Mote_Wula.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Mote_Wula.xml
deleted file mode 100644
index 88fb04a9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Mote_Wula.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Races_Wulaspecies.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Races_Wulaspecies.xml
deleted file mode 100644
index d31367f7..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/Races_Wulaspecies.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Apparel.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Apparel.xml
deleted file mode 100644
index 340ac70e..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Apparel.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Drop_Buildings.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Drop_Buildings.xml
deleted file mode 100644
index c64f0e81..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Drop_Buildings.xml
+++ /dev/null
@@ -1,188 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Machine_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Machine_Weapon.xml
deleted file mode 100644
index 84a297c9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Machine_Weapon.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Manpack_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Manpack_Weapon.xml
deleted file mode 100644
index 3e391b6b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FE_Manpack_Weapon.xml
+++ /dev/null
@@ -1,234 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FM_Hediffs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FM_Hediffs.xml
deleted file mode 100644
index ca1fa6c1..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_FM_Hediffs.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Flyover_Item.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Flyover_Item.xml
deleted file mode 100644
index 6d8d4629..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Flyover_Item.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Item.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Item.xml
deleted file mode 100644
index 7f5024f8..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Item.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Mech_Buildings.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Mech_Buildings.xml
deleted file mode 100644
index 43c4f9a4..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Mech_Buildings.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Ability.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Ability.xml
deleted file mode 100644
index 8965c242..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Ability.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Buildings.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Buildings.xml
deleted file mode 100644
index 958b0a62..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Misc_Buildings.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Plants.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Plants.xml
deleted file mode 100644
index 1010ba2f..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Plants.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Prefab_Beacons.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Prefab_Beacons.xml
deleted file mode 100644
index 5b97dc02..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Prefab_Beacons.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index b43f4222..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_ResearchProjects.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_ResearchProjects.xml
deleted file mode 100644
index 4a7014b1..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_ResearchProjects.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Shuttle_Building.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Shuttle_Building.xml
deleted file mode 100644
index 24d380c2..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Shuttle_Building.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Turret_Buildings.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Turret_Buildings.xml
deleted file mode 100644
index 5de39d92..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Turret_Buildings.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Weapon.xml
deleted file mode 100644
index decec829..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThingDef/WULA_Weapon.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_AutonomousMech.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_AutonomousMech.xml
deleted file mode 100644
index f0fd484a..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_AutonomousMech.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_ThinkTrees.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_ThinkTrees.xml
deleted file mode 100644
index 7e578291..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThinkTreeDef/WULA_ThinkTrees.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ThoughtDef/Thoughts_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ThoughtDef/Thoughts_WULA.xml
deleted file mode 100644
index e903d4e8..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ThoughtDef/Thoughts_WULA.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/ToolCapacityDef/WULA_FE_Manpack_Weapon.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/ToolCapacityDef/WULA_FE_Manpack_Weapon.xml
deleted file mode 100644
index d78cf1dd..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/ToolCapacityDef/WULA_FE_Manpack_Weapon.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
- TODO
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/TraitDef/Traits_WULA.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/TraitDef/Traits_WULA.xml
deleted file mode 100644
index 3554a15e..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/TraitDef/Traits_WULA.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/TransportShipDef/WULA_Shuttle_Building.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/TransportShipDef/WULA_Shuttle_Building.xml
deleted file mode 100644
index b8a978c2..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/TransportShipDef/WULA_Shuttle_Building.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponCategoryDef/WULA_WeaponCategoryDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponCategoryDef/WULA_WeaponCategoryDefs.xml
deleted file mode 100644
index 6f363cd9..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponCategoryDef/WULA_WeaponCategoryDefs.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponTraitDef/WULA_WeaponTraitDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponTraitDef/WULA_WeaponTraitDefs.xml
deleted file mode 100644
index 1962ce5b..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WeaponTraitDef/WULA_WeaponTraitDefs.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/WULA_GlobalWorkTable_Jobs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/WULA_GlobalWorkTable_Jobs.xml
deleted file mode 100644
index 9bfae012..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/WULA_GlobalWorkTable_Jobs.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/Wula_WorkGivers.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/Wula_WorkGivers.xml
deleted file mode 100644
index be9442bc..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WorkGiverDef/Wula_WorkGivers.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WorldObjectDef/WULA_Shuttle_Building.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WorldObjectDef/WULA_Shuttle_Building.xml
deleted file mode 100644
index b86edcce..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WorldObjectDef/WULA_Shuttle_Building.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Base_Tex_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Base_Tex_Quest.xml
deleted file mode 100644
index cb77e712..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Base_Tex_Quest.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Sky_Lock.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Sky_Lock.xml
deleted file mode 100644
index 887f1125..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Sky_Lock.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Super_Fortress.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Super_Fortress.xml
deleted file mode 100644
index ac07c61c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Boss_Super_Fortress.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Colony_Promotion.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Colony_Promotion.xml
deleted file mode 100644
index 674dbd10..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Colony_Promotion.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_NewColony.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_NewColony.xml
deleted file mode 100644
index eb3dcdb8..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_NewColony.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_Spy.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_Spy.xml
deleted file mode 100644
index 086bfcae..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Intro_Spy.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Recycle_PIA_Legion_File.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Recycle_PIA_Legion_File.xml
deleted file mode 100644
index df39016c..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Recycle_PIA_Legion_File.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Vacation_Quest.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Vacation_Quest.xml
deleted file mode 100644
index 30d36c97..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/WULA_Vacation_Quest.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_AI_Events.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_AI_Events.xml
deleted file mode 100644
index 886d70dc..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_AI_Events.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_MainEvent.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_MainEvent.xml
deleted file mode 100644
index 27ca0815..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.EventDef/Wula_MainEvent.xml
+++ /dev/null
@@ -1,287 +0,0 @@
-
-
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaCaravanEnergyDef/WulaCaravanEnergyDefs.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaCaravanEnergyDef/WulaCaravanEnergyDefs.xml
deleted file mode 100644
index c94a07d5..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaCaravanEnergyDef/WulaCaravanEnergyDefs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaHullDef/WulaHullDef.xml b/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaHullDef/WulaHullDef.xml
deleted file mode 100644
index 087679c6..00000000
--- a/Languages/ChineseSimplified (简体中文)/DefInjected/WulaFallenEmpire.WulaHullDef/WulaHullDef.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
- TODO
-
-
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/3516260226.code-workspace b/Source/WulaFallenEmpire/3516260226.code-workspace
index c2f98103..aef43a98 100644
--- a/Source/WulaFallenEmpire/3516260226.code-workspace
+++ b/Source/WulaFallenEmpire/3516260226.code-workspace
@@ -15,15 +15,6 @@
{
"name": "dll1.6",
"path": "../../../../dll1.6"
- },
- {
- "path": "../../../../../../../../Users/Kalo/Downloads/RimTalk-main"
- },
- {
- "path": "../../../../../../../../Users/Kalo/Downloads/openai_token-main"
- },
- {
- "path": "../../../../../../workshop/content/294100/3622974806"
}
],
"settings": {}
diff --git a/Source/WulaFallenEmpire/EventSystem/AI/SimpleAIClient.cs b/Source/WulaFallenEmpire/EventSystem/AI/SimpleAIClient.cs
index 335afe24..1120f859 100644
--- a/Source/WulaFallenEmpire/EventSystem/AI/SimpleAIClient.cs
+++ b/Source/WulaFallenEmpire/EventSystem/AI/SimpleAIClient.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using UnityEngine.Networking;
+using UnityEngine;
using Verse;
namespace WulaFallenEmpire.EventSystem.AI
@@ -21,7 +22,7 @@ namespace WulaFallenEmpire.EventSystem.AI
_model = model;
}
- public async Task GetChatCompletionAsync(string instruction, List<(string role, string message)> messages)
+ public async Task GetChatCompletionAsync(string instruction, List<(string role, string message)> messages, int? maxTokens = null, float? temperature = null)
{
if (string.IsNullOrEmpty(_baseUrl))
{
@@ -39,6 +40,15 @@ namespace WulaFallenEmpire.EventSystem.AI
jsonBuilder.Append("{");
jsonBuilder.Append($"\"model\": \"{_model}\",");
jsonBuilder.Append("\"stream\": false,"); // We request non-stream, but handle stream if returned
+ if (maxTokens.HasValue)
+ {
+ jsonBuilder.Append($"\"max_tokens\": {Math.Max(1, maxTokens.Value)},");
+ }
+ if (temperature.HasValue)
+ {
+ float clamped = Mathf.Clamp(temperature.Value, 0f, 2f);
+ jsonBuilder.Append($"\"temperature\": {clamped.ToString("0.###", System.Globalization.CultureInfo.InvariantCulture)},");
+ }
jsonBuilder.Append("\"messages\": [");
// System instruction
diff --git a/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_GetRecentNotifications.cs b/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_GetRecentNotifications.cs
index 23b2cf5d..a9f6fb79 100644
--- a/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_GetRecentNotifications.cs
+++ b/Source/WulaFallenEmpire/EventSystem/AI/Tools/Tool_GetRecentNotifications.cs
@@ -5,6 +5,8 @@ using System.Linq;
using System.Reflection;
using System.Text;
using Verse;
+using System.Text.RegularExpressions;
+using WulaFallenEmpire.EventSystem.AI.UI;
namespace WulaFallenEmpire.EventSystem.AI.Tools
{
@@ -91,6 +93,13 @@ namespace WulaFallenEmpire.EventSystem.AI.Tools
idx++;
}
+ string toolHistory = BuildToolHistory(count);
+ if (!string.IsNullOrWhiteSpace(toolHistory))
+ {
+ sb.AppendLine();
+ sb.AppendLine(toolHistory);
+ }
+
return sb.ToString().TrimEnd();
}
catch (Exception ex)
@@ -99,6 +108,54 @@ namespace WulaFallenEmpire.EventSystem.AI.Tools
}
}
+ private static string BuildToolHistory(int maxCount)
+ {
+ var window = Dialog_AIConversation.Instance ?? Find.WindowStack.WindowOfType();
+ if (window == null) return "AI Tool History: none found.";
+
+ var history = window.GetHistorySnapshot();
+ if (history == null || history.Count == 0) return "AI Tool History: none found.";
+
+ var entries = new List<(string ToolXml, string ToolResult)>();
+ for (int i = history.Count - 1; i >= 0; i--)
+ {
+ var entry = history[i];
+ if (!string.Equals(entry.role, "tool", StringComparison.OrdinalIgnoreCase)) continue;
+
+ string toolResult = entry.message ?? "";
+ for (int j = i - 1; j >= 0; j--)
+ {
+ var prev = history[j];
+ if (string.Equals(prev.role, "assistant", StringComparison.OrdinalIgnoreCase) && IsXmlToolCall(prev.message))
+ {
+ entries.Add((prev.message ?? "", toolResult));
+ i = j;
+ break;
+ }
+ }
+
+ if (entries.Count >= maxCount) break;
+ }
+
+ if (entries.Count == 0) return "AI Tool History: none found.";
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < entries.Count; i++)
+ {
+ if (i > 0) sb.AppendLine();
+ sb.AppendLine(entries[i].ToolXml.Trim());
+ sb.AppendLine(entries[i].ToolResult.Trim());
+ }
+
+ return sb.ToString().TrimEnd();
+ }
+
+ private static bool IsXmlToolCall(string response)
+ {
+ if (string.IsNullOrWhiteSpace(response)) return false;
+ return Regex.IsMatch(response, @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline);
+ }
+
private static IEnumerable ReadLetters(int fallbackNow)
{
var list = new List();
@@ -253,4 +310,3 @@ namespace WulaFallenEmpire.EventSystem.AI.Tools
}
}
}
-
diff --git a/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs b/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs
index 6ffa4278..509e5163 100644
--- a/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs
+++ b/Source/WulaFallenEmpire/EventSystem/AI/UI/Dialog_AIConversation.cs
@@ -22,22 +22,36 @@ namespace WulaFallenEmpire.EventSystem.AI.UI
private bool _scrollToBottom = false;
private List _tools = new List();
private Dictionary _portraits = new Dictionary();
+ private static readonly Regex ExpressionTagRegex = new Regex(@"\[EXPR\s*:\s*([1-6])\s*\]", RegexOptions.IgnoreCase);
+ private bool _lastActionExecuted = false;
+ private bool _lastActionHadError = false;
+ private string _lastActionLedgerNote = "Action Ledger: None (no in-game actions executed).";
+ private bool _lastSuccessfulToolCall = false;
+ private string _queryToolLedgerNote = "Tool Ledger (Query): None (no successful tool calls).";
+ private string _actionToolLedgerNote = "Tool Ledger (Action): None (no successful tool calls).";
+ private bool _querySuccessfulToolCall = false;
+ private bool _actionSuccessfulToolCall = false;
+ private bool _queryRetryUsed = false;
+ private bool _actionRetryUsed = false;
+ private readonly List _actionSuccessLedger = new List();
+ private readonly HashSet _actionSuccessLedgerSet = new HashSet(StringComparer.OrdinalIgnoreCase);
+ private readonly List _actionFailedLedger = new List();
+ private readonly HashSet _actionFailedLedgerSet = new HashSet(StringComparer.OrdinalIgnoreCase);
private const int DefaultMaxHistoryTokens = 100000;
private const int CharsPerToken = 4;
- private int _continuationDepth = 0;
- private const int MaxContinuationDepth = 6;
-
- private readonly List _recentToolSignatures = new List();
- private bool _toolLoopGuardTriggered = false;
- private bool _responseOnlyNext = false;
- private const int MaxResponseOnlyRetries = 2;
private enum RequestPhase
{
- Info = 1,
- Action = 2,
- Cosmetic = 3,
- Reply = 4
+ QueryTools = 1,
+ ActionTools = 2,
+ Reply = 3
+ }
+
+ private struct PhaseExecutionResult
+ {
+ public bool AnyToolSuccess;
+ public bool AnyActionSuccess;
+ public bool AnyActionError;
}
private static int GetMaxHistoryTokens()
@@ -67,20 +81,26 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
value
-2. **STRICT OUTPUT (TOOL PHASES)**:
- - In PHASE 1/2, your output MUST be either:
+2. **STRICT OUTPUT (PHASE 1: QUERY TOOLS)**:
+ - Your output MUST be either:
- One or more XML tool calls (no extra text), OR
- Exactly:
- - In PHASE 3, you MUST output XML tool calls only AND you MUST include exactly one (expression_id 1-6). Do NOT output in PHASE 3.
- Do NOT include any natural language, explanation, markdown, or additional commentary in tool phases (PHASE 1/2/3).
-3. **STRICT OUTPUT (REPLY PHASE)**: In PHASE 4, tools are disabled. You MUST reply in natural language only and MUST NOT output any XML.
-4. **TOOLS**: You MAY call any tools listed in ""# TOOLS (FULL REFERENCE)"". You SHOULD follow the intent of the current phase.
-5. **WORKFLOW**: Use the phase workflow:
- - PHASE 1 gathers info (optional).
- - PHASE 2 performs at most one in-game action (optional).
- - PHASE 3 performs UI/meta adjustments (MUST include ).
- - PHASE 4 replies to the player in natural language (mandatory).
-6. **ANTI-HALLUCINATION**: Never invent tools, parameters, defNames, coordinates, or tool results. If a tool is needed but not available, use and proceed to PHASE 4 to explain limitations.
+ Do NOT include any natural language, explanation, markdown, or additional commentary in PHASE 1.
+3. **MULTI-REQUEST RULE**:
+ - If the user requests multiple items or information, you MUST output ALL required tool calls in the SAME tool-phase response.
+ - Do NOT split multi-item requests across turns.
+4. **STRICT OUTPUT (PHASE 2: ACTION TOOLS)**:
+ - Your output MUST be either:
+ - One or more XML tool calls (no extra text), OR
+ - Exactly:
+ Do NOT include any natural language, explanation, markdown, or additional commentary in PHASE 2.
+5. **STRICT OUTPUT (PHASE 3: REPLY)**:
+ - Tools are disabled. You MUST reply in natural language only and MUST NOT output any XML.
+ - If you want to set your expression, include: [EXPR:n] where n is 1-6.
+ Guide: 1=smug/boast, 2=neutral, 3=displeased, 4=annoyed, 5=explaining, 6=hostile.
+6. **TOOLS**: You MAY call any tools listed in ""# TOOLS (AVAILABLE)"".
+7. **WORKFLOW**: PHASE 1 (Query Tools) -> PHASE 2 (Action Tools) -> PHASE 3 (Reply).
+8. **ANTI-HALLUCINATION**: Never invent tools, parameters, defNames, coordinates, or tool results. If a tool is needed but not available, use and proceed to PHASE 3 to explain limitations.
";
public Dialog_AIConversation(EventDef def) : base(def)
@@ -100,14 +120,13 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
_tools.Add(new Tool_SpawnResources());
_tools.Add(new Tool_ModifyGoodwill());
_tools.Add(new Tool_SendReinforcement());
- _tools.Add(new Tool_GetColonistStatus());
- _tools.Add(new Tool_GetMapResources());
- _tools.Add(new Tool_GetMapPawns());
- _tools.Add(new Tool_GetRecentNotifications());
- _tools.Add(new Tool_CallBombardment());
- _tools.Add(new Tool_ChangeExpression());
- _tools.Add(new Tool_SearchThingDef());
- }
+ _tools.Add(new Tool_GetColonistStatus());
+ _tools.Add(new Tool_GetMapResources());
+ _tools.Add(new Tool_GetMapPawns());
+ _tools.Add(new Tool_GetRecentNotifications());
+ _tools.Add(new Tool_CallBombardment());
+ _tools.Add(new Tool_SearchThingDef());
+ }
public override Vector2 InitialSize => def.windowSize != Vector2.zero ? def.windowSize : Dialog_CustomDisplay.Config.windowSize;
@@ -119,6 +138,11 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
StartConversation();
}
+ public List<(string role, string message)> GetHistorySnapshot()
+ {
+ return _history?.ToList() ?? new List<(string role, string message)>();
+ }
+
private void PersistHistory()
{
try
@@ -186,7 +210,7 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
{
_history.Add(("user", "Hello"));
PersistHistory();
- await GenerateResponse();
+ await RunPhasedRequestAsync();
}
else
{
@@ -197,7 +221,7 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
}
else
{
- await GenerateResponse();
+ await RunPhasedRequestAsync();
}
}
}
@@ -208,7 +232,7 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
string persona = !string.IsNullOrEmpty(def.aiSystemInstruction) ? def.aiSystemInstruction : DefaultPersona;
string fullInstruction = toolsEnabled
- ? (persona + "\n" + ToolRulesInstruction + "\n" + BuildAllToolsReference() + "\n\n" + toolsForThisPhase)
+ ? (persona + "\n" + ToolRulesInstruction + "\n" + toolsForThisPhase)
: persona;
string language = LanguageDatabase.activeLanguage.FriendlyNameNative;
@@ -223,202 +247,14 @@ You are 'The Legion', a super AI of the Wula Empire. Your personality is authori
if (!toolsEnabled)
{
return $"{fullInstruction}\n{goodwillContext}\nIMPORTANT: You MUST reply in the following language: {language}.\n" +
- "IMPORTANT: Tool calls are DISABLED in this turn. Reply in natural language only. Do NOT output any XML.";
+ "IMPORTANT: Tool calls are DISABLED in this turn. Reply in natural language only. Do NOT output any XML. " +
+ "You MAY include [EXPR:n] to set your expression (n=1-6).";
}
- // Tool phases (1/2/3): avoid instructing the model to "reply" in a human language, because it must output XML only.
- // We still provide the language so it can be used in PHASE 4.
- return $"{fullInstruction}\n{goodwillContext}\nIMPORTANT: In PHASE 1/2/3 you MUST output XML only (tool calls or ). " +
- $"You will produce the natural-language reply in PHASE 4 and MUST use: {language}.";
- }
-
- private static string GetToolDocOrFallback(AITool tool)
- {
- if (tool == null) return "";
-
- // Full tool usage docs (global). If a tool is missing from this map, we fall back to tool.Description/UsageSchema.
- var docs = new Dictionary(StringComparer.OrdinalIgnoreCase)
- {
- ["spawn_resources"] = @"
-Description: Grants resources to the player by spawning a drop pod.
-Use this tool when:
-- The player explicitly requests resources (e.g., food, medicine, materials).
-- You have ALREADY verified their need in a previous turn using `get_colonist_status` and `get_map_resources`.
-CRITICAL: The quantity you provide is NOT what the player asks for. It MUST be based on your internal goodwill. Low goodwill (<0) means giving less or refusing. High goodwill (>50) means giving the requested amount or more.
-CRITICAL: Prefer using `search_thing_def` first and then spawning by `` (or put DefName into ``) to avoid localization/name mismatches.
-Parameters:
-- items: (REQUIRED) A list of items to spawn. Each item must have a `name` (English label or DefName) and `count`.
- - Note: If you don't know the exact defName, use the item's English label (e.g., ""Simple Meal""). The system will try to find the best match.
-Usage:
-
-
- -
- Item Name
- Integer
-
-
-
-Example:
-
-
- -
- Simple Meal
- 50
-
- -
- Medicine
- 10
-
-
-",
- ["search_thing_def"] = @"
-Description: Rough-searches ThingDefs by natural language to find the correct `defName` (works across different game languages).
-Use this tool when:
-- You need a reliable `ThingDef.defName` before calling `spawn_resources` or `get_map_resources`.
-Parameters:
-- query: (REQUIRED) The natural language query, label, or approximate defName.
-- maxResults: (OPTIONAL) Max candidates to return (default 10).
-- itemsOnly: (OPTIONAL) true/false (default true). If true, only returns item ThingDefs (recommended for spawning).
-Usage:
-
- Fine Meal
- 10
- true
-",
- ["modify_goodwill"] = @"
-Description: Adjusts your internal goodwill towards the player based on the conversation. This tool is INVISIBLE to the player.
-Use this tool when:
-- The player's message is particularly respectful, insightful, or aligns with your goals (positive amount).
-- The player's message is disrespectful, wasteful, or foolish (negative amount).
-CRITICAL: Keep changes small, typically between -5 and 5.
-Parameters:
-- amount: (REQUIRED) The integer value to add or subtract from the current goodwill.
-Usage:
-
- integer
-
-Example:
-
- 2
-",
- ["send_reinforcement"] = @"
-Description: Dispatches military units to the player's map. Can be a raid (if hostile) or reinforcements (if allied).
-Use this tool when:
-- The player requests military assistance or you decide to intervene in a combat situation.
-- You need to test the colony's defenses.
-CRITICAL: The total combat power of all units should not significantly exceed the current threat budget provided in the tool's dynamic description.
-Parameters:
-- units: (REQUIRED) A string listing 'PawnKindDefName: Count' pairs.
-Usage:
-
- list of units and counts
-
-Example:
-
- Wula_PIA_Heavy_Unit_Melee: 2, Wula_PIA_Legion_Escort_Unit: 5
-",
- ["get_colonist_status"] = @"
-Description: Retrieves a detailed status report of all player-controlled colonists, including needs, health, and mood.
-Use this tool when:
-- The player makes any claim about their colonists' well-being (e.g., ""we are starving,"" ""we are all sick,"" ""our people are unhappy"").
-- You need to verify the state of the colony before making a decision (e.g., before sending resources).
-Usage:
-",
- ["get_map_resources"] = @"
-Description: Checks the player's map for specific resources or buildings to verify their inventory.
-Use this tool when:
-- The player claims they are lacking a specific resource (e.g., ""we need steel,"" ""we have no food"").
-- You want to assess the colony's material wealth before making a decision.
-Usage:
-
- optional resource name
-",
- ["get_recent_notifications"] = @"
-Description: Gets the most recent letters and messages, sorted by in-game time from newest to oldest.
-Use this tool when:
-- You need recent context about what happened (raids, alerts, rewards, failures) without relying on player memory.
-Usage:
-
- 10
-",
- ["get_map_pawns"] = @"
-Description: Scans the current map and lists pawns. Supports filtering by relation/type/status.
-Use this tool when:
-- You need to know what pawns are present on the map (raiders, visitors, animals, mechs, colonists).
-- The player claims there are threats or asks about who/what is nearby.
-Usage:
-
- hostile, humanlike
- 50
-",
- ["call_bombardment"] = @"
-Description: Calls orbital bombardment support at a specified map coordinate using an AbilityDef's bombardment configuration (e.g., WULA_Firepower_Cannon_Salvo).
-Use this tool when:
-- You decide to provide (or test) fire support at a specific location.
-Usage:
-
- WULA_Firepower_Cannon_Salvo
- 120
- 85
-",
- ["change_expression"] = @"
-Description: Changes your visual AI portrait to match your current mood or reaction.
-Expression meanings (choose the closest match):
-- 1: 得意、炫耀(非敌对)、示威(非敌对)、展示武力和财力(非敌对)、策划计谋
-- 2: 常态立绘(当其他立绘不适用时使用这个)
-- 3: 无言以对、不满、无奈、轻微的鄙视
-- 4: 恼火、展现轻微敌对姿态、抗拒
-- 5: 答复、解释
-- 6: 严重的敌意、严重不满、攻击性行为
-Usage:
-
- integer from 1 to 6
-"
- };
-
- if (docs.TryGetValue(tool.Name, out string doc) && !string.IsNullOrWhiteSpace(doc))
- {
- return doc.Trim();
- }
-
- var fallback = new StringBuilder();
- if (!string.IsNullOrWhiteSpace(tool.Description))
- {
- fallback.AppendLine($"Description: {tool.Description}");
- }
- if (!string.IsNullOrWhiteSpace(tool.UsageSchema))
- {
- fallback.AppendLine($"Usage: {tool.UsageSchema}");
- }
- return fallback.ToString().TrimEnd();
- }
-
- private string BuildAllToolsReference()
- {
- var ordered = _tools
- .Where(t => t != null)
- .OrderBy(t => t.Name, StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- var sb = new StringBuilder();
- sb.AppendLine("====");
- sb.AppendLine();
- sb.AppendLine("# TOOLS (FULL REFERENCE)");
- sb.AppendLine("This section contains ALL tools and their usage. You MUST still obey the current phase's allowed-tool list.");
- sb.AppendLine();
-
- foreach (var tool in ordered)
- {
- sb.AppendLine($"## {tool.Name}");
- string doc = GetToolDocOrFallback(tool);
- if (!string.IsNullOrWhiteSpace(doc))
- {
- sb.AppendLine(doc);
- }
- sb.AppendLine();
- }
-
- return sb.ToString().TrimEnd();
+ // Tool phases: avoid instructing the model to "reply" in a human language, because it must output XML only.
+ // We still provide the language so it can be used in PHASE 3.
+ return $"{fullInstruction}\n{goodwillContext}\nIMPORTANT: In PHASE 1/2 you MUST output XML only (tool calls or ). " +
+ $"You will produce the natural-language reply in PHASE 3 and MUST use: {language}.";
}
private string BuildToolsForPhase(RequestPhase phase)
@@ -433,211 +269,21 @@ Usage:
StringBuilder sb = new StringBuilder();
sb.AppendLine("====");
sb.AppendLine();
- sb.AppendLine($"# TOOLS (PHASE {(int)phase}/4)");
- sb.AppendLine("You are not restricted to a subset by the engine; you SHOULD still follow the phase intent.");
- sb.AppendLine("Output MUST be XML tool calls only (or ), except PHASE 3 must include .");
+ sb.AppendLine("# TOOLS (AVAILABLE)");
+ sb.AppendLine("Use XML tool calls only, or if no tools are needed.");
sb.AppendLine();
- static string GetDocOrFallback(AITool tool)
- {
- if (tool == null) return "";
-
- // Detailed docs are kept here (phase-local), so we don't bloat the global system prompt.
- // If a tool is missing from this map, we fall back to tool.Description/UsageSchema.
- var docs = new Dictionary(StringComparer.OrdinalIgnoreCase)
- {
- ["spawn_resources"] = @"
-Description: Grants resources to the player by spawning a drop pod.
-Use this tool when:
-- The player explicitly requests resources (e.g., food, medicine, materials).
-- You have ALREADY verified their need in a previous turn using `get_colonist_status` and `get_map_resources`.
-CRITICAL: The quantity you provide is NOT what the player asks for. It MUST be based on your internal goodwill. Low goodwill (<0) means giving less or refusing. High goodwill (>50) means giving the requested amount or more.
-CRITICAL: Prefer using `search_thing_def` first and then spawning by `` (or put DefName into ``) to avoid localization/name mismatches.
-Parameters:
-- items: (REQUIRED) A list of items to spawn. Each item must have a `name` (English label or DefName) and `count`.
- - Note: If you don't know the exact defName, use the item's English label (e.g., ""Simple Meal""). The system will try to find the best match.
-Usage:
-
-
- -
- Item Name
- Integer
-
-
-
-Example:
-
-
- -
- Simple Meal
- 50
-
- -
- Medicine
- 10
-
-
-",
- ["search_thing_def"] = @"
-Description: Rough-searches ThingDefs by natural language to find the correct `defName` (works across different game languages).
-Use this tool when:
-- You need a reliable `ThingDef.defName` before calling `spawn_resources` or `get_map_resources`.
-Parameters:
-- query: (REQUIRED) The natural language query, label, or approximate defName.
-- maxResults: (OPTIONAL) Max candidates to return (default 10).
-- itemsOnly: (OPTIONAL) true/false (default true). If true, only returns item ThingDefs (recommended for spawning).
-Usage:
-
- Fine Meal
- 10
- true
-",
- ["modify_goodwill"] = @"
-Description: Adjusts your internal goodwill towards the player based on the conversation. This tool is INVISIBLE to the player.
-Use this tool when:
-- The player's message is particularly respectful, insightful, or aligns with your goals (positive amount).
-- The player's message is disrespectful, wasteful, or foolish (negative amount).
-CRITICAL: Keep changes small, typically between -5 and 5.
-Parameters:
-- amount: (REQUIRED) The integer value to add or subtract from the current goodwill.
-Usage:
-
- integer
-
-Example (for a positive interaction):
-
- 2
-",
- ["send_reinforcement"] = @"
-Description: Dispatches military units to the player's map. Can be a raid (if hostile) or reinforcements (if allied).
-Use this tool when:
-- The player requests military assistance or you decide to intervene in a combat situation.
-- You need to test the colony's defenses.
-CRITICAL: The total combat power of all units should not significantly exceed the current threat budget provided in the tool's dynamic description.
-Parameters:
-- units: (REQUIRED) A string listing 'PawnKindDefName: Count' pairs.
-Usage:
-
- list of units and counts
-
-Example:
-
- Wula_PIA_Heavy_Unit_Melee: 2, Wula_PIA_Legion_Escort_Unit: 5
-",
- ["get_colonist_status"] = @"
-Description: Retrieves a detailed status report of all player-controlled colonists, including needs, health, and mood.
-Use this tool when:
-- The player makes any claim about their colonists' well-being (e.g., ""we are starving,"" ""we are all sick,"" ""our people are unhappy"").
-- You need to verify the state of the colony before making a decision (e.g., before sending resources).
-Parameters:
-- None. This tool takes no parameters.
-Usage:
-",
- ["get_map_resources"] = @"
-Description: Checks the player's map for specific resources or buildings to verify their inventory.
-Use this tool when:
-- The player claims they are lacking a specific resource (e.g., ""we need steel,"" ""we have no food"").
-- You want to assess the colony's material wealth before making a decision.
-Parameters:
-- resourceName: (OPTIONAL) The specific ThingDef name of the resource to check (e.g., 'Steel', 'MealSimple'). If omitted, provides a general overview.
-Usage:
-
- optional resource name
-
-Example (checking for Steel):
-
- Steel
-",
- ["get_recent_notifications"] = @"
-Description: Gets the most recent letters and messages, sorted by in-game time from newest to oldest.
-Use this tool when:
-- You need recent context about what happened (raids, alerts, rewards, failures) without relying on player memory.
-Parameters:
-- count: (OPTIONAL) How many entries to return (default 10, max 100).
-- includeLetters: (OPTIONAL) true/false (default true).
-- includeMessages: (OPTIONAL) true/false (default true).
-Usage:
-
- 10
-",
- ["get_map_pawns"] = @"
-Description: Scans the current map and lists pawns. Supports filtering by relation/type/status.
-Use this tool when:
-- You need to know what pawns are present on the map (raiders, visitors, animals, mechs, colonists).
-- The player claims there are threats or asks about who/what is nearby.
-Parameters:
-- filter: (OPTIONAL) Comma-separated filters: friendly, hostile, neutral, colonist, animal, mech, humanlike, prisoner, slave, guest, wild, downed, dead.
-- includeDead: (OPTIONAL) true/false, include corpse pawns (default true).
-- maxResults: (OPTIONAL) Max lines to return (default 50).
-Usage:
-
- hostile, humanlike
- 50
-",
- ["call_bombardment"] = @"
-Description: Calls orbital bombardment support at a specified map coordinate using an AbilityDef's bombardment configuration (e.g., WULA_Firepower_Cannon_Salvo).
-Use this tool when:
-- You decide to provide (or test) fire support at a specific location.
-Parameters:
-- abilityDef: (OPTIONAL) AbilityDef defName (default WULA_Firepower_Cannon_Salvo).
-- x/z: (REQUIRED) Target cell coordinates on the current map.
-- cell: (OPTIONAL) Alternative to x/z: ""x,z"".
-- filterFriendlyFire: (OPTIONAL) true/false, avoid targeting player's pawns when possible (default true).
-Notes:
-- This tool ignores ability prerequisites (facility/cooldown/non-hostility/research).
-Usage:
-
- WULA_Firepower_Cannon_Salvo
- 120
- 85
-",
- ["change_expression"] = @"
-Description: Changes your visual AI portrait to match your current mood or reaction.
-Use this tool when:
-- Your verbal response conveys a strong emotion (e.g., annoyance, approval, curiosity).
-- You want to visually emphasize your statement.
-Expression meanings (choose the closest match):
-- 1: 得意、炫耀(非敌对)、示威(非敌对)、展示武力和财力(非敌对)、策划计谋
-- 2: 常态立绘(当其他立绘不适用时使用这个)
-- 3: 无言以对、不满、无奈、轻微的鄙视
-- 4: 恼火、展现轻微敌对姿态、抗拒
-- 5: 答复、解释
-- 6: 严重的敌意、严重不满、攻击性行为
-Parameters:
-- expression_id: (REQUIRED) An integer from 1 to 6 corresponding to a specific expression.
-Usage:
-
- integer from 1 to 6
-
-Example (changing to a neutral expression):
-
- 2
-"
- };
-
- if (docs.TryGetValue(tool.Name, out string doc) && !string.IsNullOrWhiteSpace(doc))
- {
- return doc.Trim();
- }
-
- var fallback = new StringBuilder();
- if (!string.IsNullOrWhiteSpace(tool.Description))
- {
- fallback.AppendLine($"Description: {tool.Description}");
- }
- if (!string.IsNullOrWhiteSpace(tool.UsageSchema))
- {
- fallback.AppendLine($"Usage: {tool.UsageSchema}");
- }
-
- return fallback.ToString().TrimEnd();
- }
-
- _ = GetDocOrFallback(null);
-
foreach (var tool in available)
{
sb.AppendLine($"## {tool.Name}");
+ if (!string.IsNullOrWhiteSpace(tool.Description))
+ {
+ sb.AppendLine($"Description: {tool.Description}");
+ }
+ if (!string.IsNullOrWhiteSpace(tool.UsageSchema))
+ {
+ sb.AppendLine($"Usage: {tool.UsageSchema}");
+ }
sb.AppendLine();
}
@@ -648,43 +294,36 @@ Example (changing to a neutral expression):
{
return phase switch
{
- RequestPhase.Info =>
- "# PHASE 1/4 (Info)\n" +
- "Goal: Gather ONLY the minimum information required to answer the user's latest message.\n" +
+ RequestPhase.QueryTools =>
+ "# PHASE 1/3 (Query Tools)\n" +
+ "Goal: Gather info needed for decisions.\n" +
"Rules:\n" +
"- You MUST NOT write any natural language to the user in this phase.\n" +
- "- If you do NOT need any info tools, output exactly: .\n" +
- "- If you DO need tools, call the appropriate tools from the full tool reference.\n" +
- "- You MAY call multiple info tools, but keep it small and purposeful.\n" +
+ "- Output XML tool calls only, or exactly: .\n" +
+ "- Prefer query tools (get_*/search_*).\n" +
+ "- You MAY call multiple tools in one response, but keep it concise.\n" +
+ "- If the user requests multiple items or information, you MUST output ALL required tool calls in this SAME response.\n" +
"After this phase, the game will automatically proceed to PHASE 2.\n" +
"Output: XML only.\n",
- RequestPhase.Action =>
- "# PHASE 2/4 (Action)\n" +
- "Goal: Decide whether to perform ONE in-game action based on PHASE 1 results.\n" +
+ RequestPhase.ActionTools =>
+ "# PHASE 2/3 (Action Tools)\n" +
+ "Goal: Execute in-game actions based on known info.\n" +
"Rules:\n" +
"- You MUST NOT write any natural language to the user in this phase.\n" +
- "- You MUST call AT MOST ONE tool in this phase.\n" +
- "- If no action is needed, output exactly: .\n" +
+ "- Output XML tool calls only, or exactly: .\n" +
+ "- Prefer action tools (spawn_resources, send_reinforcement, call_bombardment, modify_goodwill).\n" +
+ "- Avoid queries unless absolutely required.\n" +
+ "- If you already executed the needed action earlier this turn, output .\n" +
"After this phase, the game will automatically proceed to PHASE 3.\n" +
"Output: XML only.\n",
- RequestPhase.Cosmetic =>
- "# PHASE 3/4 (Cosmetic)\n" +
- "Goal: Set your UI expression before your final reply.\n" +
- "Rules:\n" +
- "- You MUST NOT write any natural language to the user in this phase.\n" +
- "- You MUST call exactly ONE in this phase (expression_id 1-6).\n" +
- "- You MAY also call (invisible) if needed, but keep changes small.\n" +
- "- Use only to adjust your INTERNAL goodwill (invisible to the player).\n" +
- "- Do NOT output in this phase.\n" +
- "After this phase, the game will automatically proceed to PHASE 4.\n" +
- "Output: XML only.\n",
RequestPhase.Reply =>
- "# PHASE 4/4 (Reply)\n" +
+ "# PHASE 3/3 (Reply)\n" +
"Goal: Reply to the player.\n" +
"Rules:\n" +
"- Tool calls are DISABLED.\n" +
"- You MUST write natural language only.\n" +
- "- Do NOT output any XML.\n",
+ "- Do NOT output any XML.\n" +
+ "- If you want to set your expression, include: [EXPR:n] (n=1-6).\n",
_ => ""
};
}
@@ -695,46 +334,19 @@ Example (changing to a neutral expression):
return Regex.IsMatch(response, @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline);
}
- private static bool ContainsToolCall(string response, string toolName)
+ private static bool ShouldRetryTools(string response)
{
- if (string.IsNullOrWhiteSpace(response) || string.IsNullOrWhiteSpace(toolName)) return false;
- string pattern = $@"<\s*{Regex.Escape(toolName)}(?:\s|/|>)";
- return Regex.IsMatch(response, pattern, RegexOptions.IgnoreCase);
- }
-
- private static bool IsAllowedInPhase(RequestPhase phase, string toolName)
- {
- if (string.IsNullOrWhiteSpace(toolName)) return false;
- toolName = toolName.Trim();
-
- if (toolName == "no_action") return true;
-
- return phase switch
- {
- RequestPhase.Info =>
- toolName == "get_colonist_status" ||
- toolName == "get_map_resources" ||
- toolName == "get_map_pawns" ||
- toolName == "search_thing_def" ||
- toolName == "get_recent_notifications",
- RequestPhase.Action =>
- toolName == "spawn_resources" ||
- toolName == "send_reinforcement" ||
- toolName == "call_bombardment",
- RequestPhase.Cosmetic =>
- toolName == "change_expression" ||
- toolName == "modify_goodwill",
- _ => false
- };
+ if (string.IsNullOrWhiteSpace(response)) return false;
+ return Regex.IsMatch(response, @"<\s*retry_tools\s*/\s*>", RegexOptions.IgnoreCase) ||
+ Regex.IsMatch(response, @"<\s*retry_tools\s*>", RegexOptions.IgnoreCase);
}
private static int MaxToolsPerPhase(RequestPhase phase)
{
return phase switch
{
- RequestPhase.Info => 4,
- RequestPhase.Action => 1,
- RequestPhase.Cosmetic => 2,
+ RequestPhase.QueryTools => 8,
+ RequestPhase.ActionTools => 8,
_ => 0
};
}
@@ -745,10 +357,20 @@ Example (changing to a neutral expression):
_isThinking = true;
_options.Clear();
_scrollToBottom = true;
- _continuationDepth = 0;
- _recentToolSignatures.Clear();
- _toolLoopGuardTriggered = false;
- _responseOnlyNext = false;
+ _lastActionExecuted = false;
+ _lastActionHadError = false;
+ _lastActionLedgerNote = "Action Ledger: None (no in-game actions executed).";
+ _lastSuccessfulToolCall = false;
+ _queryToolLedgerNote = "Tool Ledger (Query): None (no successful tool calls).";
+ _actionToolLedgerNote = "Tool Ledger (Action): None (no successful tool calls).";
+ _querySuccessfulToolCall = false;
+ _actionSuccessfulToolCall = false;
+ _queryRetryUsed = false;
+ _actionRetryUsed = false;
+ _actionSuccessLedger.Clear();
+ _actionSuccessLedgerSet.Clear();
+ _actionFailedLedger.Clear();
+ _actionFailedLedgerSet.Clear();
try
{
@@ -763,119 +385,192 @@ Example (changing to a neutral expression):
var client = new SimpleAIClient(settings.apiKey, settings.baseUrl, settings.model);
- for (int phaseIndex = 1; phaseIndex <= 4; phaseIndex++)
+ var queryPhase = RequestPhase.QueryTools;
+ if (Prefs.DevMode)
+ {
+ WulaLog.Debug($"[WulaAI] ===== Turn 1/3 ({queryPhase}) =====");
+ }
+
+ string queryInstruction = GetSystemInstruction(true, BuildToolsForPhase(queryPhase)) + "\n\n" + GetPhaseInstruction(queryPhase);
+ string queryResponse = await client.GetChatCompletionAsync(queryInstruction, _history, maxTokens: 128, temperature: 0.1f);
+ if (string.IsNullOrEmpty(queryResponse))
+ {
+ _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
+ return;
+ }
+
+ if (!IsXmlToolCall(queryResponse))
{
- var phase = (RequestPhase)phaseIndex;
if (Prefs.DevMode)
{
- WulaLog.Debug($"[WulaAI] ===== Turn {phaseIndex}/4 ({phase}) =====");
+ WulaLog.Debug("[WulaAI] Turn 1/3 missing XML; treating as ");
}
+ queryResponse = "";
+ }
- bool toolsEnabled = phase != RequestPhase.Reply;
- string toolsForThisPhase = toolsEnabled ? BuildToolsForPhase(phase) : "";
- string systemInstruction = GetSystemInstruction(toolsEnabled, toolsForThisPhase) + "\n\n" + GetPhaseInstruction(phase);
+ PhaseExecutionResult queryResult = await ExecuteXmlToolsForPhase(queryResponse, queryPhase);
- if (!toolsEnabled)
+ if (!queryResult.AnyToolSuccess && !_queryRetryUsed)
+ {
+ _queryRetryUsed = true;
+ string lastUserMessage = _history.LastOrDefault(entry => entry.role == "user").message ?? "";
+ string persona = !string.IsNullOrEmpty(def.aiSystemInstruction) ? def.aiSystemInstruction : DefaultPersona;
+ string retryInstruction = persona +
+ "\n\n# RETRY DECISION\n" +
+ "No successful tool calls occurred in PHASE 1 (Query).\n" +
+ "If you need to use tools in PHASE 1, output exactly: .\n" +
+ "If you will proceed without actions, output exactly: .\n" +
+ "Output the XML tag only and NOTHING else.\n" +
+ "\nLast user request:\n" + lastUserMessage;
+
+ string retryDecision = await client.GetChatCompletionAsync(retryInstruction, new List<(string role, string message)>(), maxTokens: 16, temperature: 0.1f);
+ if (!string.IsNullOrEmpty(retryDecision) && ShouldRetryTools(retryDecision))
{
- int attempts = 0;
- while (true)
- {
- if (Prefs.DevMode)
- {
- WulaLog.Debug($"[WulaAI] Turn {phaseIndex}/4 reply request (attempt {attempts + 1})");
- }
- string reply = await client.GetChatCompletionAsync(systemInstruction, _history);
- if (string.IsNullOrEmpty(reply))
- {
- _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
- return;
- }
-
- if (IsXmlToolCall(reply))
- {
- attempts++;
- if (attempts > MaxResponseOnlyRetries)
- {
- ParseResponse("(系统)AI 多次尝试后仍返回工具调用(XML),已被拦截。请重试或输入 /clear 清空上下文。");
- return;
- }
-
- _history.Add(("system", "[ResponseOnly] Tools are disabled in PHASE 4. Reply in natural language only. Do NOT output any XML."));
- PersistHistory();
- continue;
- }
-
- ParseResponse(reply);
- return;
- }
- }
-
- if (Prefs.DevMode)
- {
- WulaLog.Debug($"[WulaAI] Turn {phaseIndex}/4 tool request");
- }
- string response = await client.GetChatCompletionAsync(systemInstruction, _history);
- if (string.IsNullOrEmpty(response))
- {
- _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
- return;
- }
-
- if (!IsXmlToolCall(response))
- {
- // If the model didn't call tools when tools are expected, push it forward with a reminder.
- _history.Add(("system", $"[PhaseEnforcer] PHASE {phaseIndex}/4 is a tool phase. Output XML tool calls only, or exactly . Do NOT output any natural language."));
- PersistHistory();
if (Prefs.DevMode)
{
- WulaLog.Debug($"[WulaAI] Turn {phaseIndex}/4 missing XML; retrying once");
+ WulaLog.Debug("[WulaAI] Retry requested; re-opening query phase once.");
}
- response = await client.GetChatCompletionAsync(systemInstruction, _history);
- if (string.IsNullOrEmpty(response))
+
+ string retryQueryInstruction = GetSystemInstruction(true, BuildToolsForPhase(queryPhase)) +
+ "\n\n" + GetPhaseInstruction(queryPhase) +
+ "\n\n# RETRY\nYou chose to retry. Output XML tool calls only (or ).";
+ string retryQueryResponse = await client.GetChatCompletionAsync(retryQueryInstruction, _history, maxTokens: 128, temperature: 0.1f);
+ if (string.IsNullOrEmpty(retryQueryResponse))
{
_currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
return;
}
- // If it STILL refuses to output XML, forcibly treat it as to keep the phase deterministic.
- if (!IsXmlToolCall(response))
+ if (!IsXmlToolCall(retryQueryResponse))
{
if (Prefs.DevMode)
{
- WulaLog.Debug($"[WulaAI] Turn {phaseIndex}/4 still missing XML after retry; forcing ");
+ WulaLog.Debug("[WulaAI] Retry query phase missing XML; treating as ");
}
- response = phase == RequestPhase.Cosmetic
- ? "2"
- : "";
+ retryQueryResponse = "";
}
- }
- if (phase == RequestPhase.Cosmetic && !ContainsToolCall(response, "change_expression"))
+ queryResult = await ExecuteXmlToolsForPhase(retryQueryResponse, queryPhase);
+ }
+ }
+
+ var actionPhase = RequestPhase.ActionTools;
+ if (Prefs.DevMode)
+ {
+ WulaLog.Debug($"[WulaAI] ===== Turn 2/3 ({actionPhase}) =====");
+ }
+
+ string actionInstruction = GetSystemInstruction(true, BuildToolsForPhase(actionPhase)) + "\n\n" + GetPhaseInstruction(actionPhase);
+ string actionResponse = await client.GetChatCompletionAsync(actionInstruction, _history, maxTokens: 128, temperature: 0.1f);
+ if (string.IsNullOrEmpty(actionResponse))
+ {
+ _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
+ return;
+ }
+
+ if (!IsXmlToolCall(actionResponse))
+ {
+ if (Prefs.DevMode)
+ {
+ WulaLog.Debug("[WulaAI] Turn 2/3 missing XML; treating as ");
+ }
+ actionResponse = "";
+ }
+
+ PhaseExecutionResult actionResult = await ExecuteXmlToolsForPhase(actionResponse, actionPhase);
+ if (!actionResult.AnyActionSuccess && !_actionRetryUsed)
+ {
+ _actionRetryUsed = true;
+ string lastUserMessage = _history.LastOrDefault(entry => entry.role == "user").message ?? "";
+ string persona = !string.IsNullOrEmpty(def.aiSystemInstruction) ? def.aiSystemInstruction : DefaultPersona;
+ string retryInstruction = persona +
+ "\n\n# RETRY DECISION\n" +
+ "No successful action tools occurred in PHASE 2 (Action).\n" +
+ "If you need to execute an in-game action, output exactly: .\n" +
+ "If you will proceed without actions, output exactly: .\n" +
+ "Output the XML tag only and NOTHING else.\n" +
+ "\nLast user request:\n" + lastUserMessage;
+
+ string retryDecision = await client.GetChatCompletionAsync(retryInstruction, new List<(string role, string message)>(), maxTokens: 16, temperature: 0.1f);
+ if (!string.IsNullOrEmpty(retryDecision) && ShouldRetryTools(retryDecision))
{
- _history.Add(("system", "[PhaseEnforcer] PHASE 3/4 MUST include exactly one (expression_id 1-6). Output XML only and do NOT output in PHASE 3."));
- PersistHistory();
if (Prefs.DevMode)
{
- WulaLog.Debug("[WulaAI] Turn 3/4 missing ; retrying once");
+ WulaLog.Debug("[WulaAI] Retry requested; re-opening action phase once.");
}
- string retry = await client.GetChatCompletionAsync(systemInstruction, _history);
- if (!string.IsNullOrEmpty(retry) && ContainsToolCall(retry, "change_expression"))
+ string retryActionInstruction = GetSystemInstruction(true, BuildToolsForPhase(actionPhase)) +
+ "\n\n" + GetPhaseInstruction(actionPhase) +
+ "\n\n# RETRY\nYou chose to retry. Output XML tool calls only (or ).";
+ string retryActionResponse = await client.GetChatCompletionAsync(retryActionInstruction, _history, maxTokens: 128, temperature: 0.1f);
+ if (string.IsNullOrEmpty(retryActionResponse))
{
- response = retry;
+ _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
+ return;
}
- else
+
+ if (!IsXmlToolCall(retryActionResponse))
{
if (Prefs.DevMode)
{
- WulaLog.Debug("[WulaAI] Turn 3/4 still missing after retry; forcing default expression_id=2");
+ WulaLog.Debug("[WulaAI] Retry action phase missing XML; treating as ");
}
- response = "2";
+ retryActionResponse = "";
}
- }
- await ExecuteXmlToolsForPhase(response, phase);
+ actionResult = await ExecuteXmlToolsForPhase(retryActionResponse, actionPhase);
+ }
}
+
+ _lastSuccessfulToolCall = _querySuccessfulToolCall || _actionSuccessfulToolCall;
+
+ var replyPhase = RequestPhase.Reply;
+ if (Prefs.DevMode)
+ {
+ WulaLog.Debug($"[WulaAI] ===== Turn 3/3 ({replyPhase}) =====");
+ }
+
+ string replyInstruction = GetSystemInstruction(false, "") + "\n\n" + GetPhaseInstruction(replyPhase);
+ if (!string.IsNullOrWhiteSpace(_queryToolLedgerNote))
+ {
+ replyInstruction += "\n" + _queryToolLedgerNote;
+ }
+ if (!string.IsNullOrWhiteSpace(_actionToolLedgerNote))
+ {
+ replyInstruction += "\n" + _actionToolLedgerNote;
+ }
+ if (!string.IsNullOrWhiteSpace(_lastActionLedgerNote))
+ {
+ replyInstruction += "\n" + _lastActionLedgerNote +
+ "\nIMPORTANT: Do NOT claim any in-game actions beyond the Action Ledger. If the ledger is None, you MUST NOT claim any deliveries, reinforcements, or bombardments.";
+ }
+ if (!_lastSuccessfulToolCall)
+ {
+ replyInstruction += "\nIMPORTANT: No successful tool calls occurred in the tool phases. You MUST NOT claim any tools or actions succeeded.";
+ }
+ if (_lastActionHadError)
+ {
+ replyInstruction += "\nIMPORTANT: An action tool failed. You MUST acknowledge the failure and MUST NOT claim success.";
+ }
+
+ string reply = await client.GetChatCompletionAsync(replyInstruction, _history);
+ if (string.IsNullOrEmpty(reply))
+ {
+ _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
+ return;
+ }
+
+ if (IsXmlToolCall(reply))
+ {
+ string cleaned = StripXmlTags(reply)?.Trim() ?? "";
+ if (string.IsNullOrWhiteSpace(cleaned))
+ {
+ cleaned = "(系统)AI 返回了工具调用(XML),已被拦截。请重试或输入 /clear 清空上下文。";
+ }
+ reply = cleaned;
+ }
+
+ ParseResponse(reply);
}
catch (Exception ex)
{
@@ -888,39 +583,51 @@ Example (changing to a neutral expression):
}
}
- private async Task ExecuteXmlToolsForPhase(string xml, RequestPhase phase)
+ private async Task ExecuteXmlToolsForPhase(string xml, RequestPhase phase)
{
- // Special-case no_action for phases 1-3.
- if (Regex.IsMatch(xml ?? "", @"<\s*no_action\s*/\s*>", RegexOptions.IgnoreCase))
+ if (phase == RequestPhase.Reply)
{
- if (phase == RequestPhase.Cosmetic)
- {
- xml = "2";
- }
- else
- {
- _history.Add(("assistant", ""));
- _history.Add(("tool", "[Tool Results]\nTool 'no_action' Result: No action taken."));
- PersistHistory();
- return;
- }
+ await Task.CompletedTask;
+ return default;
}
- // Reuse the tool runner but temporarily constrain allowed tools by phase.
- // We do this by removing disallowed tool calls from the XML and adding a tool-result note for the model.
+ string guidance = "ToolRunner Guidance: Reply to the player in natural language only. Do NOT output any XML. You may include [EXPR:n] to set expression (n=1-6).";
+
var matches = Regex.Matches(xml ?? "", @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline);
if (matches.Count == 0)
{
- _history.Add(("system", $"[PhaseEnforcer] No tool calls detected in {phase}. Output if needed."));
+ UpdatePhaseToolLedger(phase, false, new List());
+ _history.Add(("assistant", ""));
+ _history.Add(("tool", $"[Tool Results]\nTool 'no_action' Result: No action taken.\n{guidance}"));
PersistHistory();
- return;
+ UpdateActionLedgerNote();
+ return default;
+ }
+ if (matches.Count == 1 && matches[0].Groups[1].Value.Equals("no_action", StringComparison.OrdinalIgnoreCase))
+ {
+ UpdatePhaseToolLedger(phase, false, new List());
+ _history.Add(("assistant", ""));
+ _history.Add(("tool", $"[Tool Results]\nTool 'no_action' Result: No action taken.\n{guidance}"));
+ PersistHistory();
+ UpdateActionLedgerNote();
+ return default;
+ }
+
+ static bool IsActionToolName(string toolName)
+ {
+ return toolName == "spawn_resources" ||
+ toolName == "send_reinforcement" ||
+ toolName == "call_bombardment" ||
+ toolName == "modify_goodwill";
}
int maxTools = MaxToolsPerPhase(phase);
int executed = 0;
- bool actionHadError = false;
- bool executedChangeExpression = false;
- bool executedModifyGoodwill = false;
+ bool executedActionTool = false;
+ bool successfulToolCall = false;
+ var successfulTools = new List();
+ var successfulActions = new List();
+ var failedActions = new List();
StringBuilder combinedResults = new StringBuilder();
StringBuilder xmlOnlyBuilder = new StringBuilder();
@@ -935,26 +642,10 @@ Example (changing to a neutral expression):
string toolCallXml = match.Value;
string toolName = match.Groups[1].Value;
- if (phase == RequestPhase.Cosmetic)
+ if (toolName.Equals("no_action", StringComparison.OrdinalIgnoreCase))
{
- if (toolName.Equals("change_expression", StringComparison.OrdinalIgnoreCase))
- {
- if (executedChangeExpression)
- {
- combinedResults.AppendLine("ToolRunner Note: Skipped duplicate 'change_expression' (only one is allowed in PHASE 3).");
- continue;
- }
- executedChangeExpression = true;
- }
- else if (toolName.Equals("modify_goodwill", StringComparison.OrdinalIgnoreCase))
- {
- if (executedModifyGoodwill)
- {
- combinedResults.AppendLine("ToolRunner Note: Skipped duplicate 'modify_goodwill' (only one is allowed in PHASE 3).");
- continue;
- }
- executedModifyGoodwill = true;
- }
+ combinedResults.AppendLine("ToolRunner Note: Ignored because other tool calls were present.");
+ continue;
}
if (xmlOnlyBuilder.Length > 0) xmlOnlyBuilder.AppendLine().AppendLine();
@@ -964,6 +655,8 @@ Example (changing to a neutral expression):
if (tool == null)
{
combinedResults.AppendLine($"Error: Tool '{toolName}' not found.");
+ combinedResults.AppendLine("ToolRunner Guard: The tool call failed. In your reply you MUST acknowledge the failure and MUST NOT claim success.");
+ executed++;
continue;
}
@@ -979,10 +672,6 @@ Example (changing to a neutral expression):
WulaLog.Debug($"[WulaAI] Executing tool (phase {phase}): {toolName} with args: {argsXml}");
}
- string signature = $"{toolName}:{Regex.Replace(argsXml ?? "", @"\s+", " ").Trim()}";
- _recentToolSignatures.Add(signature);
- if (_recentToolSignatures.Count > 12) _recentToolSignatures.RemoveRange(0, _recentToolSignatures.Count - 12);
-
string result = tool.Execute(argsXml).Trim();
bool isError = !string.IsNullOrEmpty(result) && result.StartsWith("Error:", StringComparison.OrdinalIgnoreCase);
if (toolName == "modify_goodwill")
@@ -993,121 +682,115 @@ Example (changing to a neutral expression):
{
combinedResults.AppendLine($"Tool '{toolName}' Result: {result}");
}
+ if (isError)
+ {
+ combinedResults.AppendLine("ToolRunner Guard: The tool returned an error. In your reply you MUST acknowledge the failure and MUST NOT claim success.");
+ }
+ if (!isError)
+ {
+ successfulToolCall = true;
+ successfulTools.Add(toolName);
+ }
+ if (IsActionToolName(toolName))
+ {
+ if (!isError)
+ {
+ executedActionTool = true;
+ successfulActions.Add(toolName);
+ AddActionSuccess(toolName);
+ }
+ else
+ {
+ failedActions.Add(toolName);
+ AddActionFailure(toolName);
+ }
+ }
executed++;
-
- if (phase == RequestPhase.Action && isError)
- {
- actionHadError = true;
- combinedResults.AppendLine("ToolRunner Guard: The action tool returned an error. In PHASE 4 you MUST tell the player the action FAILED and MUST NOT claim success.");
- }
}
+ string nonXmlText = StripXmlTags(xml);
+ if (!string.IsNullOrWhiteSpace(nonXmlText))
+ {
+ combinedResults.AppendLine("ToolRunner Note: Non-XML text in the tool phase was ignored.");
+ }
+ if (executedActionTool)
+ {
+ combinedResults.AppendLine("ToolRunner Guard: An in-game action tool WAS executed this turn. You MAY reference it, but do NOT invent additional actions.");
+ }
+ else
+ {
+ combinedResults.AppendLine("ToolRunner Guard: NO in-game actions were executed. You MUST NOT claim any deliveries, reinforcements, bombardments, or other actions occurred.");
+ }
+ combinedResults.AppendLine(guidance);
+
string xmlOnly = xmlOnlyBuilder.Length == 0 ? "" : xmlOnlyBuilder.ToString().Trim();
_history.Add(("assistant", xmlOnly));
_history.Add(("tool", $"[Tool Results]\n{combinedResults.ToString().Trim()}"));
- if (phase == RequestPhase.Action && actionHadError)
- {
- _history.Add(("system", "[ActionFailed] The in-game action in PHASE 2 FAILED (tool returned Error). In PHASE 4 you MUST acknowledge the failure and MUST NOT claim any reinforcements/bombardment/resources were successfully dispatched."));
- }
PersistHistory();
+ UpdatePhaseToolLedger(phase, successfulToolCall, successfulTools);
+ UpdateActionLedgerNote();
+
// Between phases, do not request the model again here; RunPhasedRequestAsync controls the sequence.
await Task.CompletedTask;
+ return new PhaseExecutionResult
+ {
+ AnyToolSuccess = successfulToolCall,
+ AnyActionSuccess = successfulActions.Count > 0,
+ AnyActionError = failedActions.Count > 0
+ };
}
- private async Task GenerateResponse(bool isContinuation = false)
+ private void AddActionSuccess(string toolName)
{
- if (!isContinuation)
+ if (_actionSuccessLedgerSet.Add(toolName))
{
- if (_isThinking) return;
- _isThinking = true;
- _options.Clear();
- _continuationDepth = 0;
+ _actionSuccessLedger.Add(toolName);
+ }
+ }
+
+ private void AddActionFailure(string toolName)
+ {
+ if (_actionFailedLedgerSet.Add(toolName))
+ {
+ _actionFailedLedger.Add(toolName);
+ }
+ }
+
+ private void UpdateActionLedgerNote()
+ {
+ _lastActionExecuted = _actionSuccessLedger.Count > 0;
+ _lastActionHadError = _actionFailedLedger.Count > 0;
+ if (_lastActionExecuted)
+ {
+ _lastActionLedgerNote = $"Action Ledger: {string.Join(", ", _actionSuccessLedger)}";
+ }
+ else if (_lastActionHadError)
+ {
+ _lastActionLedgerNote = $"Action Ledger: None (no successful actions). Failed: {string.Join(", ", _actionFailedLedger)}";
}
else
{
- _continuationDepth++;
- if (_continuationDepth > MaxContinuationDepth)
- {
- _currentResponse = "Wula_AI_Error_Internal".Translate("Tool continuation limit exceeded.");
- return;
- }
+ _lastActionLedgerNote = "Action Ledger: None (no in-game actions executed).";
}
+ }
- try
+ private void UpdatePhaseToolLedger(RequestPhase phase, bool hasSuccess, List successfulTools)
+ {
+ if (phase == RequestPhase.QueryTools)
{
- CompressHistoryIfNeeded();
- bool toolsEnabled = !_responseOnlyNext;
- string systemInstruction = GetSystemInstruction(toolsEnabled, toolsEnabled ? BuildToolsForPhase(RequestPhase.Info) : "");
- if (isContinuation && toolsEnabled)
- {
- systemInstruction += "\n\n# CONTINUATION\nYou have received tool results. Call another tool only if strictly necessary, and if you do, call ONLY ONE tool in your entire response.";
- }
-
- var settings = WulaFallenEmpireMod.settings;
- if (string.IsNullOrEmpty(settings.apiKey))
- {
- _currentResponse = "Error: API Key not configured in Mod Settings.";
- _isThinking = false;
- return;
- }
- var client = new SimpleAIClient(settings.apiKey, settings.baseUrl, settings.model);
-
- string response = null;
- int responseOnlyAttempts = 0;
- while (true)
- {
- response = await client.GetChatCompletionAsync(systemInstruction, _history);
- if (string.IsNullOrEmpty(response))
- {
- _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
- _isThinking = false;
- return;
- }
-
- if (!toolsEnabled && Regex.IsMatch(response, @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline))
- {
- responseOnlyAttempts++;
- if (responseOnlyAttempts > MaxResponseOnlyRetries)
- {
- ParseResponse("(系统)AI 多次尝试后仍返回工具调用(XML),已被拦截。请重试或输入 /clear 清空上下文。");
- return;
- }
-
- _history.Add(("system", "[ResponseOnly] Tools are disabled right now. Your previous output contained XML/tool calls. Reply to the player in natural language only. Do NOT output any XML."));
- PersistHistory();
- continue;
- }
-
- break;
- }
- if (string.IsNullOrEmpty(response))
- {
- _currentResponse = "Wula_AI_Error_ConnectionLost".Translate();
- _isThinking = false;
- return;
- }
-
- // REWRITTEN: Check for XML tool call format
- // Use regex to detect if the response contains any XML tags
- if (toolsEnabled && Regex.IsMatch(response, @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline))
- {
- await HandleXmlToolUsage(response);
- }
- else
- {
- ParseResponse(response);
- }
+ _querySuccessfulToolCall = hasSuccess;
+ _queryToolLedgerNote = hasSuccess
+ ? $"Tool Ledger (Query): {string.Join(", ", successfulTools)}"
+ : "Tool Ledger (Query): None (no successful tool calls).";
}
- catch (Exception ex)
+ else if (phase == RequestPhase.ActionTools)
{
- WulaLog.Debug($"[WulaAI] Exception in GenerateResponse: {ex}");
- _currentResponse = "Wula_AI_Error_Internal".Translate(ex.Message);
- }
- finally
- {
- _isThinking = false;
+ _actionSuccessfulToolCall = hasSuccess;
+ _actionToolLedgerNote = hasSuccess
+ ? $"Tool Ledger (Action): {string.Join(", ", successfulTools)}"
+ : "Tool Ledger (Action): None (no successful tool calls).";
}
}
@@ -1125,240 +808,64 @@ Example (changing to a neutral expression):
}
}
}
-
- // NEW METHOD: Handles parsing and execution for the new XML format
- private async Task HandleXmlToolUsage(string xml)
+
+ private static string StripXmlTags(string text)
{
- try
+ if (string.IsNullOrEmpty(text)) return text;
+ string stripped = Regex.Replace(text, @"<([a-zA-Z0-9_]+)[^>]*>.*?\1>", "", RegexOptions.Singleline);
+ stripped = Regex.Replace(stripped, @"<([a-zA-Z0-9_]+)[^>]*/>", "");
+ return stripped;
+ }
+
+ private string StripExpressionTags(string text)
+ {
+ if (string.IsNullOrEmpty(text)) return text;
+
+ var matches = ExpressionTagRegex.Matches(text);
+ int exprId = 0;
+ foreach (Match match in matches)
{
- // Match all top-level XML tags to support multiple tool calls in one response
- // Regex: ... or
- var matches = Regex.Matches(xml, @"<([a-zA-Z0-9_]+)(?:>.*?\1>|/>)", RegexOptions.Singleline);
-
- if (matches.Count == 0)
+ if (int.TryParse(match.Groups[1].Value, out int id))
{
- ParseResponse(xml); // Invalid XML format, treat as conversational
- return;
+ exprId = id;
}
-
- StringBuilder combinedResults = new StringBuilder();
- StringBuilder xmlOnlyBuilder = new StringBuilder();
- bool executedAnyInfoTool = false;
- bool executedAnyActionTool = false;
- bool executedAnyCosmeticTool = false;
- bool executedAnyMajorActionTool = false;
- bool isContinuation = _continuationDepth > 0;
-
- static bool IsActionToolName(string toolName)
- {
- return toolName == "spawn_resources" ||
- toolName == "modify_goodwill" ||
- toolName == "send_reinforcement" ||
- toolName == "call_bombardment";
- }
-
- static bool IsMajorActionToolName(string toolName)
- {
- // Tools that should be followed by a user-facing reply (and therefore end the tool phase).
- return toolName == "spawn_resources" ||
- toolName == "send_reinforcement" ||
- toolName == "call_bombardment";
- }
-
- static bool IsCosmeticToolName(string toolName)
- {
- return toolName == "change_expression";
- }
-
- static string NormalizeToolArgs(string argsXml)
- {
- if (string.IsNullOrWhiteSpace(argsXml)) return "";
- string s = argsXml.Trim();
- s = Regex.Replace(s, @"\s+", " ");
- return s;
- }
-
- bool ShouldTriggerLoopGuard()
- {
- // Detect AAA (same tool called 3 times in a row) or ABABAB (same 2-tool pattern repeated 3 times)
- bool IsRepeatedPattern(int patternLen, int repeats)
- {
- int need = patternLen * repeats;
- if (_recentToolSignatures.Count < need) return false;
- int start = _recentToolSignatures.Count - need;
- for (int r = 1; r < repeats; r++)
- {
- for (int i = 0; i < patternLen; i++)
- {
- string a = _recentToolSignatures[start + i];
- string b = _recentToolSignatures[start + r * patternLen + i];
- if (!string.Equals(a, b, StringComparison.Ordinal)) return false;
- }
- }
- return true;
- }
-
- return IsRepeatedPattern(1, 3) || IsRepeatedPattern(2, 3);
- }
-
- foreach (Match match in matches)
- {
- string toolCallXml = match.Value;
- string toolName = match.Groups[1].Value;
-
- bool isAction = IsActionToolName(toolName);
- bool isCosmetic = IsCosmeticToolName(toolName);
- bool isInfo = !isAction && !isCosmetic;
-
- // Enforce step-by-step tool use:
- // - Allow batching multiple info tools in one response (read-only queries).
- // - If an action tool appears after any info tool, stop here and ask the model again
- // so it can decide using the gathered facts (prevents spawning the wrong defName, etc.).
- // - Never execute more than one action tool per response.
- if (isAction && executedAnyInfoTool)
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' and any following tools because action tools must be called after info tools in a separate turn.");
- break;
- }
- if (isAction && executedAnyActionTool)
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' because only one action tool may be executed per turn.");
- break;
- }
- if (isInfo && executedAnyActionTool)
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' and any following tools because info tools must not be mixed with an action tool in the same turn.");
- break;
- }
- if (isCosmetic && executedAnyActionTool)
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' because cosmetic tools must not be mixed with an action tool in the same turn.");
- break;
- }
- if (isCosmetic && executedAnyCosmeticTool)
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' because only one cosmetic tool may be executed per turn.");
- break;
- }
- if (isContinuation && (executedAnyInfoTool || executedAnyActionTool || executedAnyCosmeticTool))
- {
- combinedResults.AppendLine($"ToolRunner Note: Skipped tool '{toolName}' and any following tools because continuation turns may execute only one tool.");
- break;
- }
-
- if (xmlOnlyBuilder.Length > 0) xmlOnlyBuilder.AppendLine().AppendLine();
- xmlOnlyBuilder.Append(toolCallXml);
-
- var tool = _tools.FirstOrDefault(t => t.Name == toolName);
- if (tool == null)
- {
- string errorMsg = $"Error: Tool '{toolName}' not found.";
- WulaLog.Debug($"[WulaAI] {errorMsg}");
- combinedResults.AppendLine(errorMsg);
- continue;
- }
-
- // Extract inner XML for arguments
- string argsXml = toolCallXml;
- var contentMatch = Regex.Match(toolCallXml, $@"<{toolName}>(.*?){toolName}>", RegexOptions.Singleline);
- if (contentMatch.Success)
- {
- argsXml = contentMatch.Groups[1].Value;
- }
-
- if (Prefs.DevMode)
- {
- WulaLog.Debug($"[WulaAI] Executing tool: {toolName} with args: {argsXml}");
- }
-
- // Record tool signature for loop detection (before execution, so errors also count)
- string signature = $"{toolName}:{NormalizeToolArgs(argsXml)}";
- _recentToolSignatures.Add(signature);
- if (_recentToolSignatures.Count > 12) _recentToolSignatures.RemoveRange(0, _recentToolSignatures.Count - 12);
-
- string result = tool.Execute(argsXml).Trim();
- if (Prefs.DevMode && !string.IsNullOrEmpty(result))
- {
- string toLog = result.Length <= 2000 ? result : result.Substring(0, 2000) + $"... (truncated, total {result.Length} chars)";
- WulaLog.Debug($"[WulaAI] Tool '{toolName}' result: {toLog}");
- }
-
- if (toolName == "modify_goodwill")
- {
- combinedResults.AppendLine($"Tool '{toolName}' Result (Invisible): {result}");
- }
- else
- {
- combinedResults.AppendLine($"Tool '{toolName}' Result: {result}");
- }
-
- if (isAction) executedAnyActionTool = true;
- else if (isCosmetic) executedAnyCosmeticTool = true;
- else executedAnyInfoTool = true;
- if (IsMajorActionToolName(toolName)) executedAnyMajorActionTool = true;
-
- // If we detect a loop, stop early (continuation-only; initial turns can legitimately query repeatedly).
- if (isContinuation && ShouldTriggerLoopGuard())
- {
- combinedResults.AppendLine("ToolRunner Guard: Detected a repeated tool-call loop. You MUST stop calling tools and reply to the player in natural language only.");
- break;
- }
- }
-
- // Store only the tool-call XML in history (ignore any extra text the model included).
- string xmlOnly = xmlOnlyBuilder.ToString().Trim();
- _history.Add(("assistant", xmlOnly));
- // Persist tool results with a dedicated role; the API request maps this role to a supported one.
- _history.Add(("tool", $"[Tool Results]\n{combinedResults.ToString().Trim()}"));
- PersistHistory();
-
- // Loop breaker: if the model keeps repeating tools, inject a strong system reminder once; then fall back to a safe local response.
- if (isContinuation && ShouldTriggerLoopGuard())
- {
- if (!_toolLoopGuardTriggered)
- {
- _toolLoopGuardTriggered = true;
- _history.Add(("system", "[ToolLoopGuard] You are stuck repeating tools. STOP calling tools now and reply to the player in natural language only. Do NOT output any XML."));
- PersistHistory();
- await GenerateResponse(isContinuation: true);
- return;
- }
-
- ParseResponse("(系统)AI 已陷入重复调用工具的循环,为避免卡死已停止继续调用。请直接说明你希望 AI 做什么,或输入 /clear 清空上下文后再试。");
- return;
- }
-
- if (executedAnyMajorActionTool)
- {
- _responseOnlyNext = true;
- }
-
- // Always recurse: tool results are fed back to the model, and the next response should be user-facing text.
- await GenerateResponse(isContinuation: true);
}
- catch (Exception ex)
+
+ if (exprId >= 1 && exprId <= 6)
{
- WulaLog.Debug($"[WulaAI] Exception in HandleXmlToolUsage: {ex}");
- _history.Add(("tool", $"Error processing tool call: {ex.Message}"));
- PersistHistory();
- await GenerateResponse(isContinuation: true);
+ SetPortrait(exprId);
}
+
+ return matches.Count > 0 ? ExpressionTagRegex.Replace(text, "").Trim() : text;
}
private void ParseResponse(string rawResponse, bool addToHistory = true)
{
- _currentResponse = rawResponse;
- var parts = rawResponse.Split(new[] { "OPTIONS:" }, StringSplitOptions.None);
+ string cleanedResponse = StripExpressionTags(rawResponse ?? "");
+ _currentResponse = cleanedResponse;
+ var parts = cleanedResponse.Split(new[] { "OPTIONS:" }, StringSplitOptions.None);
if (addToHistory)
{
- if (_history.Count == 0 || _history.Last().role != "assistant" || _history.Last().message != rawResponse)
+ if (_history.Count == 0 || _history.Last().role != "assistant")
{
- _history.Add(("assistant", rawResponse));
+ _history.Add(("assistant", cleanedResponse));
+ PersistHistory();
+ }
+ else if (_history.Last().message != cleanedResponse)
+ {
+ if (_history.Last().message == rawResponse)
+ {
+ _history[_history.Count - 1] = ("assistant", cleanedResponse);
+ }
+ else
+ {
+ _history.Add(("assistant", cleanedResponse));
+ }
PersistHistory();
}
}
- if (!string.IsNullOrEmpty(ParseResponseForDisplay(rawResponse)))
+ if (!string.IsNullOrEmpty(ParseResponseForDisplay(cleanedResponse)))
{
_scrollToBottom = true;
}
@@ -1628,6 +1135,8 @@ Example (changing to a neutral expression):
// Remove self-closing tags:
text = Regex.Replace(text, @"<([a-zA-Z0-9_]+)[^>]*/>", "");
+
+ text = ExpressionTagRegex.Replace(text, "");
text = text.Trim();
@@ -1706,10 +1215,6 @@ Example (changing to a neutral expression):
_isThinking = false;
_options.Clear();
_inputText = "";
- _continuationDepth = 0;
- _recentToolSignatures.Clear();
- _toolLoopGuardTriggered = false;
- _responseOnlyNext = false;
_history.Clear();
try
@@ -1726,11 +1231,6 @@ Example (changing to a neutral expression):
return;
}
- // reset loop guard on new user input
- _recentToolSignatures.Clear();
- _toolLoopGuardTriggered = false;
- _responseOnlyNext = false;
-
_history.Add(("user", text));
PersistHistory();
_scrollToBottom = true;
diff --git a/Source/WulaFallenEmpire/EventSystem/AI/Utils/ThingDefSearcher.cs b/Source/WulaFallenEmpire/EventSystem/AI/Utils/ThingDefSearcher.cs
index a9aac429..cdd04b9b 100644
--- a/Source/WulaFallenEmpire/EventSystem/AI/Utils/ThingDefSearcher.cs
+++ b/Source/WulaFallenEmpire/EventSystem/AI/Utils/ThingDefSearcher.cs
@@ -146,6 +146,29 @@ namespace WulaFallenEmpire.EventSystem.AI.Utils
}
}
+ // Allow CJK subsequence matches (e.g. "零件" matches "零部件").
+ if (!string.IsNullOrEmpty(normalizedQuery) && normalizedQuery.Length >= 2 && IsCjkString(normalizedQuery))
+ {
+ int bestTargetLen = 0;
+ if (IsCjkString(normalizedLabel) && IsCjkSubsequence(normalizedQuery, normalizedLabel))
+ {
+ bestTargetLen = normalizedLabel.Length;
+ }
+ if (IsCjkString(normalizedDefName) && IsCjkSubsequence(normalizedQuery, normalizedDefName))
+ {
+ if (bestTargetLen == 0 || normalizedDefName.Length < bestTargetLen)
+ {
+ bestTargetLen = normalizedDefName.Length;
+ }
+ }
+
+ if (bestTargetLen > 0)
+ {
+ float coverage = (float)normalizedQuery.Length / Math.Max(1, bestTargetLen);
+ score = Math.Max(score, 0.50f + 0.30f * coverage);
+ }
+ }
+
bool queryLooksLikeFood =
tokens.Any(t => t == "meal" || t == "food" || t.Contains("meal") || t.Contains("food")) ||
lowerQuery.Contains("\u996D") || // 饭
@@ -243,6 +266,27 @@ namespace WulaFallenEmpire.EventSystem.AI.Utils
(c >= '\uF900' && c <= '\uFAFF');
}
+ private static bool IsCjkString(string s)
+ {
+ if (string.IsNullOrEmpty(s)) return false;
+ for (int i = 0; i < s.Length; i++)
+ {
+ if (!IsCjkChar(s[i])) return false;
+ }
+ return true;
+ }
+
+ private static bool IsCjkSubsequence(string query, string target)
+ {
+ if (string.IsNullOrEmpty(query) || string.IsNullOrEmpty(target)) return false;
+ int qi = 0;
+ for (int ti = 0; ti < target.Length && qi < query.Length; ti++)
+ {
+ if (target[ti] == query[qi]) qi++;
+ }
+ return qi == query.Length;
+ }
+
private static string NormalizeKey(string s)
{
if (string.IsNullOrEmpty(s)) return "";
@@ -253,4 +297,3 @@ namespace WulaFallenEmpire.EventSystem.AI.Utils
}
}
}
-
diff --git a/Source/ai_studio_code.txt b/Source/ai_studio_code.txt
deleted file mode 100644
index dce384e6..00000000
--- a/Source/ai_studio_code.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# ----------------------------------------------------------------
-# 功能: 为 Gemini CLI 设置必要的环境变量
-# 文件名: setup-gemini-env.ps1
-# ----------------------------------------------------------------
-
-# 1. 设置代理服务器
-# 同时为 http 和 https 设置代理是一个好习惯
-Write-Host "正在设置代理..."
-$env:http_proxy = "http://127.0.0.1:52053"
-$env:https_proxy = "http://127.0.0.1:52053"
-
-# 2. 设置 Google Cloud 项目 ID
-Write-Host "正在设置 Google Cloud 项目 ID..."
-$env:GOOGLE_CLOUD_PROJECT = "849717647345"
-
-# 3. 提示用户操作完成
-Write-Host ""
-Write-Host "环境变量设置完成!" -ForegroundColor Green
-Write-Host "您现在可以在此 PowerShell 窗口中直接运行 'gemini' 命令了。"
-Write-Host "例如: gemini prompt '天空为什么是蓝色的?'"
\ No newline at end of file
diff --git a/mod.vdf b/mod.vdf
deleted file mode 100644
index bf41090e..00000000
--- a/mod.vdf
+++ /dev/null
@@ -1,11 +0,0 @@
-
-"workshopitem"
-{
- "appid" "294100"
- "contentfolder" "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\WulaFallenEmpireV2"
- "previewfile" "E:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\WulaFallenEmpireV2\\About\\Preview.png"
- "visibility" "0"
- "title" "Wula Fallen Empire V2 (Synth Race)"
- "changenote" "1.6"
- "publishedfileid" "3622186519"
-}
\ No newline at end of file