矿架升级:给原版电子元件加上作用于矿架的判断,5 槽流程走通

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ZHU MINCHAOandClaude Sonnet 5.5 committed 2026-11-04 19:59:55 +08:00
1 parent ed7d2bd088
commit 7d89ccfeac
2 files changed
+48 -5

No files matched your search

+1
View File
@@ -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 页。
+47 -5
View File
@@ -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<GameItem, GameItem, bool>)Delegate.Combine(rig.mayItemTargetThisFunc, (Func<GameItem, GameItem, bool>)((src, t) => CanUpgradeWith(t, src)));
rig.canItemTargetThisFunc = (Func<GameItem, GameItem, bool>)Delegate.Combine(rig.canItemTargetThisFunc, (Func<GameItem, GameItem, bool>)((src, t) => CanUpgradeWith(t, src)));
rig.onItemTargetThisFunc = (Action<GameItem, GameItem>)Delegate.Combine(rig.onItemTargetThisFunc, (Action<GameItem, GameItem>)((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();
}
/// <summary>
/// 电子元件作用在矿架上:游戏按“材料作用于目标”判断,元件自己的判断函数对矿架一律为否(三方判断取与),
/// 所以要在元件上加一个对矿架为真的判断。用原版目录里的工厂造元件,再补上这三个函数。
/// </summary>
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<GameItem> vanilla = null;
foreach (var d in list)
{
if (d is ModItemDirectory) continue;
var fd = d.GetType().GetProperty("factoryDictionary")?.GetValue(d) as Dictionary<string, Func<GameItem>>;
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<GameItem, GameItem, bool> can = (src, t) => t != null && t.identifier == Rig && CanUpgradeWith(t, src);
it.mayThisTargetItemFunc = (Func<GameItem, GameItem, bool>)Delegate.Combine(it.mayThisTargetItemFunc, can);
it.canThisTargetItemFunc = (Func<GameItem, GameItem, bool>)Delegate.Combine(it.canThisTargetItemFunc, can);
it.onThisTargetItemFunc = (Action<GameItem, GameItem>)Delegate.Combine(it.onThisTargetItemFunc, (Action<GameItem, GameItem>)((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<GameItem, Tuple<GameGridInventory, GameInventory>> RigInv = new System.Runtime.CompilerServices.ConditionalWeakTable<GameItem, Tuple<GameGridInventory, GameInventory>>();
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;