Stage 4: honeypot, seller busts, controlled delivery; mining report moved into Web3 page

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:13:18 +08:00
1 parent e44a4439ed
commit 5b57f3eedc
9 files changed
+156 -16

No files matched your search

+37 -6
View File
@@ -1,3 +1,4 @@
using System;
using System.Linq;
using Decentralized.Domain;
@@ -61,10 +62,10 @@ namespace Decentralized
public static void Night(SaveData d, int day, bool crackdown)
{
var ps = PlayerStore.Instance;
foreach (var e in d.Black.Night(day, crackdown, d.Hot, d.Rng))
foreach (var e in d.Black.Night(day, crackdown, d.Hot, d.Rng, StoreReputation.GetSecReputation()))
{
string name = e.Order != null ? ItemName(e.Order.Item) : null;
Log.Info($"黑市订单事件:{e.Kind} {e.Order?.Item} {e.Order?.Seller} {e.Order?.Mode} 金额 {e.Amount:0}");
string name = e.Order != null && e.Kind != "trap" ? ItemName(e.Order.Item) : null;
Log.Info($"黑市订单事件:{e.Kind} {e.Order?.Item} {e.Order?.Seller} {e.Order?.Mode} 受控 {e.Order?.Controlled} 金额 {e.Amount:0}");
switch (e.Kind)
{
case "ready": ps.AddNightLog(L.T("nightlog.bm.ready", name), "99bb66"); break;
@@ -72,6 +73,13 @@ namespace Decentralized
case "scam_loss": ps.AddNightLog(L.T("nightlog.bm.scam_loss", e.Order.Seller, name, Fmt.Num(e.Amount)), "cc7755"); break;
case "intercept": ps.AddNightLog(L.T("nightlog.bm.intercept", name, Fmt.Num(e.Amount)), "cc7755"); break;
case "rug": ps.AddNightLog(L.T("nightlog.bm.rug", name, Fmt.Num(e.Amount)), "cc7755"); break;
case "trap":
{
int amount = (int)Math.Min(Tuning.CrimeEventCap, e.Amount);
ps.secData.CommitCrime(e.Order.Item != null && e.Order.Item.StartsWith("gpu:") ? "FENCING" : "CONTRABAND_TRAFFICKING", amount);
ps.AddNightLog(L.T("nightlog.bm.trap." + e.Order.Seller, ItemName(e.Order.Item), amount), "cc7755");
break;
}
case "reopen": ps.AddNightLog(L.T("nightlog.bm.reopen"), "99bb66"); break;
}
if (e.Kind == "rug") Night_RugNews(day);
@@ -107,8 +115,31 @@ namespace Decentralized
clientIntent = StoreClient.ClientIntent.SELL,
};
StoreClientFactionSetup.InitScav(c);
c.mainDialogue.SetText(c.displayName, L.T("courier.line1." + rng.Range(1, 2))).NextDialogue().SetText(c.displayName, L.T("courier.line2." + rng.Range(1, 2)))
.SetEndAction(() => Log.Guard("黑市快递交货", () => { DeliverDoor(); PlayerStore.Instance.DismissCurrentClient(); }));
var trap = Session.Data.Black.Ready.FirstOrDefault(o => o.Controlled);
Action finish = () => { PlayerStore.Instance.DismissCurrentClient(); };
if (trap == null)
{
c.mainDialogue.SetText(c.displayName, L.T("courier.line1." + rng.Range(1, 2))).NextDialogue().SetText(c.displayName, L.T("courier.line2." + rng.Range(1, 2)))
.SetEndAction(() => Log.Guard("黑市快递交货", () => { DeliverDoor(); finish(); }));
}
else
{
// 受控交付:快递员神色异常,签收就是当场记罪证并查封,拒签只损失货款
var sign = new Dialogue();
sign.SetText("PLAYER", L.T("courier.sign.say"));
sign.NextDialogue().SetText(c.displayName, L.T("courier.signed")).SetEndAction(() => Log.Guard("受控交付签收", () =>
{
int amount = (int)Math.Min(Tuning.CrimeEventCap, Session.Data.Black.Sign(trap, true));
PlayerStore.Instance.secData.CommitCrime(trap.Item.StartsWith("gpu:") ? "FENCING" : "CONTRABAND_TRAFFICKING", amount);
DeliverDoor(); finish();
}));
var refuse = new Dialogue();
refuse.SetText("PLAYER", L.T("courier.refuse.say"));
refuse.NextDialogue().SetText(c.displayName, L.T("courier.refused")).SetEndAction(() => Log.Guard("受控交付拒签", () => { Session.Data.Black.Sign(trap, false); DeliverDoor(); finish(); }));
c.mainDialogue.SetText(c.displayName, L.T("courier.odd1")).NextDialogue().SetText(c.displayName, L.T("courier.odd2"))
.AddChoice(DirectoryMaster.Item("yes"), L.T("courier.sign"), "", sign, null)
.AddChoice(DirectoryMaster.Item("cancel"), L.T("courier.refuse"), "", refuse, null);
}
c.AddBasicDialog();
c.CompleteClientCreation();
return c;
@@ -117,7 +148,7 @@ namespace Decentralized
private static void DeliverDoor()
{
var d = Session.Data;
foreach (var o in d.Black.Ready.ToList())
foreach (var o in d.Black.Ready.Where(x => !x.Controlled).ToList())
{
Items.Give(Make(o.Item, o.Model, o.FakeOf, o.Health));
d.Black.Deliver(o);
+7
View File
@@ -65,6 +65,13 @@ namespace Decentralized
PlayerStore.Instance.storeClientManager.clientStack.Insert(0, BlackDelivery.CreateCourier());
PlayerStore.Instance.TryCallNextClient();
}));
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Courier trap (test)", () => Log.Guard("受控交付(测试)", () =>
{
foreach (var o in Session.Data.Black.Orders.Where(x => x.State == OrderState.Pending)) { o.State = OrderState.Ready; o.Controlled = true; }
PlayerStore.Instance.currentClientInstance = null;
PlayerStore.Instance.storeClientManager.clientStack.Insert(0, BlackDelivery.CreateCourier());
PlayerStore.Instance.TryCallNextClient();
}));
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Coin buyer (test)", () => Log.Guard("用币付款顾客(测试)", () =>
{
var c = new StoreClient
+16 -1
View File
@@ -270,4 +270,19 @@ black.kind.Contraband.3,Contraband (high)
black.kind.Tech,High-tech (markup)
nightlog.bm.ready,"Black market: {0} arrived; a courier will come by once you open."
item.web3guide.name,Web3 Handbook
item.web3guide.desc,"Bank: depositing turns credits into CRC; withdrawing turns CRC back into credits and goes through compliance screening. Trading: buys are paid in the quote coin, sells in the traded coin. Mixer: pick a coin, amount and rounds; each round takes a fee and lowers taint, rounds equal days of waiting, and the coins come back to the same address; the more you deposit, the worse the cleaning. Black market: coin only, no CRC, 30% above normal channels, with extra markup on high-tech goods and GPUs; the coin you pay leaves its share of taint with the seller and the goods carry no stolen tag; GPUs may be fake, inspect them yourself. Orders are cheaper than spot but take days and may be intercepted; escrow costs 5%, is released on delivery and refunded if the seller runs; advance release takes another 10% off, but a scammer keeps the money and only sellers with 30+ trades accept; the platform itself can rug. Ponero desk: Ponero is a privacy coin and swapping in wipes the taint on that value; 8% fee each way with a daily limit; coin swapped out of Ponero has no origin and cash-out screening gets stricter."
item.web3guide.desc,"Bank: depositing turns credits into CRC; withdrawing turns CRC back into credits and goes through compliance screening. Trading: buys are paid in the quote coin, sells in the traded coin. Mixer: pick a coin, amount and rounds; each round takes a fee and lowers taint, rounds equal days of waiting, and the coins come back to the same address; the more you deposit, the worse the cleaning. Black market: coin only, no CRC, 30% above normal channels, with extra markup on high-tech goods and GPUs; the coin you pay leaves its share of taint with the seller and the goods carry no stolen tag; GPUs may be fake, inspect them yourself. Orders are cheaper than spot but take days and may be intercepted; escrow costs 5%, is released on delivery and refunded if the seller runs; advance release takes another 10% off, but a scammer keeps the money and only sellers with 30+ trades accept; the platform itself can rug, be taken over by enforcement, or a seller can be arrested, after which your orders get traced and crime logged; forum rumors can be warnings. An intercepted parcel sometimes turns into enforcement at your door: signing logs the crime on the spot and seizes the goods, refusing only costs the payment. Ponero desk: Ponero is a privacy coin and swapping in wipes the taint on that value; 8% fee each way with a daily limit; coin swapped out of Ponero has no origin and cash-out screening gets stricter."
courier.odd1,...Package is here.
courier.odd2,"(His hand stays in his pocket.) Sign here."
courier.sign,Sign
courier.refuse,Refuse
courier.signed,"Good. Don't move, Security."
courier.refused,"...Fine, forget it."
black.state.Lost.seized,seized
black.state.Lost.refused,refused
black.forum.easy,"Too smooth lately: sellers ship faster than ever, and there are new accounts nobody has seen."
black.forum.busted,"Word is {0} got arrested, and the order records are still around."
nightlog.bm.trap.honeypot,"Black market: the platform was taken over by enforcement; your {0} was traced, crime logged {1}."
nightlog.bm.trap.seller,"Black market: a seller was arrested and the order records implicate you: {0}, crime logged {1}."
web3.sub.mining,Mining
courier.sign.say,I'll sign.
courier.refuse.say,Not taking it. Send it back.
1 # Probably Decentralized localization table: English (en)
270 black.kind.Tech
271 nightlog.bm.ready
272 item.web3guide.name
273 item.web3guide.desc
274 courier.odd1
275 courier.odd2
276 courier.sign
277 courier.refuse
278 courier.signed
279 courier.refused
280 black.state.Lost.seized
281 black.state.Lost.refused
282 black.forum.easy
283 black.forum.busted
284 nightlog.bm.trap.honeypot
285 nightlog.bm.trap.seller
286 web3.sub.mining
287 courier.sign.say
288 courier.refuse.say
+16 -1
View File
@@ -269,4 +269,19 @@ black.kind.Contraband.3,违禁品(高)
black.kind.Tech,高科技物品(加价)
nightlog.bm.ready,"黑市:{0} 到货,开店后会有快递员上门。"
item.web3guide.name,Web3 手册
item.web3guide.desc,"银行:存入把信用点换成 CRC;提取把 CRC 换回信用点,提取要过合规审查。交易:买入按计价币的数量支付,卖出按所交易币的数量卖出。混币器:选币种、填数量和轮数,每轮扣手续费并降低污点,轮数即等待天数,到期提回同一个地址;存入越多,清洗越差。黑市:只收币,不收 CRC,价格比正常渠道贵 30%,高科技物品和显卡另有加价;付出去的币带着按比例的污点留在卖家那边,货不带赃物标签;显卡不保证真假,自己鉴定。订单比现货便宜,要等几天,路上可能被截获;托管多付 5% 托管费,收货后放款,卖家跑路时退款;提前放款再打九折,卖家若是骗子钱就没了,只有成交 30 单以上的卖家接受;平台自己也可能跑路。Ponero 兑换处:Ponero 是隐私币,兑入时这部分价值的污点被清除;兑入、兑出各收 8% 手续费,每天有额度;从 Ponero 兑出的币来路不明,出金审查会加重。"
item.web3guide.desc,"银行:存入把信用点换成 CRC;提取把 CRC 换回信用点,提取要过合规审查。交易:买入按计价币的数量支付,卖出按所交易币的数量卖出。混币器:选币种、填数量和轮数,每轮扣手续费并降低污点,轮数即等待天数,到期提回同一个地址;存入越多,清洗越差。黑市:只收币,不收 CRC,价格比正常渠道贵 30%,高科技物品和显卡另有加价;付出去的币带着按比例的污点留在卖家那边,货不带赃物标签;显卡不保证真假,自己鉴定。订单比现货便宜,要等几天,路上可能被截获;托管多付 5% 托管费,收货后放款,卖家跑路时退款;提前放款再打九折,卖家若是骗子钱就没了,只有成交 30 单以上的卖家接受;平台自己也可能跑路,也可能被执法接管,或者卖家落网,之后你的订单会被追查、记罪证;论坛上的传闻可以当预兆。被截获的包裹有时会变成执法人员上门:签收当场记罪证并查封,拒签只损失货款。Ponero 兑换处:Ponero 是隐私币,兑入时这部分价值的污点被清除;兑入、兑出各收 8% 手续费,每天有额度;从 Ponero 兑出的币来路不明,出金审查会加重。"
courier.odd1,……东西到了。
courier.odd2,"(他的手一直放在口袋里)在这儿签个字。"
courier.sign,签收
courier.refuse,拒签
courier.signed,"好。别动,治安部的。"
courier.refused,"……那就算了。"
black.state.Lost.seized,被查封
black.state.Lost.refused,拒签
black.forum.easy,"最近太顺了,卖家发货比平时都快,还多了几个没见过的新号。"
black.forum.busted,"有人说 {0} 被抓了,他的订单记录还在。"
nightlog.bm.trap.honeypot,"黑市:平台曾被执法接管,你买的 {0} 被追查,记罪证 {1}。"
nightlog.bm.trap.seller,"黑市:卖家落网,他留存的订单记录连累了你:{0},记罪证 {1}。"
web3.sub.mining,挖矿
courier.sign.say,签收。
courier.refuse.say,不收,退回去。
1 # Probably Decentralized 本地化表:简体中文(zh)
269 black.kind.Tech
270 nightlog.bm.ready
271 item.web3guide.name
272 item.web3guide.desc
273 courier.odd1
274 courier.odd2
275 courier.sign
276 courier.refuse
277 courier.signed
278 courier.refused
279 black.state.Lost.seized
280 black.state.Lost.refused
281 black.forum.easy
282 black.forum.busted
283 nightlog.bm.trap.honeypot
284 nightlog.bm.trap.seller
285 web3.sub.mining
286 courier.sign.say
287 courier.refuse.say
+5 -5
View File
@@ -13,7 +13,7 @@ namespace Decentralized
public static class TerminalWindow
{
public const string Id = "pd_terminal";
private enum Page { Home, Bank, Poinbase, Web3, Report }
private enum Page { Home, Bank, Poinbase, Web3 }
private static Page _page = Page.Home;
private static string _amount = "";
@@ -41,7 +41,7 @@ namespace Decentralized
case Page.Bank: BankPage(b); break;
case Page.Poinbase: ExchangePage(b, Venue.Exchange); break;
case Page.Web3: Web3Page(b); break;
default: ReportPage(b); break;
default: break;
}
b.End();
if (!string.IsNullOrEmpty(_message)) b.AddLabel(_message);
@@ -235,7 +235,6 @@ namespace Decentralized
private static void Web3Page(CustomUIBuilder b)
{
var w = Session.Data.Hot;
if (Unlock.MixerUnlocked || Unlock.BlackUnlocked)
{
if (_web3Tab == Web3Tab.Mixer && !Unlock.MixerUnlocked) _web3Tab = Web3Tab.Trade;
if (_web3Tab == Web3Tab.Black && !Unlock.BlackUnlocked) _web3Tab = Web3Tab.Trade;
@@ -248,6 +247,7 @@ namespace Decentralized
b.AddButton(tab == _web3Tab ? $"[{name}]" : name, () => { _web3Tab = tab; _message = null; Open(); });
}
b.End();
if (_web3Tab == Web3Tab.Mining) { ReportPage(b); return; }
if (_web3Tab == Web3Tab.Mixer) { MixerPage(b); return; }
if (_web3Tab == Web3Tab.Black) { BlackPage(b); return; }
}
@@ -426,7 +426,7 @@ namespace Decentralized
r.AddHeader(L.T("black.forum.h"));
if (d.Black.Forum.Count == 0) r.AddLabel(L.T("black.forum.quiet"));
foreach (var f in d.Black.Forum)
r.AddLabel(f.StartsWith("scam:") ? L.T("black.forum.scam", f.Substring(5)) : L.T("black.forum." + f));
r.AddLabel(f.StartsWith("scam:") ? L.T("black.forum.scam", f.Substring(5)) : f.StartsWith("busted:") ? L.T("black.forum.busted", f.Substring(7)) : L.T("black.forum." + f));
});
}
@@ -474,7 +474,7 @@ namespace Decentralized
Open();
}
private enum Web3Tab { Trade, Mixer, Black }
private enum Web3Tab { Trade, Mining, Mixer, Black }
private static Web3Tab _web3Tab = Web3Tab.Trade;
private static string _mixAsset = Assets.PSC;
private static int _mixRounds = 2;