using System; using System.Collections.Generic; using System.Linq; namespace Decentralized.Domain { /// 二手显卡贩子的类型:老实人按真实价卖;中间商加价;骗子夹带假卡,按标称型号的价卖。 public enum DealerKind { Honest, Middleman, Scammer } /// 贩子带来的一张卡:型号、健康度、是不是假卡。怎么说由 决定,中间商另加 % 的价。 public sealed class UsedCard { public string Model; public string FakeOf; public double Health; public int MarkupPct; } public static class UsedDealers { public const double MiddlemanMarkup = 0.08; public const double FakeShareMiddleman = 0.10, FakeShareScammer = 0.45; /// 今天来的贩子的类型:骗子越往后越多。 public static DealerKind Kind(int day, Rng rng) { double scam = Math.Min(0.30, 0.10 + day * 0.004); double r = rng.NextDouble(); return r < scam ? DealerKind.Scammer : r < scam + 0.30 ? DealerKind.Middleman : DealerKind.Honest; } /// 能出现在二手市场上的型号:按天数放开,旗舰第 30 天起。 public static string[] Pool(int day) { var list = new List(Dealer.Basic); if (day >= Dealer.AdvancedFromDay) list.AddRange(Dealer.Advanced); if (day >= Dealer.FlagshipFromDay) list.AddRange(Dealer.Flagship); return list.ToArray(); } public static List Cards(DealerKind kind, int day, Rng rng) { var pool = Pool(day); int count = rng.Range(3, 5); var cards = new List(); for (int i = 0; i < count; i++) { double share = kind == DealerKind.Scammer ? FakeShareScammer : kind == DealerKind.Middleman ? FakeShareMiddleman : 0; var label = pool[rng.Range(0, pool.Length - 1)]; var card = new UsedCard { Model = label, Health = 25 + rng.NextDouble() * 60 }; var cheaper = Hardware.Specs.Values.Where(s => !s.Asic && s.Price * 2 <= Hardware.Specs[label].Price).Select(s => s.Model).ToArray(); if (cheaper.Length > 0 && rng.Chance(share)) card.FakeOf = cheaper[rng.Range(0, cheaper.Length - 1)]; card.MarkupPct = kind == DealerKind.Middleman ? (int)Math.Round(MiddlemanMarkup * 100) : 0; cards.Add(card); } return cards; } } }