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_]+)(?:>.*?|/>)", 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_]+)(?:>.*?|/>)", 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_]+)(?:>.*?|/>)", 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_]+)(?:>.*?|/>)", 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_]+)(?:>.*?|/>)", 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_]+)[^>]*>.*?", "", 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_]+)(?:>.*?|/>)", 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}>(.*?)", 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