矿架 5×4、拖电子元件升级、状态面板;型号鉴定统一为一个指出型号按钮

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:50:46 +08:00
1 parent f40436b7d2
commit ed7d2bd088
16 files changed
+109 -30

No files matched your search

+21 -13
View File
@@ -459,17 +459,22 @@ namespace Decentralized
private static GameItem CreateRig()
{
var battery = new GameSlotInventory();
var upgrade = new GameSlotInventory();
var modules = new GameGridInventory(MachineHelper.DEFAULT_MODULE_BAY_CONFIG, 7);
// 显卡每张 3×2 格:3 格宽的格子,每张卡 3×2 格,每个槽两行;未解锁的行不可放
var cards = new GameGridInventory(RigSlots.Shape(RigSlots.Base), RigSlots.CellWidth);
// 状态面板:显卡数、耗电、算力(只读)
var stCount = new MachineryText("", 6, TMPro.HorizontalAlignmentOptions.Left, false);
var stPower = new MachineryText("", 6, TMPro.HorizontalAlignmentOptions.Left, false);
var stHash = new MachineryText("", 6, TMPro.HorizontalAlignmentOptions.Left, false);
var status = new MachineryStack(true, 6).Add(stCount).Add(stPower).Add(stHash);
var window = MachineHelper.CreateMachineryWindow(true,
MachineHelper.PowerPanel(battery),
MachineHelper.Panel(L.T("rig.label.modules"), modules, "module"),
MachineHelper.Panel(L.T("rig.label.cards"), cards, "cards"),
MachineHelper.Panel(L.T("rig.label.upgrade"), upgrade, "upgrade"));
MachineHelper.Panel(L.T("rig.label.status"), status, "status", false));
var rig = ItemDirectory.CreateEmptyItem(Rig).SetContentWindow(window);
rig.SetSpriteAndShapeFromMod(ModInfo.Id, "rig");
RigStatus.Add(rig, new[] { stCount, stPower, stHash });
rig.name = L.T("item.rig.name");
rig.unitValue = Tuning.RigPrice;
MachineHelper.SetupBatterySlot(battery, rig);
@@ -481,13 +486,10 @@ 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);
// 升级槽:只收下一级需要的电子元件,放进去立刻投入(计入进度),攒够解锁一个显卡槽
upgrade.mayInventoryAddItemFunc = (item, _) =>
{
var need = RigSlots.Next(SlotsOf(rig));
return GeneralHelper.IsItemOwned(item) && need != null && item.identifier == need.Value.Item;
};
upgrade.onSlotAddItemEndFunc = (item, _, _) => Log.Guard("矿架升级槽位", () => TakeUpgrade(rig, upgrade, cards, modules, item));
// 升级:把电子元件拖到矿架上就投入(和游戏里别的机器一样,用材料作用在机器上),攒够解锁一个显卡槽
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);
@@ -503,18 +505,23 @@ namespace Decentralized
rig.contentWindow?.Validate();
}
private static void TakeUpgrade(GameItem rig, GameSlotInventory upgradeSlot, GameGridInventory cards, GameInventory modules, GameItem item)
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)
{
int slots = SlotsOf(rig);
int progress = rig.IsTag(ProgressTag) ? rig.GetTagReadonly(ProgressTag).GetInt() : 0;
int before = slots;
int took = RigSlots.Insert(ref slots, ref progress, item.identifier, item.unitCount);
int took = RigSlots.Insert(ref slots, ref progress, item.identifier, 1);
if (took <= 0) return;
rig.ModifyTag(SlotsTag, s => s.Enable().SetInt(slots));
rig.ModifyTag(ProgressTag, s => s.Enable().SetInt(progress));
// 消耗收下的件数;放不下的部分留在升级槽里(玩家取回)
if (took >= item.unitCount) { upgradeSlot.Expel(item); item.Destroy(); }
else item.GetSplitItem(took).Destroy();
if (item.unitCount <= 1) item.Destroy(); else item.GetSplitItem(1).Destroy();
if (slots != before)
{
ApplySlots(rig, cards);
@@ -550,6 +557,7 @@ namespace Decentralized
double hash = Cards(cards).Select(ToUnit).Sum(u => u.Hash(b));
int slots = SlotsOf(rig);
rig.shortDescription = L.T("item.rig.desc", slots, Fmt.Num(hash * 10), kj);
RigStatus.Show(rig, Cards(cards).Count, slots, kj, hash * 10);
var next = RigSlots.Next(slots);
if (next != null)
{