142 lines
6.0 KiB
C#
142 lines
6.0 KiB
C#
using System.Linq;
|
|||
|
|
using Decentralized.Domain;
|
||
|
|
|
||
|
|
namespace Decentralized
|
||
|
|
{
|
||
|
|
/// <summary>
|
||
|
|
/// Web3 黑市的货物进出:每周刷新现货与订单目录,夜间推进订单并写夜间日志,
|
||
|
|
/// 上门(快递员当顾客上门)和死投(去垃圾场取货)把到货交给玩家。
|
||
|
|
/// </summary>
|
||
|
|
public static class BlackDelivery
|
||
|
|
{
|
||
|
|
public static void Subscribe()
|
||
|
|
{
|
||
|
|
ModHook.OnGenerateCustomerNormal += OnGenerate;
|
||
|
|
ModHook.OnAfterhourArriveLate += OnArrive;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void Unsubscribe()
|
||
|
|
{
|
||
|
|
ModHook.OnGenerateCustomerNormal -= OnGenerate;
|
||
|
|
ModHook.OnAfterhourArriveLate -= OnArrive;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static long Value(string id)
|
||
|
|
{
|
||
|
|
var it = ModHelper.SpawnItem(id);
|
||
|
|
if (it == null) return 0;
|
||
|
|
long v = it.GetBaseValue();
|
||
|
|
it.Destroy();
|
||
|
|
return v;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static string ItemName(string id)
|
||
|
|
{
|
||
|
|
var it = ModHelper.SpawnItem(id);
|
||
|
|
if (it == null) return id;
|
||
|
|
string n = it.name;
|
||
|
|
it.Destroy();
|
||
|
|
return n;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>每周刷新:现货与订单目录一起。返回是否刷新了。</summary>
|
||
|
|
public static bool Restock(SaveData d, int day, bool force = false)
|
||
|
|
{
|
||
|
|
int rep = StoreReputation.GetBMReputation();
|
||
|
|
if (d.Black.Closed(day)) return false;
|
||
|
|
if (force) d.Black.RefreshedDay = -999;
|
||
|
|
if (!d.Black.Refresh(day, rep, d.Rng, Value)) return false;
|
||
|
|
d.Black.RefreshOrders(rep, d.Rng, Value);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
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))
|
||
|
|
{
|
||
|
|
string name = e.Order != null ? ItemName(e.Order.Item) : null;
|
||
|
|
Log.Info($"黑市订单事件:{e.Kind} {e.Order?.Item} {e.Order?.Seller} {e.Order?.Mode}/{e.Order?.Delivery} 金额 {e.Amount:0}");
|
||
|
|
switch (e.Kind)
|
||
|
|
{
|
||
|
|
case "ready": ps.AddNightLog(L.T("nightlog.bm.ready." + e.Order.Delivery, name), "99bb66"); break;
|
||
|
|
case "scam_refund": ps.AddNightLog(L.T("nightlog.bm.scam_refund", e.Order.Seller, name), "cc7755"); break;
|
||
|
|
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 "theft": ps.AddNightLog(L.T("nightlog.bm.theft", name, Fmt.Num(e.Amount)), "cc7755"); break;
|
||
|
|
case "rug": ps.AddNightLog(L.T("nightlog.bm.rug", name, Fmt.Num(e.Amount)), "cc7755"); break;
|
||
|
|
case "reopen": ps.AddNightLog(L.T("nightlog.bm.reopen"), "99bb66"); break;
|
||
|
|
}
|
||
|
|
if (e.Kind == "rug") Night_RugNews(day);
|
||
|
|
}
|
||
|
|
if (Unlock.BlackUnlocked && !crackdown) Restock(d, day);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void Night_RugNews(int day) => News.Show("pd_news_bmrug_" + day, L.T("news.bmrug.title"), L.T("news.bmrug.desc"), 4);
|
||
|
|
|
||
|
|
// ---- 上门:开门后有到货的当天,快递员排进顾客队伍 ----
|
||
|
|
private static int courierDay = -1;
|
||
|
|
|
||
|
|
private static void OnGenerate(StoreClientManager manager)
|
||
|
|
{
|
||
|
|
if (Session.Data == null || !Unlock.BlackUnlocked) return;
|
||
|
|
Log.Guard("黑市快递员", () =>
|
||
|
|
{
|
||
|
|
int day = StoreStation.GetDayCounter();
|
||
|
|
if (day == courierDay || !Session.Data.Black.ReadyFor(Delivery.Door).Any()) return;
|
||
|
|
courierDay = day;
|
||
|
|
manager.AddClient(CreateCourier());
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
public static StoreClient CreateCourier()
|
||
|
|
{
|
||
|
|
var rng = Session.Data.Rng;
|
||
|
|
var c = new StoreClient
|
||
|
|
{
|
||
|
|
identifier = "pd_bm_courier",
|
||
|
|
displayName = L.T("courier.name"),
|
||
|
|
spriteName = SpriteDict.GetRandomScavSpriteName(),
|
||
|
|
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(); }));
|
||
|
|
c.AddBasicDialog();
|
||
|
|
c.CompleteClientCreation();
|
||
|
|
return c;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void DeliverDoor()
|
||
|
|
{
|
||
|
|
var d = Session.Data;
|
||
|
|
foreach (var o in d.Black.ReadyFor(Delivery.Door).ToList())
|
||
|
|
{
|
||
|
|
Items.Give(ModHelper.SpawnItem(o.Item));
|
||
|
|
d.Black.Deliver(o);
|
||
|
|
Log.Info($"黑市快递:{o.Item} 已放进储藏区");
|
||
|
|
}
|
||
|
|
Session.Save();
|
||
|
|
}
|
||
|
|
|
||
|
|
// ---- 死投:晚上去垃圾场,货在那里 ----
|
||
|
|
private static void OnArrive(string locationId)
|
||
|
|
{
|
||
|
|
if (locationId != "dumping_ground" || Session.Data == null || !Unlock.BlackUnlocked) return;
|
||
|
|
Log.Guard("黑市死投", () =>
|
||
|
|
{
|
||
|
|
var d = Session.Data;
|
||
|
|
var list = d.Black.ReadyFor(Delivery.Drop).ToList();
|
||
|
|
foreach (var o in list)
|
||
|
|
{
|
||
|
|
var item = ModHelper.SpawnItem(o.Item);
|
||
|
|
GeneralHelper.SetItemOwned(item, true);
|
||
|
|
GraphUtils.EmporiumTryAdd(EmporiumEntry.Instance.afterhourInventory, item);
|
||
|
|
d.Black.Deliver(o);
|
||
|
|
Log.Info($"黑市死投:{o.Item} 已放进外出背包");
|
||
|
|
}
|
||
|
|
if (list.Count > 0) { Session.Save(); }
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|