鉴定改版:风扇数、供电口、丝印、序列号四项真伪依据在前,假卡依据各自独立(平均 1.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:40:50 +08:00
1 parent a8d7bc3427
commit f40436b7d2
57 files changed
+451 -261

No files matched your search

+107 -61
View File
@@ -141,7 +141,9 @@ namespace Decentralized
return y + h;
}
private static string Front(string brand, int tier) => $"gpu_big_{brand}_f_t{tier}";
/// <summary>正面底图:供电口类别(0 = 6 针,1 = 8 针,2 = 双 8 针)与风扇数(1 到 3)各自独立。</summary>
private static string Front(string brand, int pin, int count) => $"gpu_big_{brand}_f_p{pin}n{count}";
private static string Front(string brand, int tier) => Front(brand, Hardware.PinClass[tier], Hardware.FanCount[tier]);
private static int Fans(int tier) => Hardware.FanCount[tier];
private static void Caption(PaperUI b, float x, float y, float w, string text, string color = null)
@@ -150,6 +152,20 @@ namespace Decentralized
if (color != null) b.Last.color = color;
}
/// <summary>背面贴纸上的序列号:贴纸在大图 (142, 91) 附近,随图的缩放摆放。</summary>
private static void SerialOnSticker(PaperUI b, float ax, float ay, float scale, string serial)
{
float cx = ax + 142f * scale, cy = ay + 91f * scale;
b.AddText(cx - 26f * scale, cy - 4.5f, 52f * scale, 9f, serial, "caption", align: "center", fontSize: 3.2f * scale / 0.78f);
b.Last.color = "#1B1B1B";
}
private static string SampleSerial(string model, string chip = null, int kind = 0)
{
var u = new Unit { Model = model, FakeOf = chip, Health = 100, Look = new CardLook { Seed = 31337, Serial = kind } };
return CardLabels.SerialText(u);
}
// ---- 1 概述 ----
private static void Page1(PaperUI b)
{
@@ -164,7 +180,7 @@ namespace Decentralized
b.Last.fontSize = 7f;
}
// ---- 2 档次 ----
// ---- 2 显卡型号 ----
private static void Page2(PaperUI b)
{
float y = NewPage(b);
@@ -184,43 +200,102 @@ namespace Decentralized
}
y = rowBottom + 4f;
}
Text(b, y + 2f, L.T("gg.p2.models"), "body");
}
// ---- 3 叶片 ----
// ---- 3 风扇数 ----
private static void Page3(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.count.h"));
y = Text(b, y, L.T("gg.count.body"), gap: 6f);
for (int n = 1; n <= 3; n++)
{
float bottom = Art(b, X + (W - 96f) / 2, y, 0.5f, Front("probidia", 1, n));
Caption(b, X, bottom, W, L.T("lbl.count." + n));
y = bottom + 15f;
}
}
// ---- 4 供电口 ----
private static void Page4(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.pin.h"));
y = Text(b, y, L.T("gg.pin.body"), gap: 6f);
for (int p = 0; p < 3; p++)
{
float bottom = Art(b, X + (W - 96f) / 2, y, 0.5f, Front("probidia", p, 2));
Caption(b, X, bottom, W, L.T("lbl.pin." + p));
y = bottom + 15f;
}
}
// ---- 5 序列号 ----
private static void Page5(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.serial.h"));
y = Text(b, y, L.T("gg.serial.body"), gap: 6f);
float ax = X + (W - 150f) / 2;
float bottom = Art(b, ax, y, 0.78f, "gpu_big_probidia_b", "gpu_big_ov_print_normal_rtx80");
SerialOnSticker(b, ax, y, 0.78f, SampleSerial("RTX80"));
Caption(b, X, bottom + 1, W, L.T("gg.serial.cap"));
y = bottom + 16f;
y = Text(b, y, L.T("gg.serial.pb"), gap: 4f);
y = Text(b, y, L.T("gg.serial.md"), gap: 8f);
Text(b, y, L.T("gg.serial.rule"), "body");
}
// ---- 6 背面丝印 ----
private static void Page6(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.print.h"));
string[] kinds = { "normal", "stamp", "skew" };
for (int s = 0; s < 3; s++)
{
string model = s == 1 ? "rtx60" : "rtx80";
float ax = X + (W - 96f) / 2;
float bottom = Art(b, ax, y, 0.5f, "gpu_big_probidia_b", $"gpu_big_ov_print_{kinds[s]}_{model}");
SerialOnSticker(b, ax, y, 0.5f, SampleSerial("RTX80"));
Caption(b, X, bottom, W, L.T("gg.print." + s), s == 0 ? null : Bad);
y = bottom + 14f;
}
Text(b, y, L.T("gg.print.note"), "body");
}
// ---- 7 叶片与金手指 ----
private static void Page7(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.fan.h"));
float cw = W / 3;
float bottom = y;
for (int s = 0; s < 3; s++)
{
var layers = new List<string> { Front("probidia", 1) };
if (s == 1) layers.Add("gpu_big_ov_fan_dust2_" + Fans(1));
if (s == 2) { layers.Add("gpu_big_ov_fan_dust1_" + Fans(1)); layers.Add("gpu_big_ov_fan_chip_" + Fans(1)); }
float bottom = Art(b, X + (W - 96f) / 2, y, 0.5f, layers.ToArray());
Caption(b, X, bottom, W, T("gg.fan." + s), s == 0 ? null : Bad);
y = bottom + 15f;
float bx = Art(b, X + s * cw + (cw - 78f) / 2, y, 0.4f, layers.ToArray());
Caption(b, X + s * cw, bx, cw, T("gg.fan." + s), s == 0 ? null : Bad);
bottom = bx + 24f;
}
}
// ---- 4 金手指 ----
private static void Page4(PaperUI b)
{
float y = NewPage(b);
y = bottom + 10f;
y = Section(b, y, L.T("gg.fin.h"));
for (int s = 0; s < 3; s++)
{
var layers = new List<string> { Front("probidia", 1) };
if (s == 1) layers.Add("gpu_big_ov_fin_dim");
if (s == 2) layers.Add("gpu_big_ov_fin_oxide");
float bottom = Art(b, X + (W - 96f) / 2, y, 0.5f, layers.ToArray());
Caption(b, X, bottom, W, T("gg.fin." + s), s == 0 ? null : Bad);
y = bottom + 15f;
float bx = Art(b, X + s * cw + (cw - 78f) / 2, y, 0.4f, layers.ToArray());
Caption(b, X + s * cw, bx, cw, T("gg.fin." + s), s == 0 ? null : Bad);
bottom = bx + 24f;
}
Text(b, bottom + 6f, L.T("gg.wear.note"), "body");
}
// ---- 5 挡板与封条 ----
private static void Page5(PaperUI b)
// ---- 8 挡板与封条 ----
private static void Page8(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.brk.h"));
@@ -241,66 +316,35 @@ namespace Decentralized
{
var layers = new List<string> { "gpu_big_probidia_b", "gpu_big_ov_print_normal_rtx70" };
if (s == 1) layers.Add("gpu_big_ov_seal_missing");
float bx = Art(b, X + s * cw + (cw - 120f) / 2, y, 0.625f, layers.ToArray());
float ax = X + s * cw + (cw - 120f) / 2;
float bx = Art(b, ax, y, 0.625f, layers.ToArray());
SerialOnSticker(b, ax, y, 0.625f, SampleSerial("RTX70"));
Caption(b, X + s * cw, bx, cw, T(s == 0 ? "gg.seal.0" : "gg.seal.2"), s == 0 ? null : Bad);
bottom = bx + 12f;
}
Text(b, bottom + 8f, L.T("gg.wear.note"), "body");
}
// ---- 6 序列号 ----
private static void Page6(PaperUI b)
// ---- 9 指出 ----
private static void Page9(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.serial.h"));
y = Text(b, y, L.T("gg.serial.body"), gap: 6f);
float bottom = Art(b, X + (W - 150f) / 2, y, 0.78f, "gpu_big_probidia_b", "gpu_big_ov_print_normal_rtx80");
Caption(b, X, bottom + 1, W, L.T("gg.serial.cap"));
y = bottom + 16f;
y = Text(b, y, L.T("gg.serial.pb"), gap: 4f);
y = Text(b, y, L.T("gg.serial.md"), gap: 8f);
Text(b, y, L.T("gg.serial.rule"), "body");
}
// ---- 7 背面丝印 ----
private static void Page7(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.print.h"));
string[] kinds = { "normal", "stamp", "skew" };
for (int s = 0; s < 3; s++)
{
string model = s == 1 ? "rtx60" : "rtx80";
float bottom = Art(b, X + (W - 96f) / 2, y, 0.5f, "gpu_big_probidia_b", $"gpu_big_ov_print_{kinds[s]}_{model}");
Caption(b, X, bottom, W, L.T("gg.print." + s), s == 0 ? null : Bad);
y = bottom + 14f;
}
Text(b, y, L.T("gg.print.note"), "body");
}
// ---- 8 卖家与指出 ----
private static void Page8(PaperUI b)
{
float y = NewPage(b);
y = Section(b, y, L.T("gg.seller.h"));
y = Text(b, y, T("gg.seller.body"), gap: 8f);
y = Section(b, y, L.T("gg.point.h"));
Text(b, y, T("gg.point.body"), "body");
foreach (var e in Examples) ExamplePage(b, e);
}
// ---- 9 起:鉴定示例 ----
private sealed class Ex { public string Title, Label, Chip; public int Health, Fan, Fingers, Bracket, Seal; }
private sealed class Ex { public string Title, Label, Chip; public int Health, Fan, Fingers, Bracket, Seal, CountBad, PinBad, SerialBad; }
private static readonly Ex[] Examples =
{
new Ex { Title = "gg.ex.h", Label = "RTX80", Health = 60, Fan = 2, Fingers = 1, Seal = 2 },
new Ex { Title = "gg.ex.h3", Label = "RX800", Health = 35, Fan = 2, Fingers = 2, Bracket = 1, Seal = 2 },
new Ex { Title = "gg.ex.h2", Label = "RTX90", Chip = "RTX60", Health = 90, Fan = 1 },
new Ex { Title = "gg.ex.h2", Label = "RTX90", Chip = "RTX60", Health = 90, Fan = 1, CountBad = 1, SerialBad = 2 },
new Ex { Title = "gg.ex.h4", Label = "RTX70", Health = 85, Fan = 1 },
new Ex { Title = "gg.ex.h5", Label = "RX70", Health = 100 },
};
private static void Page9(PaperUI b) { foreach (var e in Examples) ExamplePage(b, e); }
private static string Brand(string model) => Hardware.Specs[model].Brand.ToString();
@@ -309,10 +353,11 @@ namespace Decentralized
float y = NewPage(b);
y = Section(b, y, L.T(e.Title));
string real = e.Chip ?? e.Label;
var u = new Unit { Model = e.Label, FakeOf = e.Chip, Health = e.Health, Look = new CardLook { Seed = 0, Fan = e.Fan, Fingers = e.Fingers, Bracket = e.Bracket, Sticker = e.Seal } };
var u = new Unit { Model = e.Label, FakeOf = e.Chip, Health = e.Health, Look = new CardLook { Seed = 31337, Fan = e.Fan, Fingers = e.Fingers, Bracket = e.Bracket, Sticker = e.Seal, CountBad = e.CountBad, PinBad = e.PinBad, Serial = e.SerialBad } };
long baseV = CardValue.Of(real, e.Health);
var layers = new List<string> { Front(Hardware.Specs[real].Brand == "PMD" ? "pmd" : "probidia", Hardware.Specs[real].Tier) };
int fans = Fans(Hardware.Specs[real].Tier);
string brandKey = Hardware.Specs[real].Brand == "PMD" ? "pmd" : "probidia";
var layers = new List<string> { Front(brandKey, u.ObservedPin, u.ObservedCount) };
int fans = u.ObservedCount;
if (e.Fan == 1) layers.Add("gpu_big_ov_fan_dust2_" + fans);
if (e.Fan == 2) { layers.Add("gpu_big_ov_fan_dust1_" + fans); layers.Add("gpu_big_ov_fan_chip_" + fans); }
if (e.Fingers == 1) layers.Add("gpu_big_ov_fin_dim");
@@ -321,7 +366,8 @@ namespace Decentralized
float bottom = Art(b, X + (W - 140f) / 2, y, 0.73f, layers.ToArray());
y = bottom + 6f;
string name = Hardware.Specs[e.Label].Brand + " " + Items.DisplayModel(e.Label);
y = Text(b, y, L.T("gg.ex.card", name, e.Health), "body", align: "center", gap: 8f);
y = Text(b, y, L.T("gg.ex.card", name, e.Health), "body", align: "center", gap: 3f);
y = Text(b, y, L.T("gg.ex.serial", CardLabels.SerialText(u)), "caption", Ink, "center", 8f);
const float lx = X + 20f, lw = W - 40f;
if (e.Chip != null)
{