矿架 5×4、拖电子元件升级、状态面板;型号鉴定统一为一个指出型号按钮
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f40436b7d2
commit
ed7d2bd088
16 files changed
+109
-30
No files matched your search
+21
-13
@@ -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)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user