From b28a03f565fe7b6a0d6bf579ce247bd617ba41b9 Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 18:36:01 +0800 Subject: [PATCH] Fold scattered constants into Tuning Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 2 +- src/Decentralized.Domain/CardLabels.cs | 2 +- src/Decentralized.Domain/CardLook.cs | 2 +- src/Decentralized.Domain/Dealer.cs | 4 ++-- src/Decentralized.Domain/Market.cs | 4 ++-- src/Decentralized.Domain/Tuning.cs | 12 ++++++++++++ src/Decentralized.Domain/UsedDealer.cs | 8 ++++---- src/Decentralized/UsedDealerClient.cs | 5 ++--- 8 files changed, 25 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64f18c2..58ad8ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - 低档次的卡也会被冒充:新增废片芯片 RX10(不上架,只作假卡背后的真实芯片)。 - 型号档次与实物不符(供电口、风扇数)的卡,摆给顾客时必被看穿并扣信誉(原来 50%),堵住用标签机把低档卡改成高档型号转卖的漏洞。 - 显卡型号改名:Probidia RZX → RTX,PMD RZ → RX(RTX 60/70/80/90,RX 70/80/800/900);贴图重新生成。旧存档里的旧型号物品不再识别。 -- 买家看穿率、信誉扣减封顶收进 `Tuning.cs`。 +- 散落的常量收进 `Tuning.cs`:买家看穿率与信誉封顶、杰克逊博士上货、二手贩子来访 / 种类 / 加价 / 假卡 / 隐瞒、显卡价值下限、非主交易对套利与深度。型号表、成色折价、外观阈值是数据表,仍留在原文件。 - 单元测试 8909 项通过;游戏内只验证了模组正常载入,没有跑到新的假卡、减半随机和币付款溢价的实际画面。 ### 第二阶段(进行中) diff --git a/src/Decentralized.Domain/CardLabels.cs b/src/Decentralized.Domain/CardLabels.cs index 957608d..69906b9 100644 --- a/src/Decentralized.Domain/CardLabels.cs +++ b/src/Decentralized.Domain/CardLabels.cs @@ -135,7 +135,7 @@ namespace Decentralized.Domain var c = Claim.Truth(u); if (kind == DealerKind.Honest) return c; c.Model = u.Model; - double hide = kind == DealerKind.Scammer ? 1.0 : 0.7; + double hide = kind == DealerKind.Scammer ? 1.0 : Tuning.UsedMiddlemanHide; foreach (int r in new[] { RowFan, RowFingers, RowBracket, RowPrint, RowSerial, RowSeal }) if (rng.Chance(hide)) c = c.With(r, 0); return c; diff --git a/src/Decentralized.Domain/CardLook.cs b/src/Decentralized.Domain/CardLook.cs index 2780b8e..a493e23 100644 --- a/src/Decentralized.Domain/CardLook.cs +++ b/src/Decentralized.Domain/CardLook.cs @@ -105,7 +105,7 @@ namespace Decentralized.Domain public static long Of(string model, double health) { var spec = Hardware.Specs[model]; - double f = 0.25 + 0.75 * Math.Max(0, Math.Min(100, health)) / 100.0; + double f = Tuning.CardValueFloor + (1 - Tuning.CardValueFloor) * Math.Max(0, Math.Min(100, health)) / 100.0; return Math.Max(1, (long)Math.Round(spec.Price * f)); } diff --git a/src/Decentralized.Domain/Dealer.cs b/src/Decentralized.Domain/Dealer.cs index 51fad19..6d03852 100644 --- a/src/Decentralized.Domain/Dealer.cs +++ b/src/Decentralized.Domain/Dealer.cs @@ -13,8 +13,8 @@ namespace Decentralized.Domain public static readonly string[] Advanced = { "RTX70", "RX80", "RTX80", "RX800" }; public static readonly string[] Flagship = { "RTX90", "RX900" }; - public const int AdvancedFromDay = 10, FlagshipFromDay = 30, SpecialFlagshipFromDay = 20; - public const double RigRestockChance = 0.30, AdvancedChance = 0.60, AdvancedSecondChance = 0.30, FlagshipChance = 0.25; + public const int AdvancedFromDay = Tuning.DealerAdvancedFromDay, FlagshipFromDay = Tuning.DealerFlagshipFromDay, SpecialFlagshipFromDay = Tuning.DealerSpecialFlagshipFromDay; + public const double RigRestockChance = Tuning.DealerRigRestock, AdvancedChance = Tuning.DealerAdvanced, AdvancedSecondChance = Tuning.DealerAdvancedSecond, FlagshipChance = Tuning.DealerFlagship; public static List Stock(int day, bool ownsRig, bool specialStock, Rng rng) { diff --git a/src/Decentralized.Domain/Market.cs b/src/Decentralized.Domain/Market.cs index bc5e246..b4a1be0 100644 --- a/src/Decentralized.Domain/Market.cs +++ b/src/Decentralized.Domain/Market.cs @@ -22,8 +22,8 @@ namespace Decentralized.Domain /// 开门时的参考价,夜间用它和收盘价算当日均价(合约的标记价)。 public double OpenPrice = Tuning.PscStartPrice; - public const double ArbRate = 0.5; // 非主交易对每晚被拉回参考价的比例 - public const double SideDepthShare = 0.3; // 非主交易对的深度占主交易对的比例 + public const double ArbRate = Tuning.SideArbRate; // 非主交易对每晚被拉回参考价的比例 + public const double SideDepthShare = Tuning.SideDepthShare; // 非主交易对的深度占主交易对的比例 public static Market CreateDefault(int day) { diff --git a/src/Decentralized.Domain/Tuning.cs b/src/Decentralized.Domain/Tuning.cs index 7c7fe10..f880e17 100644 --- a/src/Decentralized.Domain/Tuning.cs +++ b/src/Decentralized.Domain/Tuning.cs @@ -71,6 +71,18 @@ namespace Decentralized.Domain /// 顾客验货:说法里每一项隐瞒被看穿的概率;型号档次不符(供电口、风扇数一眼可见)必被看穿;一次看穿最多扣的信誉。 public const double CustomerSpotChance = 0.50, CustomerSpotTierMismatch = 1.0; public const int RepLossMax = 25; + /// 杰克逊博士上货:进阶 / 旗舰货的起始天(有特殊进货渠道时旗舰第 20 天起),矿架补货、进阶货(及第二件)、旗舰货的概率。 + public const int DealerAdvancedFromDay = 10, DealerFlagshipFromDay = 30, DealerSpecialFlagshipFromDay = 20; + public const double DealerRigRestock = 0.30, DealerAdvanced = 0.60, DealerAdvancedSecond = 0.30, DealerFlagship = 0.25; + /// 二手贩子:每天来访概率与最早来访日;骗子占比 = 基础 + 每天增量,封顶;中间商占比;中间商加价;中间商 / 骗子夹带假卡的比例; + /// 中间商把每项问题说成没问题的概率(骗子全说)。 + public const double UsedVisitChance = 0.05, UsedScamBase = 0.10, UsedScamPerDay = 0.004, UsedScamMax = 0.30, UsedMiddlemanShare = 0.30; + public const double UsedMiddlemanMarkup = 0.08, UsedFakeMiddleman = 0.10, UsedFakeScammer = 0.45, UsedMiddlemanHide = 0.70; + public const int UsedFirstDay = 3; + /// 显卡价值 = 型号定价 ×(下限 + (1 − 下限) × 健康度)。 + public const double CardValueFloor = 0.25; + /// 非主交易对每晚被拉回参考价的比例,及其深度占主交易对的比例。 + public const double SideArbRate = 0.5, SideDepthShare = 0.3; /// 单个金融违规事件记入的罪证上限。 public const double CrimeEventCap = 400; diff --git a/src/Decentralized.Domain/UsedDealer.cs b/src/Decentralized.Domain/UsedDealer.cs index c89aaff..07b1abd 100644 --- a/src/Decentralized.Domain/UsedDealer.cs +++ b/src/Decentralized.Domain/UsedDealer.cs @@ -18,15 +18,15 @@ namespace Decentralized.Domain public static class UsedDealers { - public const double MiddlemanMarkup = 0.08; - public const double FakeShareMiddleman = 0.10, FakeShareScammer = 0.45; + public const double MiddlemanMarkup = Tuning.UsedMiddlemanMarkup; + public const double FakeShareMiddleman = Tuning.UsedFakeMiddleman, FakeShareScammer = Tuning.UsedFakeScammer; /// 今天来的贩子的类型:骗子越往后越多。 public static DealerKind Kind(int day, Rng rng) { - double scam = Math.Min(0.30, 0.10 + day * 0.004); + double scam = Math.Min(Tuning.UsedScamMax, Tuning.UsedScamBase + day * Tuning.UsedScamPerDay); double r = rng.NextDouble(); - return r < scam ? DealerKind.Scammer : r < scam + 0.30 ? DealerKind.Middleman : DealerKind.Honest; + return r < scam ? DealerKind.Scammer : r < scam + Tuning.UsedMiddlemanShare ? DealerKind.Middleman : DealerKind.Honest; } /// 能出现在二手市场上的型号:按天数放开,旗舰第 30 天起。 diff --git a/src/Decentralized/UsedDealerClient.cs b/src/Decentralized/UsedDealerClient.cs index c873d47..05ed8a3 100644 --- a/src/Decentralized/UsedDealerClient.cs +++ b/src/Decentralized/UsedDealerClient.cs @@ -12,8 +12,7 @@ namespace Decentralized public static class UsedDealerClient { public const string Appraisal = "pd_gpu_appraisal"; - private const double VisitChance = 0.05; - private static int lastVisitDay = -1; + private static int lastVisitDay = -1; public static void Subscribe() { @@ -55,7 +54,7 @@ namespace Decentralized Log.Guard("二手贩子", () => { int day = StoreStation.GetDayCounter(); - if (day < 3 || day == lastVisitDay || !Session.Data.Rng.Chance(VisitChance)) return; + if (day < Tuning.UsedFirstDay || day == lastVisitDay || !Session.Data.Rng.Chance(Tuning.UsedVisitChance)) return; lastVisitDay = day; manager.AddClient(Create(UsedDealers.Kind(day, Session.Data.Rng))); });