Black market: useful goods only, player selling with price-dependent speed and taint

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-03 20:23:21 +08:00
1 parent 5b57f3eedc
commit 502366e7c4
10 files changed
+363 -21

No files matched your search

+10 -3
View File
@@ -59,6 +59,7 @@ namespace Decentralized.Domain
{
public string Kind; // ready / scam_refund / scam_loss / rug / intercept / reopen
public BmOrder Order;
public BmSale Sale;
public double Amount;
}
@@ -84,7 +85,7 @@ namespace Decentralized.Domain
public bool Closed(int day) => day <= ClosedUntil;
/// <summary>托管中和已提前放款但尚未交付的资金(信用点),平台跑路的概率随它增加。</summary>
public double Held => Orders.Where(o => o.State == OrderState.Pending).Sum(o => (double)o.Price);
public double Held => Orders.Where(o => o.State == OrderState.Pending).Sum(o => (double)o.Price) + HeldSales;
public static int OrderPrice(long baseValue, GoodKind k = GoodKind.Contraband) => (int)Math.Max(1, Math.Round(baseValue * (1 + Extra(k)) * (1 - Tuning.BmOrderDiscount)));
public static int EscrowFee(int price) => (int)Math.Ceiling(price * Tuning.BmEscrowFee);
@@ -151,18 +152,23 @@ namespace Decentralized.Domain
}
/// <summary>每晚推进订单:平台跑路、到期的订单(卖家跑路、被截获、死投被挖走)、转入可取状态。镇压期间到期顺延一天。</summary>
public List<BmEvent> Night(int day, bool crackdown, Wallet w, Rng rng, int secRep = 0)
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 (ClosedUntil == day) ev.Add(new BmEvent { Kind = "reopen" });
if (!Closed(day) && Orders.Any(o => o.State == OrderState.Pending) && rng.Chance(RugChance))
if (!Closed(day) && (Orders.Any(o => o.State == OrderState.Pending) || Sales.Any(x => x.State == SaleState.Listed || x.State == SaleState.Sold)) && rng.Chance(RugChance))
{
foreach (var o in Orders.Where(o => o.State == OrderState.Pending))
{
o.State = OrderState.Lost; o.Why = "rug";
ev.Add(new BmEvent { Kind = "rug", Order = o, Amount = o.Price });
}
foreach (var sl in Sales.Where(x => x.State == SaleState.Listed || x.State == SaleState.Sold))
{
ev.Add(new BmEvent { Kind = "sale_rug", Sale = sl, Amount = sl.State == SaleState.Sold ? sl.Proceeds : sl.ListPrice });
sl.State = SaleState.Lost; sl.Why = "rug";
}
ClosedUntil = day + Tuning.BmRugClosedDays;
Offers.Clear(); Catalog.Clear(); Sellers.Clear();
return ev;
@@ -186,6 +192,7 @@ namespace Decentralized.Domain
o.State = OrderState.Ready;
ev.Add(new BmEvent { Kind = "ready", Order = o });
}
if (price != null) SalesNight(day, crackdown, w, price, rng, ev);
// 卖家落网:近期成交过的卖家各有小概率被抓,他们留存的订单记录之后会连累买家
foreach (var name in Orders.Where(x => x.State == OrderState.Done && day - x.DueDay <= 14).Select(x => x.Seller).Distinct().ToList())
{