Trap grouping and caps after economy simulation
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
205c321840
commit
a76f04c75e
5 files changed
+23
-9
No files matched your search
@@ -63,6 +63,8 @@ namespace Decentralized.Domain
|
||||
public string Item;
|
||||
/// <summary>对应的订单(没收到货的订单不会被追查);0 表示不挂订单(出售记录、落网)。</summary>
|
||||
public int OrderId;
|
||||
/// <summary>同一次蜜罐 / 同一次落网的追查归为一组,累计记罪证有上限。</summary>
|
||||
public int Group;
|
||||
}
|
||||
|
||||
/// <summary>夜间发生的订单事件,供日志与新闻使用。</summary>
|
||||
@@ -84,6 +86,9 @@ namespace Decentralized.Domain
|
||||
public int ClosedUntil = -1;
|
||||
/// <summary>执法接管平台的最后一天(含);期间的交易之后会被追查。</summary>
|
||||
public int HoneypotUntil = -1;
|
||||
public int HoneypotStart = -1;
|
||||
/// <summary>每组追查已经记过的罪证。</summary>
|
||||
public Dictionary<int, double> Charged = new Dictionary<int, double>();
|
||||
public List<BmTrap> Traps = new List<BmTrap>();
|
||||
public int NextOrderId = 1;
|
||||
|
||||
@@ -232,7 +237,7 @@ namespace Decentralized.Domain
|
||||
l.Qty -= count;
|
||||
if (l.Qty <= 0) Catalog.Remove(l);
|
||||
Orders.Add(o);
|
||||
if (Honeypot(day)) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = credits, Why = "honeypot", Item = l.Item, OrderId = o.Id });
|
||||
if (Honeypot(day)) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = credits, Why = "honeypot", Item = l.Item, OrderId = o.Id, Group = HoneypotStart });
|
||||
return o;
|
||||
}
|
||||
|
||||
@@ -246,7 +251,7 @@ namespace Decentralized.Domain
|
||||
public List<BmEvent> Night(int day, bool crackdown, Wallet w, Rng rng, int secRep = 0, Func<string, double> price = null)
|
||||
{
|
||||
var ev = new List<BmEvent>();
|
||||
if (!Honeypot(day) && rng.Chance(HoneypotChance(secRep))) { HoneypotUntil = day + Tuning.BmHoneypotDays; if (!Forum.Contains("easy")) Forum.Add("easy"); }
|
||||
if (!Honeypot(day) && rng.Chance(HoneypotChance(secRep))) { HoneypotUntil = day + Tuning.BmHoneypotDays; HoneypotStart = day; if (!Forum.Contains("easy")) Forum.Add("easy"); }
|
||||
if (ClosedUntil == day) ev.Add(new BmEvent { Kind = "reopen" });
|
||||
if (!Closed(day) && (Orders.Any(o => o.State == OrderState.Pending) || Sales.Any(x => x.State == SaleState.Listed || x.State == SaleState.Sold)) && rng.Chance(RugChance))
|
||||
{
|
||||
@@ -289,14 +294,20 @@ namespace Decentralized.Domain
|
||||
{
|
||||
if (!rng.Chance(Tuning.BmSellerBust)) continue;
|
||||
foreach (var o in Orders.Where(x => x.State == OrderState.Done && x.Seller == name && day - x.DueDay <= 14))
|
||||
Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = o.Price, Why = "seller", Item = o.Item });
|
||||
Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = o.Price, Why = "seller", Item = o.Item, Group = -day });
|
||||
Forum.Add("busted:" + name);
|
||||
}
|
||||
foreach (var t in Traps.Where(x => day >= x.Day).ToList())
|
||||
// 同一晚到期的追查按来源(同一次蜜罐 / 落网)合成一次事件;记入货款的一部分,同一次累计有上限
|
||||
var due = Traps.Where(x => day >= x.Day).ToList();
|
||||
foreach (var g in due.GroupBy(x => new { x.Why, x.Group }))
|
||||
{
|
||||
Traps.Remove(t);
|
||||
ev.Add(new BmEvent { Kind = "trap", Amount = t.Amount, Order = new BmOrder { Item = t.Item, Seller = t.Why } });
|
||||
Charged.TryGetValue(g.Key.Group, out double done);
|
||||
double amount = Math.Min(g.Sum(x => x.Amount) * Tuning.BmTrapShare, Tuning.BmTrapWindowCap - done);
|
||||
if (amount < 1) continue;
|
||||
Charged[g.Key.Group] = done + amount;
|
||||
ev.Add(new BmEvent { Kind = "trap", Amount = amount, Order = new BmOrder { Item = g.First().Item, Seller = g.Key.Why } });
|
||||
}
|
||||
Traps.RemoveAll(x => day >= x.Day);
|
||||
Orders.RemoveAll(o => o.State != OrderState.Pending && o.State != OrderState.Ready && day - o.DueDay > 14);
|
||||
return ev;
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace Decentralized.Domain
|
||||
s.Taint = rng.Chance(Math.Min(1, TaintChance(s.Mult) + vb)) ? s.Proceeds * Math.Min(1, TaintRatio(s.Mult) + vb) : 0;
|
||||
s.PayDay = day + Tuning.BmSaleHold;
|
||||
Rating = Math.Min(100, Rating + 1);
|
||||
if (Honeypot(day)) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = s.Proceeds, Why = "honeypot", Item = s.Item });
|
||||
if (Honeypot(day)) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = s.Proceeds, Why = "honeypot", Item = s.Item, Group = HoneypotStart });
|
||||
ev.Add(new BmEvent { Kind = "sale_sold", Sale = s, Amount = s.Proceeds });
|
||||
}
|
||||
foreach (var s in Sales.Where(x => x.State == SaleState.Sold && day >= x.PayDay).ToList())
|
||||
@@ -118,7 +118,7 @@ namespace Decentralized.Domain
|
||||
var recent = Sales.Where(x => x.State == SaleState.Paid && day - x.PayDay <= 14).ToList();
|
||||
if (recent.Count > 0 && rng.Chance(Tuning.BmSellerBust))
|
||||
{
|
||||
foreach (var s in recent) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = s.Proceeds, Why = "seller", Item = s.Item });
|
||||
foreach (var s in recent) Traps.Add(new BmTrap { Day = day + Tuning.BmTrapDelay, Amount = s.Proceeds, Why = "seller", Item = s.Item, Group = -day });
|
||||
Forum.Add("busted_buyer");
|
||||
}
|
||||
Sales.RemoveAll(x => (x.State == SaleState.Paid || x.State == SaleState.Delisted || x.State == SaleState.Lost) && day - Math.Max(x.ListedDay, x.PayDay) > 14);
|
||||
|
||||
@@ -98,6 +98,8 @@ namespace Decentralized.Domain
|
||||
/// 订单被截获时变成受控交付的概率;每晚某个近期卖家落网的概率。</summary>
|
||||
public const double BmHoneypotBase = 0.01, BmHoneypotPerSecRep = 0.0004, BmHoneypotMax = 0.06, BmControlled = 0.35, BmSellerBust = 0.008;
|
||||
public const int BmHoneypotDays = 6, BmTrapDelay = 4;
|
||||
/// <summary>追查记罪证:记入的比例(货款 × 比例)、同一次蜜罐(或一次落网)累计最多记多少。</summary>
|
||||
public const double BmTrapShare = 0.4, BmTrapWindowCap = 400;
|
||||
/// <summary>货架上除违禁品外的两类货:高科技物品(需中档声望)和显卡的出现概率、加价(在现货溢价 / 订单价之外再加),显卡里夹假卡的比例、是全新卡(成色 100、封条完好、不会是假卡)的概率。</summary>
|
||||
public const double BmTechChance = 0.30, BmGpuChance = 0.30, BmTechMarkup = 0.5, BmGpuMarkup = 0.2, BmGpuFake = 0.20, BmGpuNew = 0.15;
|
||||
/// <summary>玩家上架出售:标价倍率范围(相对参考价)、上架费、成交抽成、成交后货款托管天数、假卡被买家看穿的概率;
|
||||
|
||||
Reference in new issue
Block a user