From ed7d2bd0887ea97b29708a6c012c255afb07bcfc Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Wed, 4 Nov 2026 19:50:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=BF=E6=9E=B6=205=C3=974=E3=80=81=E6=8B=96?= =?UTF-8?q?=E7=94=B5=E5=AD=90=E5=85=83=E4=BB=B6=E5=8D=87=E7=BA=A7=E3=80=81?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E9=9D=A2=E6=9D=BF=EF=BC=9B=E5=9E=8B=E5=8F=B7?= =?UTF-8?q?=E9=89=B4=E5=AE=9A=E7=BB=9F=E4=B8=80=E4=B8=BA=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=8C=87=E5=87=BA=E5=9E=8B=E5=8F=B7=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 2 ++ art/__pycache__/sprites.cpython-314.pyc | Bin 68072 -> 68094 bytes art/sprites.py | 16 ++++----- src/Decentralized.Domain/CardLabels.cs | 6 ++-- src/Decentralized/GpuInspectView.cs | 9 ++--- src/Decentralized/Items.cs | 34 +++++++++++------- .../ModFiles/Localization/de.csv | 6 ++++ .../ModFiles/Localization/en.csv | 8 ++++- .../ModFiles/Localization/es.csv | 6 ++++ .../ModFiles/Localization/fr.csv | 6 ++++ .../ModFiles/Localization/ja.csv | 6 ++++ .../ModFiles/Localization/pl.csv | 6 ++++ .../ModFiles/Localization/ru.csv | 6 ++++ .../ModFiles/Localization/zh.csv | 8 ++++- .../ModFiles/Textures/Items/rig.png | Bin 305 -> 369 bytes src/Decentralized/RigStatus.cs | 20 +++++++++++ 16 files changed, 109 insertions(+), 30 deletions(-) create mode 100644 src/Decentralized/RigStatus.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 15024f4..f72d3a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ - 多语言第二轮审校(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);去掉升级槽位,改成把电子元件拖到矿架上就投入升级(每次一件,和游戏里别的机器一致);原升级槽位那一栏换成只读的状态面板(显卡数、耗电、算力);不显示显卡磨损外观。 +- 检视面板的型号鉴定只留一个“指出型号”按钮(第一行,型号);风扇数、供电口、背面丝印、序列号四行只读,四项全部符合才是正品。 - 检视面板的型号行右侧显示“标签价”(当前报价,随指出和改标签实时变化),鉴定客户的估价框同步。 - 显卡鉴定指南的鉴定示例由 1 个增至 5 个(成色很差、假冒、轻微使用、全新),共 13 页。 - 二手贩子的卡按卖家调整健康度:老实人 72–97、中间商 55–85、骗子 42–72,平均每张卡成色有问题的项(叶片、金手指、挡板、封条,共 4 项)约 0.5 / 1.5 / 2.5(原来三者都是 25–85,约 2.4)。范围进 `Tuning.UsedHealthMin/Max`。 diff --git a/art/__pycache__/sprites.cpython-314.pyc b/art/__pycache__/sprites.cpython-314.pyc index 0a04a91501f5f72ac8ba06d5339704343c5c9f8e..b4bb1ae2ae93967ea568c345f078221110193b0c 100644 GIT binary patch delta 511 zcmaDcndRSP7G7;WUM>b8@Rfd@CBBijywZe&kAWePH<2$ zGEQ#jxy(3sb4c%TCY}vWJA}5nUy!o7CSW^Ral$G_yUk}NXfVl`>qpzMUDM_Qk!IpR z^16T=h&1Mjw%aT)`B%Ddkv7mrn#?cbfrh@!0Ga$~vg~hN#+Q@5f17i>0817-3KadC%=Sl-@z-RHKQfG8CcFMo z^ZE@IhUj?;Vlx4i7u^O6ynF_-{t?I!7KkAXAQh4zLKdu|2xME)HxTh=^433!au9Vd zZ9p3BL4*g80D2?}WXPAvU;b#Y$$%`7ovid%jZtp0=ih4KXCUogA?AS``%;Ht^Yy=i FJOGZoi(3Ey delta 472 zcmXYs&r1S96vtMl&na_1j)3Fb~7*a2Slf?m9h{N9SWv{ND|&6FfiW1ONY)u zhnP!;ZXP1K1VIterNG)kI`xZHX`b6Vd}rqSzV9m?&{qu8ex5F-ZIUYU zozif(qGf7TE%R|+R%=z2pX{pCZ%_V15EUhH$`lF*he7V$+mc;LVX`}vdjgg64XyH( z{R_!{J*eJ#G?=a&(<%N`8Igji)MDCx8+D?N2ZY`^LZ}IsP}nH+@fmnt^%?U57MG2j zSd29UKZ9zH(Kpb|X@?=c7nfNbj?BrPcX2T0F!BSBW+Y@<%{JPjXjAcWk^U71GhwJ1 zp(e~Whv+9PHe++mj&0456_b`lJ4W8WwZxDx0tXmrrd g)`&fbq!46UF&c(kYuopNxi4!FU&RuXH(FlTAEL^KZU6uP diff --git a/art/sprites.py b/art/sprites.py index 3d25d7e..30e3f55 100644 --- a/art/sprites.py +++ b/art/sprites.py @@ -387,12 +387,12 @@ MODELS = ['RTX 60', 'RTX 70', 'RTX 80', 'RTX 90', 'RX 70', 'RX 80', 'RX 800', 'R def rig(): - """矿架(48×48,3×3 格):和游戏里其他机器一样的略微俯视(3/4 视角)——顶面是上窄下宽的梯形, + """矿架(80×64,5×4 格):和游戏里其他机器一样的略微俯视(3/4 视角)——顶面是上窄下宽的梯形, 下面是正面,正面里四层显卡位,左下角电源;光从左上来,左亮右暗;轮廓统一深紫、削掉尖角、底下两只脚和一圈阴影。""" - c = Canvas(48, 48) - FL, FR, FY, DEP = 3, 44, 24, 19 # 正面左右边、顶面前沿所在行、顶面深度(顶面后沿在 y=6,中心行 y=8 落在顶面上) - BOT = 44 # 正面底边 - inset = lambda v: v // 6 # 顶面后部只略微收窄:原版机器的顶面也近似矩形,并且要让左右两格的中心落在顶面内 + c = Canvas(80, 64) + FL, FR, FY, DEP = 3, 76, 36, 31 # 正面左右边、顶面前沿所在行、顶面深度(顶面后沿在 y=6,中心行 y=8 落在顶面上) + BOT = 60 # 正面底边 + inset = lambda v: v // 8 # 顶面后部只略微收窄:原版机器的顶面也近似矩形,并且要让左右两格的中心落在顶面内 # 顶面:后部受光、前部稍暗;左缘亮、右缘暗 for v in range(DEP): @@ -405,8 +405,8 @@ def rig(): for x in range(FL + inset(DEP - 1), FR - inset(DEP - 1) + 1): c.put(x, FY - DEP + 1, 'l') # 顶面上的散热格栅和一个小指示灯 - for v in range(4, 16, 3): - for u in range(6, 24): + for v in range(4, 26, 3): + for u in range(6, 50): c.put(FL + inset(v) + u, FY - v, 'g') c.put(FR - 9, FY - 8, 'G'); c.put(FR - 8, FY - 8, 'G') # 正面:中间色,左端受光、右端暗;顶部一条暗折线 @@ -426,7 +426,7 @@ def rig(): c.put(x, BOT - 1, 'd') # 正面里的四层显卡位(深色槽,上沿亮、下沿暗,右端一颗状态灯) # 正面四层显卡位(深色槽,右端一颗状态灯);间隔行用中间色,保证每格中心都不透明 - for i, y in enumerate((FY + 3, FY + 8, FY + 13)): + for i, y in enumerate((FY + 3, FY + 8, FY + 13, FY + 18)): for x in range(FL + 3, FR - 4): for dy in range(3): c.put(x, y + dy, 'k') diff --git a/src/Decentralized.Domain/CardLabels.cs b/src/Decentralized.Domain/CardLabels.cs index c349154..11218a1 100644 --- a/src/Decentralized.Domain/CardLabels.cs +++ b/src/Decentralized.Domain/CardLabels.cs @@ -57,9 +57,9 @@ namespace Decentralized.Domain { public const int RowSpec = 1, RowCount = 2, RowFan = 4, RowFingers = 8, RowBracket = 16, RowPrint = 32, RowSerial = 64, RowSeal = 128, RowPin = 256, AllRows = 511; /// 标签栏的顺序:风扇数、供电口、背面丝印、序列号(真伪依据),型号,叶片、金手指、挡板、封条(成色)。 - public static readonly int[] Rows = { RowCount, RowPin, RowPrint, RowSerial, RowSpec, RowFan, RowFingers, RowBracket, RowSeal }; - /// 前四行是真伪依据(风扇数、供电口、背面丝印、序列号),四项全部符合标称型号才是正品;第五行是型号,之后四行是成色。 - public const int AuthRows = 4; + public static readonly int[] Rows = { RowSpec, RowCount, RowPin, RowPrint, RowSerial, RowFan, RowFingers, RowBracket, RowSeal }; + /// 第一行是型号(唯一的“指出型号”按钮),接着四行是真伪依据(风扇数、供电口、背面丝印、序列号,只读,四项全部符合标称型号才是正品),之后四行是成色。 + public const int AuthRows = 5; public static bool IsAuth(int row) => row == RowCount || row == RowPin || row == RowPrint || row == RowSerial; /// 各标签各取值对价格的影响(百分比,相加):风扇叶片积灰 −4%、缺角 −12%;金手指发暗 −4%、氧化 −12%;挡板划痕 −2%;封条缺失 −6%。 diff --git a/src/Decentralized/GpuInspectView.cs b/src/Decentralized/GpuInspectView.cs index 9fcd58a..0d4b88a 100644 --- a/src/Decentralized/GpuInspectView.cs +++ b/src/Decentralized/GpuInspectView.cs @@ -238,15 +238,16 @@ namespace Decentralized { text = Show(real); bool lied = row == CardLabels.RowSpec ? claim.Value.Model != real.Model : claim.Value.Get(row) != real.Get(row); - if (lied) { color = new Color(1f, 0.45f, 0.4f); text += L.T("lbl.said", Show(claim.Value)); } + if (lied) { color = new Color(1f, 0.45f, 0.4f); if (!CardLabels.IsAuth(row)) text += L.T("lbl.said", Show(claim.Value)); } else color = new Color(0.5f, 1f, 0.55f); } else text = Show(claim.Value); rowText[i].text = text; rowText[i].color = color; - bool editable = row != CardLabels.RowCount && row != CardLabels.RowPin; - rowButton[i].gameObject.SetActive(canEdit ? editable : canPoint && (exposed & row) == 0); - rowButtonText[i].text = L.T(canEdit ? "lbl.edit" : "lbl.point"); + bool editable = row == CardLabels.RowSpec || !CardLabels.IsAuth(row); + bool hasButton = row == CardLabels.RowSpec || !CardLabels.IsAuth(row); + rowButton[i].gameObject.SetActive(hasButton && (canEdit ? editable : canPoint && (exposed & row) == 0)); + rowButtonText[i].text = L.T(canEdit ? "lbl.edit" : row == CardLabels.RowSpec ? "lbl.point.model" : "lbl.point"); } if (priceText != null) priceText.text = L.T("lbl.price", item.unitValue); if (flipText != null) flipText.text = L.T(Items.IsBack(item) ? "inspect.flip.front" : "inspect.flip.back"); diff --git a/src/Decentralized/Items.cs b/src/Decentralized/Items.cs index 4d7fa2e..f682125 100644 --- a/src/Decentralized/Items.cs +++ b/src/Decentralized/Items.cs @@ -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)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); @@ -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) { diff --git a/src/Decentralized/ModFiles/Localization/de.csv b/src/Decentralized/ModFiles/Localization/de.csv index 652fd2d..78e7014 100644 --- a/src/Decentralized/ModFiles/Localization/de.csv +++ b/src/Decentralized/ModFiles/Localization/de.csv @@ -892,3 +892,9 @@ gg.cond.h,Lüfterblätter und Kontakte gg.point.body,"Mit der Lupe prüfen; in der Beschriftungsleiste steht rechts in jeder Zeile „Beanstanden“. Wird ein verschwiegenes Problem beanstandet, wechselt die Zeile zum tatsächlichen Zustand und der Preis sinkt um die Differenz; wird etwas Zutreffendes beanstandet, weist die Gegenseite es zurück und der Ruf leidet.\nStimmt Lüfterzahl, Stromstecker, Aufdruck oder Seriennummer nicht mit dem Modell überein, wird sie beanstandet: Die Karte gilt dann als Fälschung, das Modell wechselt zum echten Chip und der Preis wird für diesen Chip neu berechnet.\n\nKarten von Kunden der Gutachtergilde funktionieren genauso: Nach dem Beanstanden ändert sich die Schätzung, bis der richtige Wert gemeldet wird." gg.ex.serial,Seriennummer: {0} gg.ex.h,"Beispiel: abgesplittertes Lüfterblatt, matte Kontakte, fehlendes Siegel" +rig.label.status,Status +rig.st.cards,Karten +rig.st.power,Verbrauch +rig.st.hash,Hashrate +rig.st.kj,{0} kJ/Tag +lbl.point.model,Modell beanstanden diff --git a/src/Decentralized/ModFiles/Localization/en.csv b/src/Decentralized/ModFiles/Localization/en.csv index eb2e0bc..b46c786 100644 --- a/src/Decentralized/ModFiles/Localization/en.csv +++ b/src/Decentralized/ModFiles/Localization/en.csv @@ -10,7 +10,7 @@ item.rig.desc,Holds up to {0} graphics cards. Hashrate {1} MH/s. Draws {2} kJ pe rig.label.modules,Modules item.rig.modules,"Modules: hashrate {0}, power draw {1}, wear {2}." rig.label.upgrade,Upgrade slot -item.rig.next,Slot {0}: put in {1} ({2}/{3}). +item.rig.next,"Slot {0}: drag {1} onto the rig ({2}/{3})." mat.common_electronic,Common electronics mat.rare_electronic,Rare electronics rig.label.cards,Graphics cards @@ -892,3 +892,9 @@ gg.cond.h,Fan Blades and Contacts gg.point.body,"Inspect with the magnifier; each row of the label bar has a Point out button on the right. Point out a hidden problem and that row switches to the true state and the price drops by the difference; point out something true and the other side refuses and your reputation suffers.\nIf the fan count, power connector, print or serial number does not match, point it out: the card is then ruled a counterfeit, the model reverts to the real chip, and the price is recalculated for that chip.\n\nCards brought by appraisal guild clients work the same way: pointing out problems changes the estimate until you report the correct value." gg.ex.serial,Serial number: {0} gg.ex.h,"Appraisal Example: Chipped Fan, Dull Contacts, Missing Seal" +rig.label.status,Status +rig.st.cards,Cards +rig.st.power,Power +rig.st.hash,Hashrate +rig.st.kj,{0} kJ/day +lbl.point.model,Point out model diff --git a/src/Decentralized/ModFiles/Localization/es.csv b/src/Decentralized/ModFiles/Localization/es.csv index 6b7459f..820602d 100644 --- a/src/Decentralized/ModFiles/Localization/es.csv +++ b/src/Decentralized/ModFiles/Localization/es.csv @@ -892,3 +892,9 @@ gg.cond.h,Aspas y contactos gg.point.body,"Se inspecciona con la lupa; a la derecha de cada fila de la barra de etiquetas está «Señalar». Al señalar un problema oculto, la fila pasa al estado real y el precio baja la diferencia; al señalar algo cierto, la otra parte lo rechaza y la reputación se resiente.\nSi el número de ventiladores, el conector de alimentación, la serigrafía o el número de serie no coincide con el modelo, se señala: la tarjeta queda declarada falsificación, el modelo vuelve al chip real y el precio se recalcula para ese chip.\n\nLas tarjetas que traen los clientes del gremio de tasadores funcionan igual: al señalar los problemas cambia la estimación, hasta que se indica el valor correcto." gg.ex.serial,Número de serie: {0} gg.ex.h,"Ejemplo de tasación: aspa mellada, contactos opacos, sello ausente" +rig.label.status,Estado +rig.st.cards,Tarjetas +rig.st.power,Consumo +rig.st.hash,Tasa de hash +rig.st.kj,{0} kJ/día +lbl.point.model,Señalar modelo diff --git a/src/Decentralized/ModFiles/Localization/fr.csv b/src/Decentralized/ModFiles/Localization/fr.csv index 8c17f3b..cba0374 100644 --- a/src/Decentralized/ModFiles/Localization/fr.csv +++ b/src/Decentralized/ModFiles/Localization/fr.csv @@ -892,3 +892,9 @@ gg.cond.h,Pales et contacts gg.point.body,"S'inspecte à la loupe ; à droite de chaque ligne de la barre d'étiquettes se trouve « Signaler ». Signaler un défaut dissimulé fait passer la ligne à l'état réel et le prix baisse de la différence ; signaler un point exact est rejeté par l'autre partie et la réputation en pâtit.\nSi le nombre de ventilateurs, le connecteur d'alimentation, la sérigraphie ou le numéro de série ne correspond pas au modèle, le signaler : la carte est alors déclarée contrefaçon, le modèle revient à la puce réelle et le prix est recalculé pour cette puce.\n\nLes cartes apportées par les clients de la guilde d'expertise suivent la même règle : les signalements modifient l'estimation jusqu'à l'annonce de la valeur correcte." gg.ex.serial,N° de série : {0} gg.ex.h,"Exemple d'expertise : pale ébréchée, contacts ternes, scellé manquant" +rig.label.status,État +rig.st.cards,Cartes +rig.st.power,Conso. +rig.st.hash,Taux de hachage +rig.st.kj,{0} kJ/j +lbl.point.model,Signaler le modèle diff --git a/src/Decentralized/ModFiles/Localization/ja.csv b/src/Decentralized/ModFiles/Localization/ja.csv index 02d3f88..05d4922 100644 --- a/src/Decentralized/ModFiles/Localization/ja.csv +++ b/src/Decentralized/ModFiles/Localization/ja.csv @@ -892,3 +892,9 @@ gg.cond.h,ブレードと端子 gg.point.body,拡大鏡で検分する。ラベルバーの各行の右側が「指摘する」である。隠された問題を指摘すると、その行が実際の状態に変わり、価格は差額分下がる。事実でないことを指摘すると、相手は認めず、信用が下がる。\nファン数、電源コネクタ、印字、シリアル番号のいずれかが型番と合わない場合は、それを指摘する。そのボードは偽造品と認定され、型番は実際のチップに戻り、価格は実際のチップで再計算される。\n\n鑑定ギルドの依頼人が持ち込むボードも同様で、問題を指摘すると見積もりが変わり、最終的に正しい価値を報告する。 gg.ex.serial,シリアル番号:{0} gg.ex.h,鑑定例:ブレード欠け、端子のくすみ、封印シール欠損 +rig.label.status,状態 +rig.st.cards,カード数 +rig.st.power,消費電力 +rig.st.hash,ハッシュレート +rig.st.kj,{0} kJ/日 +lbl.point.model,型番を指摘 diff --git a/src/Decentralized/ModFiles/Localization/pl.csv b/src/Decentralized/ModFiles/Localization/pl.csv index 7528416..5eb7168 100644 --- a/src/Decentralized/ModFiles/Localization/pl.csv +++ b/src/Decentralized/ModFiles/Localization/pl.csv @@ -892,3 +892,9 @@ gg.cond.h,Łopatki i styki gg.point.body,"Kartę sprawdza się lupą; po prawej stronie każdego wiersza paska etykiet znajduje się „Wskaż”. Wskazanie ukrytego problemu zmienia wiersz na stan rzeczywisty, a cena spada o różnicę; wskazanie czegoś prawdziwego druga strona odrzuca, a reputacja na tym traci.\nJeśli liczba wentylatorów, złącze zasilania, nadruk lub numer seryjny nie zgadza się z modelem, należy to wskazać: karta zostaje uznana za podróbkę, model wraca do prawdziwego układu, a cena jest liczona od nowa dla tego układu.\n\nKarty przynoszone przez klientów gildii rzeczoznawców działają tak samo: po wskazaniu problemów wycena się zmienia, aż zostanie podana prawidłowa wartość." gg.ex.serial,Numer seryjny: {0} gg.ex.h,"Przykład wyceny: wyszczerbiona łopatka, zmatowiałe styki, brak plomby" +rig.label.status,Stan +rig.st.cards,Karty +rig.st.power,Pobór +rig.st.hash,Moc obliczeniowa +rig.st.kj,{0} kJ/dzień +lbl.point.model,Wskaż model diff --git a/src/Decentralized/ModFiles/Localization/ru.csv b/src/Decentralized/ModFiles/Localization/ru.csv index 6a3ea7b..cb326c4 100644 --- a/src/Decentralized/ModFiles/Localization/ru.csv +++ b/src/Decentralized/ModFiles/Localization/ru.csv @@ -892,3 +892,9 @@ gg.cond.h,Лопасти и контакты gg.point.body,"Осмотр выполняется с помощью лупы; справа в каждой строке панели меток находится «Указать». Если указать на скрытую проблему, строка меняется на реальное состояние, а цена снижается на разницу; если указать на то, что соответствует действительности, другая сторона отказывается, и репутация страдает.\nЕсли число вентиляторов, разъём питания, маркировка или серийный номер не соответствуют модели, на это следует указать: карта признаётся подделкой, модель меняется на настоящий чип, а цена пересчитывается по этому чипу.\n\nКарты, которые приносят клиенты гильдии оценщиков, обрабатываются так же: после указания проблем оценка меняется, пока не будет названа правильная стоимость." gg.ex.serial,Серийный номер: {0} gg.ex.h,"Пример оценки: скол на лопасти, потускневшие контакты, нет пломбы" +rig.label.status,Состояние +rig.st.cards,Карты +rig.st.power,Расход +rig.st.hash,Хешрейт +rig.st.kj,{0} кДж/день +lbl.point.model,Указать модель diff --git a/src/Decentralized/ModFiles/Localization/zh.csv b/src/Decentralized/ModFiles/Localization/zh.csv index 25f0026..bc1ca7c 100644 --- a/src/Decentralized/ModFiles/Localization/zh.csv +++ b/src/Decentralized/ModFiles/Localization/zh.csv @@ -9,7 +9,7 @@ item.rig.desc,最多装 {0} 张显卡。算力 {1} MH/s。耗电 {2} kJ/天。 rig.label.modules,模块 item.rig.modules,模块:算力 {0},耗电 {1},损耗 {2}。 rig.label.upgrade,升级槽位 -item.rig.next,第 {0} 槽:投入{1}({2}/{3})。 +item.rig.next,"第 {0} 槽:把{1}拖到矿架上({2}/{3})。" mat.common_electronic,普通电子元件 mat.rare_electronic,稀有电子元件 rig.label.cards,显卡 @@ -891,3 +891,9 @@ gg.cond.h,叶片与金手指 gg.point.body,用放大镜检视,标签栏每行右边是“指出”。指出隐瞒的问题,这一行改成真实情况,价格按差额回落;指出的是真话,对方不认,信誉受损。\n风扇数、供电口、丝印、序列号任何一项对不上,指出它,这张卡就被认定为假冒,型号改回真实芯片,价格按真实芯片重算。\n\n鉴定公会的客户带来的卡也一样:指出问题后估价跟着变,最后报出正确价值。 gg.ex.serial,序列号:{0} gg.ex.h,鉴定示例:叶片缺角、金手指发暗、封条缺失 +rig.label.status,状态 +rig.st.cards,显卡数 +rig.st.power,耗电 +rig.st.hash,算力 +rig.st.kj,{0} kJ/天 +lbl.point.model,指出型号 diff --git a/src/Decentralized/ModFiles/Textures/Items/rig.png b/src/Decentralized/ModFiles/Textures/Items/rig.png index 2480244266c57020aca6b2811aebb06cca1d49ab..ebb0d8f865075d0d93b7c0dfc4d1e321a3604f09 100644 GIT binary patch literal 369 zcmV-%0gnEOP)D;laAP&Wg@V+W(i3XK;aza|u^Zf9lLv(og zzw;T8bUMZuV~n}8=|1$na3V_J=5w7q^W~C20tqDW$jj@rRoK8bZXkIzC5mrD0&O6H zA}qopOrQuiDbV)Slt^Gh0#l8z4J1&6MHmDIG5eT&6D?4DYi^K%5}(F9a%($P&4B2BushyXU?VQ6fr2i6{{z;!Z?~C=mjch!Sxpl1Pb! zez`L+Lf~S%z7Uw77ys?GvcTfSxFqN=ZpDky3zv8P$P*8LiS$7rAHOySa{|Fl(!>Yh P00000NkvXXu0mjf;bNaG literal 305 zcmV-10nYx3P)mtlpILxt?(#mwR?3`ubZ`?51h zNV1H@VzD5r-y7VKWN!X)D`2$Ca~lK!2+$J1YQ0G!PQX+1W(YLaBzBtt?bUG!u)h{> z03mRxk7j^)F``r-x8lVJQaAtlixuscZ+jci06bL<-%M3j%|Tlb00000NkvXXu0mjf Dhs=Ai diff --git a/src/Decentralized/RigStatus.cs b/src/Decentralized/RigStatus.cs new file mode 100644 index 0000000..3115cc7 --- /dev/null +++ b/src/Decentralized/RigStatus.cs @@ -0,0 +1,20 @@ +using System.Runtime.CompilerServices; + +namespace Decentralized +{ + /// 矿架窗口里的状态面板:显卡数、耗电、算力。每台矿架一组文字,更新矿架时一并刷新。 + public static class RigStatus + { + private static readonly ConditionalWeakTable Table = new ConditionalWeakTable(); + + public static void Add(GameItem rig, MachineryText[] lines) { Table.Remove(rig); Table.Add(rig, lines); } + + public static void Show(GameItem rig, int cards, int slots, int kj, double mhs) + { + if (!Table.TryGetValue(rig, out var t) || t.Length < 3) return; + t[0].SetStatus(L.T("rig.st.cards"), $"{cards}/{slots}"); + t[1].SetStatus(L.T("rig.st.power"), L.T("rig.st.kj", kj)); + t[2].SetStatus(L.T("rig.st.hash"), $"{Fmt.Num(mhs)} MH/s"); + } + } +}