Tumbler 扩展:治安部探员与搜查、密钥泄露还原出款污点、审判预测盘、黑市跑路、报复、长期联系人、混币器换皮重开

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-08 18:30:28 +08:00
1 parent 0f26d88c03
commit a37dd4ca7c
19 files changed
+904 -20

No files matched your search

+24
View File
@@ -139,6 +139,7 @@ namespace Decentralized
{
if (!Available(day)) return;
ForceKnown(d, day);
OpenTrial(d, day);
var made = d.Predict.Refill(day, d.Rng, Candidates(day));
foreach (var m in made) Log.Info($"预测盘口 #{m.Id}:{m.Kind} {m.Key} {m.Title} 阈值 {m.Param} 窗口 {m.FromDay}-{m.ToDay} 先验 {m.P0:0.000}");
}
@@ -172,6 +173,18 @@ namespace Decentralized
}
}
/// <summary>举报 Tumbler 后的审判盘:开盘日起强制开(不进候选池),宣判那天结算,先验 = 定罪概率。</summary>
public static void OpenTrial(SaveData d, int day)
{
var a = d.Story.After;
if (a.Verdict < 0 || a.TrialMarket || day < a.TrialOpenDay || day >= a.TrialDay) return;
a.TrialMarket = true;
var bk = d.Predict;
var m = PredictMarket.Create(++bk.Seq, PredictKind.Trial, "tumbler", "Tumbler", 0, day, a.TrialDay, a.TrialDay, Tuning.TumblerTrialConvict);
bk.Markets.Add(m);
Log.Info($"审判盘开盘 #{m.Id}:第 {a.TrialDay} 天宣判");
}
// ——— 公开信息下的合理概率(盘口夜里向它靠拢) ———
/// <summary>
@@ -203,6 +216,8 @@ namespace Decentralized
return PredictMath.CraWarnProb(d.Stable.Cushion, CraDrain(d), day + 1, m.FromDay, m.ToDay, CraHazard);
case PredictKind.Era:
return PredictMath.EraProb(day, m.FromDay, m.ToDay, d.Network.EraWarned ? d.Network.EraWarnDay : -1);
case PredictKind.Trial:
return d.Story.After.TrialPublic();
}
return null;
}
@@ -222,6 +237,7 @@ namespace Decentralized
case PredictKind.Gas: return CloseGas >= m.Param;
case PredictKind.Cra: return d.Stable.CraWarnDay >= m.FromDay && d.Stable.CraWarnDay <= m.ToDay;
case PredictKind.Era: return d.Network.EraDay < 0 ? (bool?)null : d.Network.EraDay >= m.FromDay && d.Network.EraDay <= m.ToDay;
case PredictKind.Trial: return d.Story.After.Verdict < 0 ? (bool?)null : d.Story.After.Verdict == 1;
}
return null;
}
@@ -234,6 +250,7 @@ namespace Decentralized
var d = Session.Data;
if (m.Kind == PredictKind.Faction) return QueuedStart(m, false) != null;
if (m.Kind == PredictKind.Era) return d.Network.EraDay > 0 ? d.Network.EraDay >= m.FromDay && d.Network.EraDay <= m.ToDay : (bool?)null;
if (m.Kind == PredictKind.Trial) return d.Story.After.Verdict < 0 ? (bool?)null : d.Story.After.Verdict == 1;
return null;
}
@@ -258,6 +275,7 @@ namespace Decentralized
case PredictKind.Gas: return L.T("predict.q.gas", win, Fmt.Num(m.Param));
case PredictKind.Cra: return L.T("predict.q.cra", win);
case PredictKind.Era: return L.T("predict.q.era", win);
case PredictKind.Trial: return L.T("predict.q.trial", win);
default: return L.T("predict.q.price", win, m.Title, Fmt.Num(m.Param));
}
}
@@ -312,6 +330,12 @@ namespace Decentralized
list.Add(L.T("predict.clue.subsidy", (d.Stable.Cushion / Stablecoins.Cushion0 * 100).ToString("0")));
list.Add(L.T("predict.clue.drain", Fmt.Num(CraDrain(d))));
break;
case PredictKind.Trial:
{
var a = d.Story.After;
if (a.Hints.Count > 0) list.Add(L.T("predict.clue.trial", a.Hints.Count(h => h), a.Hints.Count(h => !h)));
break;
}
case PredictKind.Era:
list.Add(d.Network.EraWarned ? L.T("predict.clue.era.warned", d.Network.EraWarnDay + Tuning.EraWarnMin, d.Network.EraWarnDay + Tuning.EraWarnMax) : L.T("predict.clue.era", Tuning.EraMin, Tuning.EraMax));
break;