From 7d89ccfeaca9e97dcf0e9ac38495e2680df07c8b Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Wed, 4 Nov 2026 19:59:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=BF=E6=9E=B6=E5=8D=87=E7=BA=A7=EF=BC=9A?= =?UTF-8?q?=E7=BB=99=E5=8E=9F=E7=89=88=E7=94=B5=E5=AD=90=E5=85=83=E4=BB=B6?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E4=BD=9C=E7=94=A8=E4=BA=8E=E7=9F=BF=E6=9E=B6?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD=EF=BC=8C5=20=E6=A7=BD=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E8=B5=B0=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 1 + src/Decentralized/Items.cs | 52 ++++++++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f72d3a2..a2def60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - 多语言第二轮审校(Claude 子代理逐语言通读 UI 与 16 章手册,交叉复审 Gemini 的修订):采用 de 39、fr 56、es 34、pl 37、ru 45、ja 142 条(ja 里约一半是全角标点、×、〜 等机械统一)。要点:天数不再缩写、Tumbler 称谓与 Key-Drive 统一、手册页签名对齐界面、ASIC 时代统一、修正数处误译(俄语手册首章“卖出”写成用交易币付款、永续/挖矿章、日语质押章“向池子付款”等)。 - 真伪依据改版:检视面板最前面四行是风扇数、供电口、背面丝印、序列号,四项全部符合标称型号才是正品,任何一项不符即为假冒;其后是型号和四项成色。风扇数、供电口各自独立(假卡不再固定两项都对不上),假卡四项各自露出破绽,至少一项,平均约 1.5 项(`Tuning.FakeSignChance`)。去掉检视面板和指南里的“卖家的说法”,该机制只在后台生效。指南里不再用“档次”,改称型号;背面图上画出序列号。 - 矿架改版:图 5×4 格(原 3×3);去掉升级槽位,改成把电子元件拖到矿架上就投入升级(每次一件,和游戏里别的机器一致);原升级槽位那一栏换成只读的状态面板(显卡数、耗电、算力);不显示显卡磨损外观。 +- 修正:电子元件拖到矿架上原来会被元件自己的判断否决(游戏取三方判断的与),改为在原版电子元件(普通、稀有)上追加“作用于矿架”的判断,升级才真正可触发。升级流程用探查命令走通:普通 ×4 解锁第 3 槽,稀有 ×1 第 4 槽,稀有 ×2 第 5 槽,满级后不再收;5 张卡放满窗口显示 5/5。 - 检视面板的型号鉴定只留一个“指出型号”按钮(第一行,型号);风扇数、供电口、背面丝印、序列号四行只读,四项全部符合才是正品。 - 检视面板的型号行右侧显示“标签价”(当前报价,随指出和改标签实时变化),鉴定客户的估价框同步。 - 显卡鉴定指南的鉴定示例由 1 个增至 5 个(成色很差、假冒、轻微使用、全新),共 13 页。 diff --git a/src/Decentralized/Items.cs b/src/Decentralized/Items.cs index f682125..b88b436 100644 --- a/src/Decentralized/Items.cs +++ b/src/Decentralized/Items.cs @@ -46,6 +46,7 @@ namespace Decentralized { dir.Add(Terminal, CreateTerminal); dir.Add(Rig, CreateRig); + WrapElectronics(dir); dir.Add(Guide, CreateGuide); dir.Add(Web3Guide, CreateWeb3Guide); dir.Add(HwWallet, CreateHwWallet); @@ -475,6 +476,7 @@ namespace Decentralized var rig = ItemDirectory.CreateEmptyItem(Rig).SetContentWindow(window); rig.SetSpriteAndShapeFromMod(ModInfo.Id, "rig"); RigStatus.Add(rig, new[] { stCount, stPower, stHash }); + RigInv.Remove(rig); RigInv.Add(rig, Tuple.Create(cards, (GameInventory)modules)); rig.name = L.T("item.rig.name"); rig.unitValue = Tuning.RigPrice; MachineHelper.SetupBatterySlot(battery, rig); @@ -486,10 +488,6 @@ namespace Decentralized cards.mayInventoryAddItemFunc = (item, _) => GeneralHelper.IsItemOwned(item) && IsGpu(item) && !item.IsTag(DeadTag); cards.onSlotAddItemEndFunc = (_, _, _) => UpdateRig(rig, modules, cards); cards.onSlotRemoveItemEndFunc = (_, _, _) => UpdateRig(rig, modules, cards); - // 升级:把电子元件拖到矿架上就投入(和游戏里别的机器一样,用材料作用在机器上),攒够解锁一个显卡槽 - rig.mayItemTargetThisFunc = (Func)Delegate.Combine(rig.mayItemTargetThisFunc, (Func)((src, t) => CanUpgradeWith(t, src))); - rig.canItemTargetThisFunc = (Func)Delegate.Combine(rig.canItemTargetThisFunc, (Func)((src, t) => CanUpgradeWith(t, src))); - rig.onItemTargetThisFunc = (Action)Delegate.Combine(rig.onItemTargetThisFunc, (Action)((src, t) => Log.Guard("矿架升级槽位", () => TakeUpgrade(t, cards, modules, src)))); rig.onLoaded = _ => { ApplySlots(rig, cards); UpdateRig(rig, modules, cards); }; rig.onCycleEndEarlySlotItemFunc = (_, _, _) => Log.Guard("矿架扣电", () => NightDraw(rig, battery, modules, cards)); ModHelper.SetSource(rig, ModInfo.Id, ModInfo.Name); @@ -505,14 +503,58 @@ namespace Decentralized rig.contentWindow?.Validate(); } + /// + /// 电子元件作用在矿架上:游戏按“材料作用于目标”判断,元件自己的判断函数对矿架一律为否(三方判断取与), + /// 所以要在元件上加一个对矿架为真的判断。用原版目录里的工厂造元件,再补上这三个函数。 + /// + private static void WrapElectronics(ModItemDirectory dir) + { + try + { + var directories = (System.Collections.IDictionary)typeof(DirectoryMaster).GetField("singletonInstance", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static)?.GetValue(null); + var list = directories?[typeof(GameItem)] as System.Collections.IList; + if (list == null) { Log.Warn("[Rig] 找不到原版物品目录,电子元件不能升级矿架"); return; } + foreach (var id in new[] { "common_electronic", "rare_electronic" }) + { + Func vanilla = null; + foreach (var d in list) + { + if (d is ModItemDirectory) continue; + var fd = d.GetType().GetProperty("factoryDictionary")?.GetValue(d) as Dictionary>; + if (fd != null && fd.TryGetValue(id, out var f)) { vanilla = f; break; } + } + if (vanilla == null) { Log.Warn($"[Rig] 找不到原版 {id}"); continue; } + var make = vanilla; + dir.Set(id, () => + { + var it = make(); + Func can = (src, t) => t != null && t.identifier == Rig && CanUpgradeWith(t, src); + it.mayThisTargetItemFunc = (Func)Delegate.Combine(it.mayThisTargetItemFunc, can); + it.canThisTargetItemFunc = (Func)Delegate.Combine(it.canThisTargetItemFunc, can); + it.onThisTargetItemFunc = (Action)Delegate.Combine(it.onThisTargetItemFunc, (Action)((src, t) => + { + if (t != null && t.identifier == Rig && CanUpgradeWith(t, src)) Log.Guard("矿架升级槽位", () => TakeUpgrade(t, src)); + })); + return it; + }); + Log.Info($"[Rig] 已给 {id} 加上升级矿架的作用"); + } + } + catch (Exception ex) { Log.Error("[Rig] 包装电子元件失败:" + ex); } + } + + private static readonly System.Runtime.CompilerServices.ConditionalWeakTable> RigInv = new System.Runtime.CompilerServices.ConditionalWeakTable>(); + private static bool CanUpgradeWith(GameItem rig, GameItem src) { var need = RigSlots.Next(SlotsOf(rig)); return src != null && rig.identifier == Rig && need != null && src.identifier == need.Value.Item && GeneralHelper.IsItemOwned(src); } - private static void TakeUpgrade(GameItem rig, GameGridInventory cards, GameInventory modules, GameItem item) + private static void TakeUpgrade(GameItem rig, GameItem item) { + if (!RigInv.TryGetValue(rig, out var inv)) return; + var cards = inv.Item1; var modules = inv.Item2; int slots = SlotsOf(rig); int progress = rig.IsTag(ProgressTag) ? rig.GetTagReadonly(ProgressTag).GetInt() : 0; int before = slots;