Stage 6.3: RatDigg ASIC miners, miner dealers on the black market, miner era event

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-04 00:58:14 +08:00
1 parent b249747855
commit 7d13ae2fe8
18 files changed
+395 -19

No files matched your search

+24 -1
View File
@@ -152,6 +152,10 @@ namespace Decentralized.Domain
public sealed class Network
{
public double NpcHash = Tuning.NpcHash0;
/// <summary>NPC 矿工每 H 的耗电(kJ):矿机时代到来后减半,他们能挖得更久,全网算力均衡点升高。</summary>
public double NpcKj = Tuning.NpcKjPerH;
public int EraDay = -1, EraWarnDay = -1;
public bool EraWarned, EraDone;
public double Reward = Tuning.BlockReward;
/// <summary>停电、动荡等事件对 NPC 算力的可用比例。</summary>
public double Availability = 1.0;
@@ -164,6 +168,25 @@ namespace Decentralized.Domain
return Reward * playerHash / total * (1 - Tuning.PoolFee);
}
public enum EraStep { None, Warn, Start }
/// <summary>
/// "矿机时代":第一次调用时在 EraMin–EraMax 天之间随机定一天(至少留出预兆的天数),提前 4–7 天预兆,到点 NPC 耗电效率翻倍,永久。
/// 返回今晚发生的一步(预兆 / 开始)。
/// </summary>
public EraStep EraNight(int day, Rng rng)
{
if (EraDone) return EraStep.None;
if (EraDay < 0)
{
EraDay = Math.Max(day + Tuning.EraWarnMax + 1, rng.Range(Tuning.EraMin, Tuning.EraMax));
EraWarnDay = EraDay - rng.Range(Tuning.EraWarnMin, Tuning.EraWarnMax);
}
if (day >= EraDay) { NpcKj *= Tuning.EraKjMult; EraDone = true; return EraStep.Start; }
if (!EraWarned && day >= EraWarnDay) { EraWarned = true; return EraStep.Warn; }
return EraStep.None;
}
/// <summary>
/// 夜间:第 HalvingDays 天的倍数时减半;NPC 矿工按"每 H 收益 / 电费"与目标比的偏离扩张或关机,每晚最多 ±5%。
/// </summary>
@@ -172,7 +195,7 @@ namespace Decentralized.Domain
if (day > 0 && day % Tuning.HalvingDays == 0) Reward /= 2;
double total = NpcHash * Availability + playerHash;
double perH = Reward * price / total;
double ratio = perH / (Tuning.NpcKjPerH * Tuning.ElecPrice);
double ratio = perH / (NpcKj * Tuning.ElecPrice);
double adj = Math.Max(-Tuning.NpcAdj, Math.Min(Tuning.NpcAdj, Tuning.NpcAdj * (ratio / Tuning.NpcTargetRatio - 1)));
NpcHash *= 1 + adj;
}