Fold scattered constants into Tuning

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-03 18:36:01 +08:00
1 parent 81b42ac2d3
commit b28a03f565
8 files changed
+25 -14

No files matched your search

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