diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 08b2c20d..103f7c27 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml index a13bd638..7620af37 100644 --- a/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml +++ b/1.6/1.6/Defs/AbilityDefs/WULA_Flyover_Ability.xml @@ -238,9 +238,6 @@ -
  • - WULA_Light_Fighter_Drone_Technology -
  • WULA_MotherShip_Entity 15000 diff --git a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml index 805a983a..009d3caf 100644 --- a/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml +++ b/1.6/1.6/Defs/FactionDefs/Factions_Player_WULA.xml @@ -35,21 +35,40 @@ Wula_PIA_Legion_Faction - 隶属于乌拉帝国开发署的暴力机关,主要职责是对那些已经有人占领但是军事实力较弱的星球进行封锁和原住民驱离。虽然她们不是真正的军队,但是所保有的舰队和武装力量足以支撑其发起一场横跨星域的战争。 + 隶属于乌拉帝国开发署的暴力机关,主要职责是对那些已经有人占领但是军事实力较弱的星球进行封锁和原住民驱离。虽然她们不是真正的军队,但是所保有的舰队和武装力量足以支撑其发起一场横跨星域的战争。\n\n她们之中大部分人居住在自己的庞大舰队中,地表只有零星前哨殖民地。她们也不会派出商队之类的交易者,只会在自己的派系范围内活动,并使用舰队支援这些地面据点的生产和战斗。你可以通过任务接洽和 Wula_PawnKind 乌拉帝国合成人 乌拉帝国合成人 1 NamerFaction_Wula_PIA_Legion_Faction Wula/World/WorldObjects/Expanding/Wula_PIA_Legion_Faction - + 0 + 1 + false + false 1 false true + false + false + true + false + true + + + +
  • Orbital_BulkGoods
  • +
  • Orbital_CombatSupplier
  • +
  • Orbital_Exotic
  • +
  • Orbital_PirateMerchant
  • +
  • Surface
  • Orbit
  • + +
  • Orbit
  • +
  • (1, 1, 1)
  • @@ -73,7 +92,7 @@ true - true + false false false Ultra diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml index c6179df6..4358c365 100644 --- a/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml +++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Base_QuestScript.xml @@ -51,10 +51,6 @@
  • - -
  • true @@ -62,6 +58,13 @@ enemyFaction
  • + +
  • Wula_PIA_Legion_Faction
  • + + + - + +
  • + +
  • + WULA_Base_Tex_Reward + permissionReward +
  • + + +
  • WULA_GlobalStorageSenderPod
  • + + +
  • Wula_PIA_Legion_Faction
  • +
    +
  • taxAmount - 100 + 1
  • taxInterval 250
  • - + +
  • + $points + 1 + taxAmount +
  • - Steel + Silver $taxAmount $taxInterval TaxPaymentSuccess @@ -666,6 +690,14 @@ true true
  • + + +
  • + + 唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n查看任务列表以了解更多。 + NegativeEvent +
  • +
  • TaxPaymentSuccess @@ -673,9 +705,17 @@
  • - 已成功从全局储存中扣除100钢铁作为税款。 + 帝国已经接收了税款,为了表彰你在纳税上的良好表现,一封税金缴纳凭证已经送到你的殖民地中! PositiveEvent
  • +
  • + $permissionReward +
  • +
  • + Wula_PIA_Legion_Faction + 10 + WULA_Base_Tex_Quest_Handle_Intime +
  • Success false @@ -683,7 +723,116 @@
  • + + +
  • + 2 + Handle_Outtime_Counter + + +
  • + 60000 + + + Wula_PIA_Legion_Faction + -5 + WULA_Base_Tex_Quest_Handle_Outtime + +
  • +
    + + +
  • + 180000 + + + +
  • + Handle_Outtime +
  • + + + + +
  • + Handle_Outtime + + +
  • + Handle_Outtime + WULA_Base_Tex_Quest_UI_1 +
  • +
  • + + 作为乌拉帝国的殖民地,你被发现未按时纳税——或许一次两次她们可以原谅你,但是一直拖欠必然会激怒她们! + NegativeEvent +
  • +
  • + Wula_PIA_Legion_Faction + -10 + WULA_Base_Tex_Quest_Handle_Outtime +
  • +
  • + Fail +
  • + + +
    + + WULA_Base_Tex_Quest_Handle_Intime + + + + WULA_Base_Tex_Quest_Handle_Outtime + + + + WULA_Base_Tex_Reward + + +
  • + 1 + + + + +
  • WULA_Tex_Voucher
  • + + + 1 + + + +
    +
    +
    + + WULA_Base_Tex_Quest_UI_1 + + Wula/Events/Portraits/WULA_Legion_6 + 「军团」,P.I.A + +
  • 你们没有按时交税——你们应该知道吧?\n\n<color=#820D13><i>我们都希望局势不会进一步恶化。</i></color>
  • +
    + +
  • + + true + (255,255,255,255) + (157,201,185,195) + (255,255,255,255) + (255,255,255,255) + +
  • + +
  • + +
  • + + +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDefs/WULA_Item.xml b/1.6/1.6/Defs/ThingDefs/WULA_Item.xml index 9626a056..8fc162fb 100644 --- a/1.6/1.6/Defs/ThingDefs/WULA_Item.xml +++ b/1.6/1.6/Defs/ThingDefs/WULA_Item.xml @@ -270,4 +270,31 @@ --> + + + + WULA_Tex_Voucher + + 这是乌拉帝国颁发的凭证,包含了一系列秘钥和电子身份信息,证明这个殖民地的公民是按时交税的模范公民。\n\n呃,她们该不会是在电子储存器上盖了个红印章吧? + + Wula/Item/WULA_Tex_Voucher + Graphic_Single + + None + false + Metal_Drop + Metal_Drop + true + false + + 1 + 0.01 + 50 + + +
  • ResourcesRaw
  • +
    + false + false +
    diff --git a/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml b/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml index c9793940..5df9ec46 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/WULA_Flyover_Item.xml @@ -790,7 +790,7 @@ 60 - 30 + 10 10 false diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml index 4452ada8..7294f7de 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/Wula_Base_QuestScript.xml @@ -55,4 +55,11 @@ 任务失败:[resolvedQuestName] 前来迎接[asker_nameDef]的穿梭机在离开时因为一些原因落下了[asker_objective]。[asker_pronoun]现在只能走回去了。[failLetterEndingCommon] + + +
  • questName->什一税税收
  • +
    + +
  • questDescription->唯死亡和税收不可避免——按时上交什一税是乌拉帝国殖民地的光荣义务。\n\n乌拉帝国的什一税会从殖民地储存在舰队中的资产里面扣除,你可以建造<color=#6BB7B7><i>乌拉帝国物资输送舱</i></color>来将物资输送到位于轨道上的舰队。\n\n你可以快速地准备好税金,乌拉帝国对积极纳税的殖民地会给予更多关照——但是如果一直拖延,则会惹其不快,甚至有可能被定性为叛国!
  • +
    \ No newline at end of file diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml index 75ff734e..0d3a8370 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml @@ -339,4 +339,9 @@ 战争机械已部署 剩余时间: {0} + + 什一税征收:等待激活... + 什一税征收:{0} {1} {2} + - 征收已完成 + - 逾期 \ No newline at end of file diff --git a/1.6/1.6/Languages/SimpChinese/DefInjected/ThingDef/Buildings_GlobalStorageSender.xml b/1.6/1.6/Languages/SimpChinese/DefInjected/ThingDef/Buildings_GlobalStorageSender.xml deleted file mode 100644 index 2a15ba9e..00000000 --- a/1.6/1.6/Languages/SimpChinese/DefInjected/ThingDef/Buildings_GlobalStorageSender.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - 全局存储输送舱 - 一个一次性的物资输送装置,可以将装载的货物直接发射到全局存储网络中,而无需选择目标地点。发射后即告销毁。 - - \ No newline at end of file diff --git a/1.6/1.6/Languages/SimpChinese/Keyed/GlobalStorageSender.xml b/1.6/1.6/Languages/SimpChinese/Keyed/GlobalStorageSender.xml deleted file mode 100644 index 9bc72f67..00000000 --- a/1.6/1.6/Languages/SimpChinese/Keyed/GlobalStorageSender.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - 发射到全局存储 - 将此输送舱中的所有物品直接发送到全局存储网络中。此操作将消耗燃料并销毁输送舱。 - 已将 {0} 发送到全局存储。 - 输送舱是空的,没有什么可以发送的。 - - \ No newline at end of file diff --git a/Content/Textures/Wula/Item/WULA_Tex_Voucher.png b/Content/Textures/Wula/Item/WULA_Tex_Voucher.png new file mode 100644 index 00000000..47e40410 Binary files /dev/null and b/Content/Textures/Wula/Item/WULA_Tex_Voucher.png differ diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/Building_GlobalWorkTable.cs b/Source/WulaFallenEmpire/GlobalWorkTable/Building_GlobalWorkTable.cs index c5f9ce93..4b0bf730 100644 --- a/Source/WulaFallenEmpire/GlobalWorkTable/Building_GlobalWorkTable.cs +++ b/Source/WulaFallenEmpire/GlobalWorkTable/Building_GlobalWorkTable.cs @@ -127,8 +127,6 @@ namespace WulaFallenEmpire } } - Log.Message($"[FactoryFacility Check] Found {allFlyOvers.Count} FlyOvers on map"); - foreach (var thing in allFlyOvers) { if (thing is FlyOver flyOver && !flyOver.Destroyed) @@ -137,23 +135,16 @@ namespace WulaFallenEmpire var facilitiesComp = flyOver.GetComp(); if (facilitiesComp == null) { - Log.Warning($"[FactoryFacility Check] FlyOver at {flyOver.Position} has no CompFlyOverFacilities"); continue; } if (facilitiesComp.HasFacility("FactoryFacility")) { - Log.Message($"[FactoryFacility Check] Found valid FlyOver at {flyOver.Position} with FactoryFacility"); return true; } - else - { - Log.Message($"[FactoryFacility Check] FlyOver at {flyOver.Position} missing FactoryFacility. Has: {string.Join(", ", facilitiesComp.GetActiveFacilities())}"); - } } } - Log.Message("[FactoryFacility Check] No FlyOver with FactoryFacility found"); return false; } catch (System.Exception ex) @@ -333,8 +324,6 @@ namespace WulaFallenEmpire // 如果是Pawn,需要特殊处理 if (thingDef.race != null) { - Log.Message($"[Airdrop] Processing {remainingCount} pawns of type {thingDef.defName}"); - // 对于Pawn,每个单独生成 for (int i = 0; i < remainingCount; i++) { @@ -352,7 +341,6 @@ namespace WulaFallenEmpire pawn.drafter = new Pawn_DraftController(pawn); allItems.Add(pawn); - Log.Message($"[Airdrop] Successfully generated pawn: {pawn.Label}"); } else { @@ -405,10 +393,8 @@ namespace WulaFallenEmpire } if (allItems.Count == 0) { - Log.Message("[Airdrop] No items to distribute"); return podContents; } - Log.Message($"[Airdrop] Total items to distribute: {allItems.Count}"); // 平均分配物品到空投舱 int currentPod = 0; foreach (Thing item in allItems) @@ -453,13 +439,11 @@ namespace WulaFallenEmpire { // 金属类 -> 玻璃钢 selectedStuff = ThingDefOf.Plasteel; - Log.Message($"[Material Rule] {thingDef.defName} requires metallic, using Plasteel"); } else if (fabricCategory != null) { // 布革类 -> 超织物 selectedStuff = ThingDefOf_WULA.Hyperweave; - Log.Message($"[Material Rule] {thingDef.defName} requires fabric/leather, using Hyperweave"); } // 创建带有指定材质的物品 @@ -493,7 +477,6 @@ namespace WulaFallenEmpire Log.Error($"[Airdrop] Work table has no faction"); return null; } - Log.Message($"[Airdrop] Work table faction: {workTableFaction.def.defName}"); // 获取该种族的所有PawnKindDef var availableKinds = DefDatabase.AllDefs .Where(kind => kind.race == pawnType) @@ -503,7 +486,6 @@ namespace WulaFallenEmpire Log.Error($"[Airdrop] No PawnKindDef found for race: {pawnType.defName}"); return null; } - Log.Message($"[Airdrop] Found {availableKinds.Count} PawnKindDefs for {pawnType.defName}"); // 最高优先级:与工作台派系完全相同的PawnKind var matchingFactionKinds = availableKinds .Where(kind => kind.defaultFactionDef != null && @@ -512,7 +494,6 @@ namespace WulaFallenEmpire if (matchingFactionKinds.Count > 0) { var selected = matchingFactionKinds.RandomElement(); - Log.Message($"[Airdrop] Selected matching faction PawnKind: {selected.defName} (faction: {workTableFaction.def.defName})"); return selected; } // 次高优先级:玩家派系的PawnKind(如果工作台是玩家派系) @@ -526,7 +507,6 @@ namespace WulaFallenEmpire if (playerFactionKinds.Count > 0) { var selected = playerFactionKinds.RandomElement(); - Log.Message($"[Airdrop] Selected player faction PawnKind: {selected.defName}"); return selected; } } diff --git a/Source/WulaFallenEmpire/QuestNodes/QuestNode_CheckGlobalResource.cs b/Source/WulaFallenEmpire/QuestNodes/QuestNode_CheckGlobalResource.cs index 6325dfe9..919fa320 100644 --- a/Source/WulaFallenEmpire/QuestNodes/QuestNode_CheckGlobalResource.cs +++ b/Source/WulaFallenEmpire/QuestNodes/QuestNode_CheckGlobalResource.cs @@ -11,19 +11,19 @@ namespace WulaFallenEmpire // 输入参数 public SlateRef resourceDef; public SlateRef requiredCount; - public SlateRef retryDelayTicks = 60; // 默认60 ticks (1秒) - public SlateRef successSignal; - public SlateRef failSignal; - public SlateRef deductOnSuccess = true; - public SlateRef useInputStorage = true; // true=输入存储, false=输出存储 - - // 保护参数不被序列化 + public SlateRef retryDelayTicks = 60; + [NoTranslate] - private string debugInfo; + public SlateRef successSignal; + + [NoTranslate] + public SlateRef failSignal; + + public SlateRef deductOnSuccess = true; + public SlateRef useInputStorage = true; protected override bool TestRunInt(Slate slate) { - // 测试模式下只检查参数是否有效 if (resourceDef == null || resourceDef.GetValue(slate) == null) { Log.Error("QuestNode_CheckGlobalResource: resourceDef is null"); @@ -36,7 +36,6 @@ namespace WulaFallenEmpire return false; } - // 测试全局存储组件是否存在 var globalStorage = Find.World.GetComponent(); if (globalStorage == null) { @@ -55,13 +54,13 @@ namespace WulaFallenEmpire ThingDef actualResourceDef = resourceDef.GetValue(slate); int actualRequiredCount = requiredCount.GetValue(slate); int actualRetryDelay = retryDelayTicks.GetValue(slate); - string actualSuccessSignal = successSignal.GetValue(slate); - string actualFailSignal = failSignal.GetValue(slate); + string actualSuccessSignal = QuestGenUtility.HardcodedSignalWithQuestID(successSignal.GetValue(slate)); + string actualFailSignal = QuestGenUtility.HardcodedSignalWithQuestID(failSignal.GetValue(slate)); bool actualDeductOnSuccess = deductOnSuccess.GetValue(slate); bool actualUseInputStorage = useInputStorage.GetValue(slate); // 创建调试信息 - debugInfo = $"Checking {actualRequiredCount} {actualResourceDef?.defName ?? "NULL"} in {(actualUseInputStorage ? "Input" : "Output")} Storage with retry delay {actualRetryDelay}"; + string debugInfo = $"Checking {actualRequiredCount} {actualResourceDef?.defName ?? "NULL"} in {(actualUseInputStorage ? "Input" : "Output")} Storage with retry delay {actualRetryDelay}"; // 添加任务部分 QuestPart_GlobalResourceCheck part = new QuestPart_GlobalResourceCheck @@ -73,7 +72,9 @@ namespace WulaFallenEmpire failSignal = actualFailSignal, deductOnSuccess = actualDeductOnSuccess, useInputStorage = actualUseInputStorage, - debugInfo = debugInfo + debugInfo = debugInfo, + // 关键:设置激活信号为任务接受信号 + inSignalEnable = QuestGenUtility.HardcodedSignalWithQuestID(quest.InitiateSignal) }; quest.AddPart(part); diff --git a/Source/WulaFallenEmpire/QuestNodes/QuestNode_Hyperlinks.cs b/Source/WulaFallenEmpire/QuestNodes/QuestNode_Hyperlinks.cs new file mode 100644 index 00000000..7a6280c7 --- /dev/null +++ b/Source/WulaFallenEmpire/QuestNodes/QuestNode_Hyperlinks.cs @@ -0,0 +1,75 @@ +using RimWorld; +using RimWorld.QuestGen; +using System.Collections.Generic; +using Verse; + +namespace WulaFallenEmpire +{ + public class QuestNode_Hyperlinks : QuestNode + { + // 输入参数 - 使用 SlateRef 来支持从任务slate中获取值 + public SlateRef> thingDefs; + public SlateRef> pawns; + public SlateRef> factionDefs; // 改为 FactionDef 而不是 Faction + public SlateRef> researchProjects; + + protected override bool TestRunInt(Slate slate) + { + // 测试模式下,只要参数有效就返回true + return true; + } + + protected override void RunInt() + { + Slate slate = QuestGen.slate; + Quest quest = QuestGen.quest; + + // 获取实际的值 + List actualThingDefs = thingDefs.GetValue(slate); + List actualPawns = pawns.GetValue(slate); + List actualFactionDefs = factionDefs.GetValue(slate); + List actualResearchProjects = researchProjects.GetValue(slate); + + // 创建任务部分 + QuestPart_Hyperlinks hyperlinksPart = new QuestPart_Hyperlinks(); + + // 设置超链接数据 + if (actualThingDefs != null) + { + hyperlinksPart.thingDefs.AddRange(actualThingDefs); + } + + if (actualPawns != null) + { + hyperlinksPart.pawns.AddRange(actualPawns); + } + + if (actualFactionDefs != null) + { + // 将 FactionDef 转换为 Faction + foreach (FactionDef factionDef in actualFactionDefs) + { + Faction faction = Find.FactionManager.FirstFactionOfDef(factionDef); + if (faction != null) + { + hyperlinksPart.factions.Add(faction); + } + else + { + Log.Warning($"QuestNode_Hyperlinks: Could not find faction for def {factionDef.defName}"); + } + } + } + + if (actualResearchProjects != null) + { + hyperlinksPart.researchProjects.AddRange(actualResearchProjects); + } + + // 添加到任务 + quest.AddPart(hyperlinksPart); + + Log.Message($"QuestNode_Hyperlinks: Added hyperlinks - Things: {actualThingDefs?.Count ?? 0}, Pawns: {actualPawns?.Count ?? 0}, Factions: {actualFactionDefs?.Count ?? 0}, Research: {actualResearchProjects?.Count ?? 0}"); + } + } +} diff --git a/Source/WulaFallenEmpire/QuestNodes/QuestPart_GlobalResourceCheck.cs b/Source/WulaFallenEmpire/QuestNodes/QuestPart_GlobalResourceCheck.cs index d99764c6..d395a319 100644 --- a/Source/WulaFallenEmpire/QuestNodes/QuestPart_GlobalResourceCheck.cs +++ b/Source/WulaFallenEmpire/QuestNodes/QuestPart_GlobalResourceCheck.cs @@ -1,5 +1,6 @@ using RimWorld; using RimWorld.Planet; +using System; using System.Collections.Generic; using Verse; using RimWorld.QuestGen; @@ -12,19 +13,38 @@ namespace WulaFallenEmpire public ThingDef resourceDef; public int requiredCount; public int retryDelayTicks = 60; + + [NoTranslate] public string successSignal; + + [NoTranslate] public string failSignal; + public bool deductOnSuccess = true; public bool useInputStorage = true; public string debugInfo; // 状态变量 - private int nextRetryTick = -1; + public int nextRetryTick = -1; private bool hasSucceeded = false; private bool hasFailed = false; private int retryCount = 0; private const int MAX_RETRY_COUNT = 1000; + public override void AssignDebugData() + { + base.AssignDebugData(); + + resourceDef = ThingDefOf.Steel; + requiredCount = 100; + retryDelayTicks = 60; + successSignal = "TaxPaymentSuccess"; + failSignal = "TaxPaymentFailed"; + deductOnSuccess = true; + useInputStorage = true; + debugInfo = "Debug: Tax Collection Check"; + } + protected override void Enable(SignalArgs receivedArgs) { base.Enable(receivedArgs); @@ -34,32 +54,28 @@ namespace WulaFallenEmpire Log.Message($"QuestPart_GlobalResourceCheck Enabled: Will check for {requiredCount} {resourceDef?.defName} in {(useInputStorage ? "Input" : "Output")} Storage"); } - public override void Notify_QuestSignalReceived(Signal signal) - { - base.Notify_QuestSignalReceived(signal); - - // 如果任务已经结束,停止所有操作 - if (quest.State != QuestState.Ongoing && quest.State != QuestState.NotYetAccepted) - { - DoCleanup(); - return; - } - } - public override void QuestPartTick() { base.QuestPartTick(); - // 如果已经成功或失败,或者任务已结束,不再处理 - if (hasSucceeded || hasFailed || (quest.State != QuestState.Ongoing && quest.State != QuestState.NotYetAccepted)) + // 如果任务已经结束,停止处理 + if (quest.State != QuestState.Ongoing) + { + return; + } + + // 如果已经成功或失败,不再处理 + if (hasSucceeded || hasFailed) { - DoCleanup(); return; } // 检查是否到了重试时间 - if (Find.TickManager.TicksGame < nextRetryTick && nextRetryTick != -1) + int currentTick = Find.TickManager.TicksGame; + if (nextRetryTick == -1 || currentTick < nextRetryTick) + { return; + } // 执行资源检查 CheckGlobalResource(); @@ -67,44 +83,52 @@ namespace WulaFallenEmpire private void CheckGlobalResource() { - // 更新下次重试时间 - nextRetryTick = Find.TickManager.TicksGame + retryDelayTicks; - retryCount++; - - // 获取全局资源储存器 - GlobalStorageWorldComponent globalStorage = Find.World.GetComponent(); - if (globalStorage == null) + try { - Log.Error("QuestPart_GlobalResourceCheck: GlobalStorageWorldComponent not found"); - HandleFailure("Global storage component missing"); - return; + // 更新下次重试时间 + nextRetryTick = Find.TickManager.TicksGame + retryDelayTicks; + retryCount++; + + // 获取全局资源储存器 + GlobalStorageWorldComponent globalStorage = Find.World.GetComponent(); + if (globalStorage == null) + { + Log.Error("QuestPart_GlobalResourceCheck: GlobalStorageWorldComponent not found"); + HandleFailure("Global storage component missing"); + return; + } + + if (resourceDef == null) + { + Log.Error("QuestPart_GlobalResourceCheck: resourceDef is null"); + HandleFailure("Resource definition is null"); + return; + } + + // 检查资源是否足够 + int currentAmount = useInputStorage ? + globalStorage.GetInputStorageCount(resourceDef) : + globalStorage.GetOutputStorageCount(resourceDef); + + bool hasEnough = currentAmount >= requiredCount; + + Log.Message($"GlobalResourceCheck [{retryCount}]: {currentAmount}/{requiredCount} {resourceDef.defName} in {(useInputStorage ? "Input" : "Output")} Storage - Enough: {hasEnough}"); + + if (hasEnough) + { + // 资源足够,处理成功 + HandleSuccess(globalStorage); + } + else + { + // 资源不足,安排重试 + HandleFailure($"Insufficient resources: {currentAmount}/{requiredCount}"); + } } - - if (resourceDef == null) + catch (Exception ex) { - Log.Error("QuestPart_GlobalResourceCheck: resourceDef is null"); - HandleFailure("Resource definition is null"); - return; - } - - // 检查资源是否足够 - int currentAmount = useInputStorage ? - globalStorage.GetInputStorageCount(resourceDef) : - globalStorage.GetOutputStorageCount(resourceDef); - - bool hasEnough = currentAmount >= requiredCount; - - Log.Message($"GlobalResourceCheck [{retryCount}]: {currentAmount}/{requiredCount} {resourceDef.defName} in {(useInputStorage ? "Input" : "Output")} Storage - Enough: {hasEnough}"); - - if (hasEnough) - { - // 资源足够,处理成功 - HandleSuccess(globalStorage); - } - else - { - // 资源不足,安排重试 - HandleFailure($"Insufficient resources: {currentAmount}/{requiredCount}"); + Log.Error($"GlobalResourceCheck: Exception during check - {ex}"); + HandleFailure($"Exception: {ex.Message}"); } } @@ -127,16 +151,15 @@ namespace WulaFallenEmpire Log.Message($"GlobalResourceCheck: SUCCESS - {(deductOnSuccess ? "Deducted" : "Found")} {requiredCount} {resourceDef.defName} from {(useInputStorage ? "Input" : "Output")} Storage"); - // 发送成功信号 - 使用 QuestGenUtility 来生成带任务前缀的信号 + // 发送成功信号 if (!successSignal.NullOrEmpty()) { - string fullSignal = QuestGenUtility.HardcodedSignalWithQuestID(successSignal); - Find.SignalManager.SendSignal(new Signal(fullSignal)); - Log.Message($"GlobalResourceCheck: Sent success signal '{fullSignal}'"); + Find.SignalManager.SendSignal(new Signal(successSignal)); + Log.Message($"GlobalResourceCheck: Sent success signal '{successSignal}'"); } - // 清理这个任务部分 - DoCleanup(); + // 完成这个任务部分 + Complete(); } private void HandleFailure(string reason = "") @@ -150,12 +173,11 @@ namespace WulaFallenEmpire // 发送失败信号 if (!failSignal.NullOrEmpty()) { - string fullSignal = QuestGenUtility.HardcodedSignalWithQuestID(failSignal); - Find.SignalManager.SendSignal(new Signal(fullSignal)); - Log.Message($"GlobalResourceCheck: Sent fail signal '{fullSignal}' after max retries"); + Find.SignalManager.SendSignal(new Signal(failSignal)); + Log.Message($"GlobalResourceCheck: Sent fail signal '{failSignal}' after max retries"); } - DoCleanup(); + Complete(); return; } @@ -171,13 +193,6 @@ namespace WulaFallenEmpire Log.Message($"GlobalResourceCheck: Scheduled retry #{retryCount + 1} in {retryDelayTicks} ticks for {requiredCount} {resourceDef.defName}. Reason: {reason}"); } - // 使用新名称避免与基类冲突 - private void DoCleanup() - { - // 标记为已完成,停止tick更新 - nextRetryTick = -1; - } - public override void ExposeData() { base.ExposeData(); @@ -197,29 +212,39 @@ namespace WulaFallenEmpire Scribe_Values.Look(ref retryCount, "retryCount"); } - public override void AssignDebugData() - { - base.AssignDebugData(); - - resourceDef = ThingDefOf.Steel; - requiredCount = 100; - retryDelayTicks = 60; - successSignal = "TaxPaymentSuccess"; - failSignal = "TaxPaymentFailed"; - deductOnSuccess = true; - useInputStorage = true; - debugInfo = "Debug: Tax Collection Check"; - } - public override string DescriptionPart { get { - string status = hasSucceeded ? "SUCCEEDED" : - hasFailed ? "FAILED" : - $"CHECKING (retry #{retryCount}, next in {nextRetryTick - Find.TickManager.TicksGame} ticks)"; + if (State != QuestPartState.Enabled) + return "WULA_TaxCollection.Waiting".Translate(); // 等待激活 + + string statusKey = hasSucceeded ? "WULA_TaxCollection.Status.Succeeded" : + hasFailed ? "WULA_TaxCollection.Status.Failed" : + ""; - return $"Tax Collection: {requiredCount} {resourceDef?.defName ?? "NULL"} - {status}"; + string statusText; + if (hasSucceeded || hasFailed) + { + statusText = statusKey.Translate(); + } + else + { + // 只有在调试模式下才显示下一次检查的tick + if (Prefs.DevMode) + { + statusText = statusKey.Translate(retryCount, Math.Max(0, nextRetryTick - Find.TickManager.TicksGame)); + } + else + { + statusText = statusKey.Translate(retryCount); + } + } + + // 硬编码状态文本颜色为 #820D13 + string coloredStatusText = $"{statusText}"; + + return "WULA_TaxCollection.Status".Translate(requiredCount, resourceDef?.label ?? "NULL", coloredStatusText); } } } diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index d35b350b..bf7e725c 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -209,6 +209,7 @@ + diff --git a/美术与文本源文件/Wula/Item/WULA_Syhth_Passion_Trainer.sai2 b/美术与文本源文件/Wula/Item/WULA_Syhth_Passion_Trainer.sai2 deleted file mode 100644 index 826cbd22..00000000 Binary files a/美术与文本源文件/Wula/Item/WULA_Syhth_Passion_Trainer.sai2 and /dev/null differ diff --git a/美术与文本源文件/Wula/Item/WULA_Tex_Voucher.sai2 b/美术与文本源文件/Wula/Item/WULA_Tex_Voucher.sai2 new file mode 100644 index 00000000..ae06e38e Binary files /dev/null and b/美术与文本源文件/Wula/Item/WULA_Tex_Voucher.sai2 differ