From ad12918511bfdbfd84fd1d5cd9093872253e91c5 Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 17:20:08 +0800 Subject: [PATCH] Test entries for running nights and crackdowns; night logging; changelog with in-game verification Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 6 ++++-- src/Decentralized/CoinCustomers.cs | 19 ++++++++++++++++++- src/Decentralized/Night.cs | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6860768..5d05c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,12 @@ ### 第二阶段(进行中) -- CRT 冻结:镇压事件开始时,按黑市声望(声望 0 时 40%,每点 −0.8%,50 以上不会)冻结钱包里一半的 CRT,3 天后解冻;冻结部分仍计入余额与估值,但不能交易、不能存混币器。Web3 页钱包下显示"CRT 冻结 N,第 X 天解冻";上报纸,夜间日志写冻结与解冻。开发者模式 F9 有 `Frozen CRT (test)`。游戏内验证了冻结显示与超额卖出被拒;镇压事件触发和夜间解冻只有单元测试。税与稽查不做(游戏本身没有税)。 +- 开发者模式 F9 新增 `Run night (test)`(走游戏自己的夜间流程并进入下一天,事件按天数过期)和 `Start crackdown (test)`,用来测夜间逻辑;`Tainted wallet (test)` 现在同时给 1000 CRT。 + +- CRT 冻结:镇压事件开始时,按黑市声望(声望 0 时 40%,每点 −0.8%,50 以上不会)冻结钱包里一半的 CRT,3 天后解冻;冻结部分仍计入余额与估值,但不能交易、不能存混币器。Web3 页钱包下显示"CRT 冻结 N,第 X 天解冻";上报纸,夜间日志写冻结与解冻。开发者模式 F9 有 `Frozen CRT (test)`。游戏内验证了冻结显示、超额卖出被拒、镇压事件触发冻结(黑市声望 0,多次镇压里命中一次)和 3 天后夜间解冻。税与稽查不做(游戏本身没有税)。 - 人脉网络里本 mod 单独一页"Web3":入口(400)和混币器(700,需先加入)都放在这页。 -- 混币器:终端 Web3 页里多一个"混币器"子页(买了升级才出现,和"交易"并列)。选币种、数量、1–5 轮,存入后每轮扣 2% 手续费并降低污点(基准每轮 35%,存入越大清洗越差,匿名集 = 2 万信用点背景量 + 存入量),轮数即等待天数,到期提回同一个地址;提回后一周内出金审查按"来自混币器"加重。镇压事件开始时 50% 被制裁 5 天,期间提出的币地址被标记,并上报纸;每晚 0.4% 跑路。夜间日志写提回与污点变化。开发者模式 F9 有 `Tainted wallet (test)`。游戏内验证了解锁、页面、存入与污点带走;夜间提回只有单元测试(测试存档里无法正常过夜)。 +- 混币器:终端 Web3 页里多一个"混币器"子页(买了升级才出现,和"交易"并列)。选币种、数量、1–5 轮,存入后每轮扣 2% 手续费并降低污点(基准每轮 35%,存入越大清洗越差,匿名集 = 2 万信用点背景量 + 存入量),轮数即等待天数,到期提回同一个地址;提回后一周内出金审查按"来自混币器"加重。镇压事件开始时 50% 被制裁 5 天,期间提出的币地址被标记,并上报纸;每晚 0.4% 跑路。夜间日志写提回与污点变化。开发者模式 F9 有 `Tainted wallet (test)`。游戏内验证了解锁、页面、存入与污点带走,夜间提回(50 PSC 存两轮,提回 48.02,污点 1500 → 777,与预览一致)和镇压触发制裁。 - 用币付款的顾客:排队的买家里,上层付 CRC(12%)、黑市付 CRT(25%)、革命派付 CRA(25%)、下层付 PSC(10%)。成交时扣回信用点(现金不变),按当日币价换成币进热钱包,顾客当场说一句"成交,N CRT 已转入热钱包";赃物款项不记销赃,改成币带污点(货值 × 赃物热度%);夜间日志汇总当天用币结算的额度。开发者模式 F9 有测试入口(Coin buyer)。已在游戏里实测:成交后现金不变,四笔种子按币价记入 CRT,顾客对话显示。 diff --git a/src/Decentralized/CoinCustomers.cs b/src/Decentralized/CoinCustomers.cs index 8cdb35e..de97a3a 100644 --- a/src/Decentralized/CoinCustomers.cs +++ b/src/Decentralized/CoinCustomers.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using Decentralized.Domain; namespace Decentralized @@ -15,6 +16,22 @@ namespace Decentralized public static void Subscribe() { ModHook.OnGenerateCustomerLate += OnGenerate; + ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Run night (test)", () => Log.Guard("过夜(测试)", () => + { + // 走游戏自己的夜间流程(EndNight 会触发本 mod 的夜间结算),再进下一天并开门前的日程 + // 游戏过夜会清空前柜台,先把自己的东西收进物品栏 + foreach (var it in EmporiumEntry.Instance.frontInvinvElement.childItems.ToList()) + if (GeneralHelper.IsItemOwned(it)) GraphUtils.TryAcceptAll(EmporiumEntry.Instance.invElement, it); + PlayerStore.Instance.EndNight(); + StoreStation.Instance.storeEventManager.OnDayEnd(); // 让事件按天数过期 + StoreStation.Instance.StartDay(); + Log.Info($"过夜完成,现在是第 {StoreStation.GetDayCounter()} 天"); + })); + ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Start crackdown (test)", () => Log.Guard("镇压(测试)", () => + { + StoreStation.Instance.storeEventManager.ActivateEvent(OperationListSec.Crackdown()); + Log.Info("镇压事件已激活"); + })); ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Frozen CRT (test)", () => Log.Guard("冻结 CRT(测试)", () => { var w = Session.Data.Hot; @@ -25,7 +42,7 @@ namespace Decentralized ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Tainted wallet (test)", () => Log.Guard("带污点的钱包(测试)", () => { var w = Session.Data.Hot; - w.Add(Assets.PSC, 100); w.Taint += 3000; w.Basis += 2000; + w.Add(Assets.PSC, 100); w.Add(Assets.CRT, 1000); w.Taint += 3000; w.Basis += 2000; Log.Info($"钱包:PSC {w.Get(Assets.PSC):0.##},污点 {w.Taint:0}"); })); ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Coin buyer (test)", () => Log.Guard("用币付款顾客(测试)", () => diff --git a/src/Decentralized/Night.cs b/src/Decentralized/Night.cs index 1a7935f..ec48ec3 100644 --- a/src/Decentralized/Night.cs +++ b/src/Decentralized/Night.cs @@ -82,6 +82,7 @@ namespace Decentralized var d = Session.Data; int day = StoreStation.GetDayCounter(); var events = ActiveEvents(); + Log.Info($"夜间事件:{string.Join(",", events)}(新增 {string.Join(",", events.Where(e => !d.ActiveEvents.Contains(e)))}),黑市声望 {StoreReputation.GetBMReputation()}"); bool wasSanctioned = d.Mixer.Sanctioned(day); foreach (var ev in events.Where(e => !d.ActiveEvents.Contains(e))) { @@ -135,6 +136,7 @@ namespace Decentralized if (mined > 0) ps.AddNightLog(L.T("nightlog.mined", Fmt.Num(mined))); foreach (var m in d.Mixer.Night(d.Hot, day, Session.Price, d.Rng)) { + Log.Info($"混币器:{(m.Rugged ? "跑路" : "提回")} {m.Amount:0.##} {m.Asset},污点 {m.TaintBefore:0} → {m.TaintAfter:0},标记 {m.Flagged}"); if (m.Rugged) ps.AddNightLog(L.T("nightlog.mixer_rug", Fmt.Num(m.Amount), m.Asset), "cc7755"); else { @@ -147,6 +149,7 @@ namespace Decentralized if (unpowered > 0 && units.Count + unpowered > 0) ps.AddNightLog(L.T("nightlog.unpowered", unpowered), "cc7755"); if (d.CoinSalesToday > 0) ps.AddNightLog(L.T("nightlog.coinpay", Fmt.Credits(d.CoinSalesToday))); d.CoinSalesToday = 0; + Log.Info($"夜间结算第 {day} 天:钱包污点 {d.Hot.Taint:0},CRT {d.Hot.Get(Assets.CRT):0}(冻结 {(d.Hot.Frozen.TryGetValue(Assets.CRT, out var fz) ? fz : 0):0}),混币器在途 {d.Mixer.Pending.Count},制裁至 {d.Mixer.SanctionedUntil}"); Session.Save(); } }