第十一阶段 stage 2:场外换币台(暗灯招换币客户)

- 新人脉升级“场外换币台”(OtcUnlockPrice 500),附赠一盏暗灯
- 包装原版暗灯工厂:切换顺序末尾加目标 pd_otc(只接管进出这一步,其余交给原切换函数);顾客工厂写进公开的 StoreClientListDict.storeClientDict,顾客面板与概率走原版逻辑
- 换色:底图换成原版熄灭的暗灯,叠加层画黄绿色光晕(otc_lamp_on),不进存档
- 换币客户(OtcClient)一半卖币、一半买币:卖币并入原收黑币(Domain/Otc.cs 取代 HotCoins.cs,HotCoinSeller 删除),污点比例随机、越脏越便宜、地址来历写进账本;买币三档报价,PLEDGER 转账确认后现金到账,当晚未付作废
- 只在生成顾客的回调窗口里生成报价、写账本(原版取名字也会调用工厂)
- 存档数据版本 4:旧存档出块奖励、NPC 算力按 MiningScale 放大
- 8 种语言文字、手册“换币客户”一节;单元测试

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Opus 5.5 committed 2026-11-08 14:29:49 +08:00
1 parent bc23ae056b
commit ec578a39d9
25 files changed
+833 -321

No files matched your search

+20 -10
View File
@@ -249,16 +249,6 @@ namespace Decentralized.Domain
["HalvingPassMin"] = Tuning.HalvingPassMin,
["HalvingRamp"] = Tuning.HalvingRamp,
["HalvingRampDays"] = Tuning.HalvingRampDays,
["HotCutMax"] = Tuning.HotCutMax,
["HotCutMin"] = Tuning.HotCutMin,
["HotEventChance"] = Tuning.HotEventChance,
["HotPoneroChance"] = Tuning.HotPoneroChance,
["HotPoneroCutMax"] = Tuning.HotPoneroCutMax,
["HotPoneroCutMin"] = Tuning.HotPoneroCutMin,
["HotSting"] = Tuning.HotSting,
["HotStingCrackdown"] = Tuning.HotStingCrackdown,
["HotValueMaxRents"] = Tuning.HotValueMaxRents,
["HotValueMinRents"] = Tuning.HotValueMinRents,
["IntelBriefPrice"] = Tuning.IntelBriefPrice,
["IntelFake"] = Tuning.IntelFake,
["IntelRep"] = Tuning.IntelRep,
@@ -268,6 +258,7 @@ namespace Decentralized.Domain
["ManipFree"] = Tuning.ManipFree,
["ManipMax"] = Tuning.ManipMax,
["ManipSlope"] = Tuning.ManipSlope,
["MiningScale"] = Tuning.MiningScale,
["MixerCleanRate"] = Tuning.MixerCleanRate,
["MixerFee"] = Tuning.MixerFee,
["MixerMaxRounds"] = Tuning.MixerMaxRounds,
@@ -285,6 +276,23 @@ namespace Decentralized.Domain
["NpcHash0"] = Tuning.NpcHash0,
["NpcKjPerH"] = Tuning.NpcKjPerH,
["NpcTargetRatio"] = Tuning.NpcTargetRatio,
["OtcBuyMaxRents"] = Tuning.OtcBuyMaxRents,
["OtcBuyMinRents"] = Tuning.OtcBuyMinRents,
["OtcCutClean"] = Tuning.OtcCutClean,
["OtcCutDirty"] = Tuning.OtcCutDirty,
["OtcEventChance"] = Tuning.OtcEventChance,
["OtcHistoryMax"] = Tuning.OtcHistoryMax,
["OtcPoneroChance"] = Tuning.OtcPoneroChance,
["OtcPoneroCutMax"] = Tuning.OtcPoneroCutMax,
["OtcPoneroCutMin"] = Tuning.OtcPoneroCutMin,
["OtcSellShare"] = Tuning.OtcSellShare,
["OtcSting"] = Tuning.OtcSting,
["OtcStingCrackdown"] = Tuning.OtcStingCrackdown,
["OtcTaintMax"] = Tuning.OtcTaintMax,
["OtcTaintMin"] = Tuning.OtcTaintMin,
["OtcUnlockPrice"] = Tuning.OtcUnlockPrice,
["OtcValueMaxRents"] = Tuning.OtcValueMaxRents,
["OtcValueMinRents"] = Tuning.OtcValueMinRents,
["PerpAdlHaircut"] = Tuning.PerpAdlHaircut,
["PerpBanDays"] = Tuning.PerpBanDays,
["PerpDebtDays"] = Tuning.PerpDebtDays,
@@ -480,6 +488,8 @@ namespace Decentralized.Domain
["CraSpiralPath"] = Array.ConvertAll(Tuning.CraSpiralPath, v => (double)v),
["IntelTipAcc"] = Array.ConvertAll(Tuning.IntelTipAcc, v => (double)v),
["IntelTipPrice"] = Array.ConvertAll(Tuning.IntelTipPrice, v => (double)v),
["OtcAccept"] = Array.ConvertAll(Tuning.OtcAccept, v => (double)v),
["OtcPremium"] = Array.ConvertAll(Tuning.OtcPremium, v => (double)v),
["PonziRates"] = Array.ConvertAll(Tuning.PonziRates, v => (double)v),
["SparkSpiralPath"] = Array.ConvertAll(Tuning.SparkSpiralPath, v => (double)v),
["UsedHealthMax"] = Array.ConvertAll(Tuning.UsedHealthMax, v => (double)v),