Tumbler 扩展实测修正:没有出款可还原时单独一句日志;每次上门是同一个外观;测试按钮“剧情重来”

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-08 18:45:54 +08:00
1 parent a37dd4ca7c
commit e88fab3f1b
11 files changed
+24 -2

No files matched your search

+2
View File
@@ -127,6 +127,8 @@ namespace Decentralized.Domain
public const int Hide = 1, Report = 2, Sell = 3;
public int StartDay = -1, Stage, Choice, VisitedDay = -1;
public bool Done;
/// <summary>Tumbler 的外观(第一次上门时随机定下,之后每次都一样)。</summary>
public string Sprite;
/// <summary>第几次上门在哪一天(相对开始日)。</summary>
public static readonly int[] Offsets = { 0, 3, 5, 9 };
+8
View File
@@ -152,6 +152,14 @@ namespace Decentralized
TumblerStory.ForceVisit(m);
PlayerStore.Instance.TryCallNextClient();
}));
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Tumbler: restart story (test)", () =>
{
var st = Session.Data.Story;
Log.Info($"测试:Tumbler 剧情重来(原进度 {st.Tumbler.Stage},选择 {st.Tumbler.Choice},结束 {st.Tumbler.Done})");
st.Tumbler = new Tumbler(); st.After = new TumblerAfter();
st.Applied.RemoveAll(k => k.StartsWith("tumbler_"));
st.MixerClosed = st.MixerRebranded = st.MixerHoneypot = false; st.MixerFee = st.MixerVolume = st.MixerRug = 1;
});
ModHelper.AddDebugFunction(ModInfo.Id, ModInfo.Name, "Tumbler: leak tonight (test)", () =>
{
var a = Session.Data.Story.After; a.Leaked = false; a.LeakDay = StoreStation.GetDayCounter();
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,"Ich habe gehört, die Security hat deinen Laden durchsucht.
tumbler.v4.seized.2,Sie haben jetzt den Schlüssel. Die Aufzeichnungen aller Nutzer werden aufgedeckt.
tumbler.v4.seized.3,"Was auch immer du ihnen erzählt hast, ich will es gar nicht mehr wissen."
nightlog.tumbler.leak,"Die Security nutzte Tumblers Signaturschlüssel, um die Mixer-Aufzeichnungen zu rekonstruieren: Die bei Auszahlungen ({0}) reingewaschene Kontamination ({1}) wurde den Wallets wieder zugeschrieben."
nightlog.tumbler.leak.none,"Security hat Tumblers Signaturschlüssel verwendet, um die Mixer-Aufzeichnungen zu rekonstruieren. Du hast in letzter Zeit nichts aus dem Mixer abgehoben."
nightlog.tumbler.note,"Ein Zettel wurde unter der Tür durchgeschoben: ""Du schuldest mir was, und ich hole es mir zurück. —T"""
nightlog.tumbler.tip,Nachricht von Tumbler: Die Security geht morgen womöglich gegen die Mixer-Dienste vor.
news.tumbler.leak.title,Security rekonstruiert Mixer-Aufzeichnungen
1 # Probably Decentralized localization table: German (de)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,I heard Security searched your shop.
tumbler.v4.seized.2,They have the key now. Every user's records will be dug up.
tumbler.v4.seized.3,"Whatever you told them, I don't want to know anymore."
nightlog.tumbler.leak,"Security used Tumbler's signing key to rebuild the mixing records: the taint washed off {0} payouts, {1}, was added back to the wallets."
nightlog.tumbler.leak.none,Security used Tumbler's signing key to rebuild the mixing records. You have not withdrawn anything from the mixer recently.
nightlog.tumbler.note,"A note was slipped under the door: ""You owe me, and I'll take it back. —T"""
nightlog.tumbler.tip,Message from Tumbler: Security may go after the mixing services tomorrow.
news.tumbler.leak.title,Security rebuilds mixer records
1 # Probably Decentralized localization table: English (en)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,Me enteré de que Seguridad registró tu tienda.
tumbler.v4.seized.2,Ahora tienen la clave. Van a desenterrar los registros de todos los usuarios.
tumbler.v4.seized.3,"Lo que sea que les hayas dicho, ya no quiero saberlo."
nightlog.tumbler.leak,"Seguridad usó la clave de firma de Tumbler para reconstruir los registros del mezclador: la contaminación lavada en pagos ({0}), {1}, se devolvió a las billeteras."
nightlog.tumbler.leak.none,Seguridad usó la clave de firma de Tumbler para reconstruir los registros de mezcla. No has retirado nada del mezclador recientemente.
nightlog.tumbler.note,"Deslizaron una nota por debajo de la puerta: ""Me debes, y lo voy a recuperar. —T"""
nightlog.tumbler.tip,Mensaje de Tumbler: puede que Seguridad inspeccione los servicios de mezclador mañana.
news.tumbler.leak.title,Seguridad reconstruye registros del mezclador
1 # Probably Decentralized localization table: Spanish (es)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,J'ai appris que la Sécurité a fouillé ta boutique.
tumbler.v4.seized.2,Ils ont la clé désormais. Les registres de chaque utilisateur vont être déterrés.
tumbler.v4.seized.3,"Peu importe ce que tu leur as dit, je ne veux plus le savoir."
nightlog.tumbler.leak,"La Sécurité a utilisé la clé de signature de Tumbler pour reconstituer les registres du mixeur : la contamination blanchie lors de versements (total : {0}), soit {1}, a été réattribuée aux portefeuilles."
nightlog.tumbler.leak.none,La Sécurité a utilisé la clé de signature de Tumbler pour reconstituer les registres de mixage. Vous n'avez rien retiré du mixeur récemment.
nightlog.tumbler.note,"Un mot a été glissé sous la porte : ""Tu me dois ça, et je viendrai le reprendre. — T"""
nightlog.tumbler.tip,Message de Tumbler : la Sécurité pourrait cibler les services de mixage demain.
news.tumbler.leak.title,Sécurité : registres du mixeur reconstitués
1 # Probably Decentralized localization table: French (fr)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,警察が店を捜索したと聞いた。
tumbler.v4.seized.2,鍵は奴らの手に渡った。全ユーザーの記録が洗い出される。
tumbler.v4.seized.3,あんたが奴らに何を話したか、もう知りたくもない。
nightlog.tumbler.leak,警察はタンブラーの署名鍵を使ってミキサーの記録を復元した:{0} 件の出金で洗浄された汚染 {1} がウォレットに戻された。
nightlog.tumbler.leak.none,警察はタンブラーの署名鍵を使ってミキシング記録を復元した。最近ミキサーから何も出金していない。
nightlog.tumbler.note,ドアの隙間からメモが差し入れられていた:「借りは必ず取り戻す。—T」
nightlog.tumbler.tip,タンブラーからのメッセージ:明日、警察がミキサーサービスの取り締まりに動くかもしれない。
news.tumbler.leak.title,警察、ミキサー記録を復元
Can't render this file because it contains an unexpected character in line 487 and column 24.
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,"Słyszałem, że Ochrona przeszukała twój sklep."
tumbler.v4.seized.2,Mają teraz klucz. Wyciągną rejestry każdego użytkownika.
tumbler.v4.seized.3,"Cokolwiek im powiedziałeś, nie chcę już wiedzieć."
nightlog.tumbler.leak,Ochrona użyła klucza podpisu Tumblera do odtworzenia rejestrów miksera: skażenie usunięte z wypłat (liczba: {0}) w kwocie {1} powróciło do portfeli.
nightlog.tumbler.leak.none,Ochrona użyła klucza podpisu Tumblera do odtworzenia rejestrów miksowania. Ostatnio nie wypłacono niczego z miksera.
nightlog.tumbler.note,"Pod drzwi wsunięto liścik: ""Jesteś mi coś winien i odbiorę to. —T"""
nightlog.tumbler.tip,Wiadomość od Tumblera: Ochrona może jutro wziąć na cel usługi mikserów.
news.tumbler.leak.title,Ochrona odtwarza rejestry miksera
1 # Probably Decentralized localization table: Polish (pl)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -772,6 +772,7 @@ tumbler.v4.seized.1,"Слышал, Служба безопасности обы
tumbler.v4.seized.2,Ключ теперь у них. Они поднимут записи каждого пользователя.
tumbler.v4.seized.3,Что ты им сказал — знать больше не хочу.
nightlog.tumbler.leak,"Служба безопасности восстановила записи миксера по ключу подписи Тумблера: смытый след с выплат (кол-во: {0}, {1}) возвращён на кошельки."
nightlog.tumbler.leak.none,"Служба безопасности использовала ключ подписи Тумблера, чтобы восстановить записи микширования. В последнее время вы ничего не выводили из миксера."
nightlog.tumbler.note,"Под дверь подсунули записку: «Ты мне задолжал, и я своё заберу. — Т»"
nightlog.tumbler.tip,Сообщение от Тумблера: завтра Служба безопасности может взяться за миксеры.
news.tumbler.leak.title,Служба безопасности восстановила записи миксера
1 # Probably Decentralized localization table: Russian (ru)
772 tumbler.v4.seized.2
773 tumbler.v4.seized.3
774 nightlog.tumbler.leak
775 nightlog.tumbler.leak.none
776 nightlog.tumbler.note
777 nightlog.tumbler.tip
778 news.tumbler.leak.title
@@ -771,6 +771,7 @@ tumbler.v4.seized.1,我听说治安部搜了你的店。
tumbler.v4.seized.2,密钥在他们手里,所有用户的记录都会被翻出来。
tumbler.v4.seized.3,你跟他们说过什么,我不想知道了。
nightlog.tumbler.leak,治安部用 Tumbler 的签名密钥还原了混币记录:{0} 笔出款洗掉的污点 {1} 加回了钱包。
nightlog.tumbler.leak.none,治安部用 Tumbler 的签名密钥还原了混币记录。你最近没有从混币器提回过币。
nightlog.tumbler.note,门缝里塞进来一张纸条:“欠我的,我会拿回来。——T”
nightlog.tumbler.tip,Tumbler 发来消息:明天治安部可能要查混币服务。
news.tumbler.leak.title,治安部还原混币记录
1 # Probably Decentralized 本地化表:简体中文(zh)
771 tumbler.v4.seized.2
772 tumbler.v4.seized.3
773 nightlog.tumbler.leak
774 nightlog.tumbler.leak.none
775 nightlog.tumbler.note
776 nightlog.tumbler.tip
777 news.tumbler.leak.title
+6 -2
View File
@@ -67,7 +67,8 @@ namespace Decentralized
{
a.Leaked = true;
var r = d.Mixer.Leak(day, d.Own, Session.Price);
ps.AddNightLog(L.T("nightlog.tumbler.leak", r.Count, Fmt.Credits(r.Taint)) + TaintCrime.Commit(r.Over), "cc7755");
if (r.Count == 0) ps.AddNightLog(L.T("nightlog.tumbler.leak.none"));
else ps.AddNightLog(L.T("nightlog.tumbler.leak", r.Count, Fmt.Credits(r.Taint)) + TaintCrime.Commit(r.Over), "cc7755");
News.Show("pd_news_tumbler_leak", L.T("news.tumbler.leak.title"), L.T("news.tumbler.leak.desc"), 3, 8);
Log.Info($"Tumbler 密钥泄露:还原 {r.Count} 笔出款,污点 +{r.Taint:0},超出 {r.Over:0}");
}
@@ -161,9 +162,12 @@ namespace Decentralized
private static StoreClient New()
{
// 每次上门是同一个人:外观第一次上门时定下来
var t = Session.Data.Story.Tumbler;
if (string.IsNullOrEmpty(t.Sprite)) t.Sprite = SpriteDict.GetRandomShadySpriteName();
var c = new StoreClient
{
identifier = "pd_tumbler", displayName = L.T("tumbler.name"), spriteName = SpriteDict.GetRandomShadySpriteName(),
identifier = "pd_tumbler", displayName = L.T("tumbler.name"), spriteName = t.Sprite,
clientIntent = StoreClient.ClientIntent.DIALOGUE, nonShootable = true, dismissable = false,
};
ModHelper.SetClientSource(c, ModInfo.Id);