From 6b2d3940230378db889266ac2ba4801d850768ab Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 13:04:45 +0800 Subject: [PATCH] Inspection overlays designed by agy; appearance dimensions tied to value, wear and death Co-Authored-By: Claude Sonnet 5.5 --- art/__pycache__/big_cases.cpython-314.pyc | Bin 0 -> 44059 bytes art/__pycache__/sprites.cpython-314.pyc | Bin 46327 -> 46958 bytes art/big_cases.py | 1159 +++++++++++++++++ art/sprites.py | 10 +- src/Decentralized.Domain/CardLook.cs | 17 +- src/Decentralized.Domain/Mining.cs | 4 +- src/Decentralized/GpuInspectView.cs | 37 +- .../Textures/Items/gpu_big_ov_brk1.png | Bin 290 -> 0 bytes .../Textures/Items/gpu_big_ov_brk2.png | Bin 238 -> 0 bytes .../Textures/Items/gpu_big_ov_brk_port.png | Bin 0 -> 409 bytes .../Textures/Items/gpu_big_ov_brk_scratch.png | Bin 0 -> 349 bytes .../Textures/Items/gpu_big_ov_fan1.png | Bin 1011 -> 0 bytes .../Textures/Items/gpu_big_ov_fan2.png | Bin 291 -> 0 bytes .../Textures/Items/gpu_big_ov_fan_chip.png | Bin 0 -> 380 bytes .../Textures/Items/gpu_big_ov_fan_dust1.png | Bin 0 -> 509 bytes .../Textures/Items/gpu_big_ov_fan_dust2.png | Bin 0 -> 1873 bytes .../Textures/Items/gpu_big_ov_fan_oil.png | Bin 0 -> 432 bytes .../Textures/Items/gpu_big_ov_fin1.png | Bin 285 -> 0 bytes .../Textures/Items/gpu_big_ov_fin2.png | Bin 983 -> 0 bytes .../Textures/Items/gpu_big_ov_fin_dim.png | Bin 0 -> 417 bytes .../Textures/Items/gpu_big_ov_fin_oxide.png | Bin 0 -> 706 bytes .../Items/gpu_big_ov_print_normal_rz470.png | Bin 0 -> 437 bytes .../Items/gpu_big_ov_print_normal_rz580.png | Bin 0 -> 431 bytes .../Items/gpu_big_ov_print_normal_rz6800.png | Bin 0 -> 428 bytes .../Items/gpu_big_ov_print_normal_rz7900.png | Bin 0 -> 447 bytes .../Items/gpu_big_ov_print_normal_rzx50.png | Bin 0 -> 451 bytes .../Items/gpu_big_ov_print_normal_rzx60.png | Bin 0 -> 450 bytes .../Items/gpu_big_ov_print_normal_rzx70.png | Bin 0 -> 447 bytes .../Items/gpu_big_ov_print_normal_rzx80ti.png | Bin 0 -> 488 bytes .../Items/gpu_big_ov_print_normal_rzx90.png | Bin 0 -> 442 bytes .../Items/gpu_big_ov_print_skew_rz470.png | Bin 0 -> 569 bytes .../Items/gpu_big_ov_print_skew_rz580.png | Bin 0 -> 574 bytes .../Items/gpu_big_ov_print_skew_rz6800.png | Bin 0 -> 634 bytes .../Items/gpu_big_ov_print_skew_rz7900.png | Bin 0 -> 626 bytes .../Items/gpu_big_ov_print_skew_rzx50.png | Bin 0 -> 592 bytes .../Items/gpu_big_ov_print_skew_rzx60.png | Bin 0 -> 596 bytes .../Items/gpu_big_ov_print_skew_rzx70.png | Bin 0 -> 586 bytes .../Items/gpu_big_ov_print_skew_rzx80ti.png | Bin 0 -> 689 bytes .../Items/gpu_big_ov_print_skew_rzx90.png | Bin 0 -> 604 bytes .../Items/gpu_big_ov_print_stamp_rz470.png | Bin 0 -> 865 bytes .../Items/gpu_big_ov_print_stamp_rz580.png | Bin 0 -> 876 bytes .../Items/gpu_big_ov_print_stamp_rz6800.png | Bin 0 -> 929 bytes .../Items/gpu_big_ov_print_stamp_rz7900.png | Bin 0 -> 905 bytes .../Items/gpu_big_ov_print_stamp_rzx50.png | Bin 0 -> 859 bytes .../Items/gpu_big_ov_print_stamp_rzx60.png | Bin 0 -> 855 bytes .../Items/gpu_big_ov_print_stamp_rzx70.png | Bin 0 -> 883 bytes .../Items/gpu_big_ov_print_stamp_rzx80ti.png | Bin 0 -> 966 bytes .../Items/gpu_big_ov_print_stamp_rzx90.png | Bin 0 -> 874 bytes .../Items/gpu_big_ov_screw_opened.png | Bin 0 -> 364 bytes .../Items/gpu_big_ov_seal_missing.png | Bin 0 -> 492 bytes .../Items/gpu_big_ov_seal_reglued.png | Bin 0 -> 419 bytes .../Textures/Items/gpu_big_ov_shroud_chip.png | Bin 0 -> 345 bytes .../Items/gpu_big_ov_sticker_hand.png | Bin 0 -> 441 bytes .../Items/gpu_big_ov_sticker_scratch.png | Bin 0 -> 420 bytes .../Items/gpu_big_ov_sticker_torn.png | Bin 0 -> 1011 bytes .../Textures/Items/gpu_big_ov_stk1.png | Bin 534 -> 0 bytes .../Textures/Items/gpu_big_ov_stk2.png | Bin 311 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rz470.png | Bin 300 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rz580.png | Bin 303 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rz6800.png | Bin 323 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rz7900.png | Bin 313 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rzx50.png | Bin 301 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rzx60.png | Bin 305 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rzx70.png | Bin 301 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rzx80ti.png | Bin 330 -> 0 bytes .../Textures/Items/gpu_big_ov_txs_rzx90.png | Bin 309 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rz470.png | Bin 291 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rz580.png | Bin 293 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rz6800.png | Bin 298 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rz7900.png | Bin 299 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rzx50.png | Bin 292 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rzx60.png | Bin 288 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rzx70.png | Bin 287 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rzx80ti.png | Bin 309 -> 0 bytes .../Textures/Items/gpu_big_ov_txt_rzx90.png | Bin 291 -> 0 bytes tests/Decentralized.Domain.Tests/Program.cs | 5 + 76 files changed, 1221 insertions(+), 11 deletions(-) create mode 100644 art/__pycache__/big_cases.cpython-314.pyc create mode 100644 art/big_cases.py delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk_port.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk_scratch.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_chip.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust1.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_oil.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin1.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin_dim.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin_oxide.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz470.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz580.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz6800.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz7900.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx50.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx60.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx70.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx80ti.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx90.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz470.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz580.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz6800.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz7900.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx50.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx60.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx70.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx80ti.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx90.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz470.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz580.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz6800.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz7900.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx50.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx60.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx70.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx80ti.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx90.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_screw_opened.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_seal_missing.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_seal_reglued.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_shroud_chip.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_hand.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_scratch.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_torn.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk1.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk2.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz6800.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz7900.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz470.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz6800.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx60.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx70.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png delete mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png diff --git a/art/__pycache__/big_cases.cpython-314.pyc b/art/__pycache__/big_cases.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..972e03c5c3030a214bede02cf2910f1cb7a7723e GIT binary patch literal 44059 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 JC6;y4{{*G~vl9RS literal 0 HcmV?d00001 diff --git a/art/__pycache__/sprites.cpython-314.pyc b/art/__pycache__/sprites.cpython-314.pyc index e88a153bf5b27bdc505508fdab1f18f25d49a035..7c4eabd3aac4e67e05eda4c10ba7ef438f8d9510 100644 GIT binary patch delta 986 zcmY+ATTBx{6ozNo?%Ecq3$3(Nv>{+>!P1DWn@ANC_OS zxRnygUEBVDhkAl5Udj?J7F~^l5LTxTI_d~9kTpcg6G-(Tyjlj2u-c22AA`=ZDXWE- z$|S#6!;b2!kH8hlznLy4a8+{T6RFHg(;>gLP$}odcy;~N9i*ly0)HU#85*q-D>GOb^y~;1E|{%@ z<&pB4f=%;g@x596AXpebXp9(#N@HSFjQOMfG40rar`1oS*;Qq8f`5@Ct4f!6l5Oj$ z{Fv(va|=T5yx@E%ILGLiZ&uhaFZdFI?`h-n=BeiAfvLc&jk70O6P}^2oZ{3I9=JfG>#qHdOMb-dUT> diff --git a/art/big_cases.py b/art/big_cases.py new file mode 100644 index 0000000..ee2d3d9 --- /dev/null +++ b/art/big_cases.py @@ -0,0 +1,1159 @@ + +"""显卡检视大图叠加层:用于放大镜检视台的各种真假/成色鉴定 case 细节层。 +与底图同尺寸(192×128),仅绘制发生变化的像素。 +""" + +import math +import random +from big import ( + BW, + BH, + FANS, + FR, + NOTCH_X, + SH0, + SH1, + FING_Y0, + FING_Y1, + Canvas, + text57, + F57, +) + + +def _new(): + return Canvas(BW, BH) + + +# ============================================================================== +# 正面 Case +# ============================================================================== + + +def fan_dust1(): + """1. 风扇轻度积灰:叶片边缘灰线、轴心轻微积垢、少量蛛丝细线。""" + c = _new() + rnd = random.Random(101) + + for cx, cy in FANS: + # 轴心周围微灰圈 + for a_deg in range(0, 360, 15): + rad = math.radians(a_deg) + r = 7.0 + (rnd.random() * 2.5) + x, y = int(cx + math.cos(rad) * r), int(cy + math.sin(rad) * r) + c.put(x, y, "m" if rnd.random() < 0.65 else "d") + + # 九片叶片的前缘微量积灰与边角聚灰 + for blade in range(9): + base_ang = blade * (2 * math.pi / 9) + for r in range(10, FR - 4, 2): + ang = base_ang - (r - 7) * 0.055 + x = int(cx + math.cos(ang) * r) + y = int(cy + math.sin(ang) * r) + if rnd.random() < 0.40: + c.put(x, y, "b" if rnd.random() < 0.6 else "m") + # 叶尖处积微灰 + if r > FR - 8 and rnd.random() < 0.55: + c.put(x + 1, y, "l" if rnd.random() < 0.3 else "m") + + # 2~3 根搭在扇叶与风道外框之间的微细蛛丝 + for p0, p1 in ( + ((cx - 18, cy - 14), (cx - 25, cy - 10)), + ((cx + 10, cy + 18), (cx + 22, cy + 14)), + ): + x0, y0 = p0 + x1, y1 = p1 + steps = max(abs(x1 - x0), abs(y1 - y0)) + for i in range(steps + 1): + t = i / steps + sx = int(x0 + (x1 - x0) * t) + sy = int(y0 + (y1 - y0) * t + math.sin(t * math.pi) * 1.5) + c.put(sx, sy, "l" if i % 2 == 0 else "b") + + return c + + +def fan_dust2(): + """1. 风扇重度积灰:轴心厚灰结垢、叶面大团絮状灰斑、风道外圈堵灰、蜘蛛网细丝。""" + c = _new() + rnd = random.Random(102) + + for cx, cy in FANS: + # 轴心及周边重垢厚积 + for dy in range(-12, 13): + for dx in range(-12, 13): + r = math.hypot(dx, dy) + if 5.5 <= r <= 13.0: + val = rnd.random() + if val < 0.70: + c.put( + cx + dx, + cy + dy, + "b" if val < 0.25 else "m" if val < 0.55 else "d", + ) + + # 扇叶大面积覆灰与灰絮团 + for blade in range(9): + base_ang = blade * (2 * math.pi / 9) + for r in range(8, FR - 3): + ang = base_ang - (r - 7) * 0.055 + x = int(cx + math.cos(ang) * r) + y = int(cy + math.sin(ang) * r) + c.put(x, y, "b" if rnd.random() < 0.4 else "m") + if rnd.random() < 0.35: + c.put(x, y + 1, "d") + + # 风道死角与外圈凹陷堵灰 + for a_deg in range(0, 360, 4): + rad = math.radians(a_deg) + for dr in (FR - 6, FR - 5, FR - 4): + if rnd.random() < 0.65: + x = int(cx + math.cos(rad) * dr) + y = int(cy + math.sin(rad) * dr) + c.put(x, y, "d" if (x + y) % 2 else "m") + + # 灰絮团(带厚度高光) + clumps = ( + (cx - 14, cy - 8), + (cx + 12, cy - 14), + (cx - 8, cy + 15), + (cx + 15, cy + 12), + ) + for kx, ky in clumps: + c.rect(kx - 1, ky - 1, kx + 2, ky + 1, "m") + c.rect(kx - 1, ky - 1, kx + 1, ky - 1, "l") + c.put(kx + 2, ky + 1, "d") + c.put(kx - 2, ky, "b") + c.put(kx + 3, ky, "d") + + # 蛛网连线(从内到外蜘蛛网状蛛丝结构) + anchors = [ + (cx - 24, cy - 12), + (cx - 16, cy - 20), + (cx, cy - 25), + (cx + 18, cy - 18), + (cx - 12, cy - 5), + (cx + 8, cy - 8), + ] + edges = [(0, 4), (1, 4), (1, 5), (2, 5), (3, 5), (4, 5)] + for i0, i1 in edges: + x0, y0 = anchors[i0] + x1, y1 = anchors[i1] + steps = max(abs(x1 - x0), abs(y1 - y0)) + for s in range(steps + 1): + t = s / steps + sx = int(x0 + (x1 - x0) * t) + sy = int(y0 + (y1 - y0) * t) + c.put(sx, sy, "w" if s % 3 == 0 else "l") + + return c + + +def fan_chip(): + """2. 风扇叶片缺角:扇叶断裂缺损,断面 jagged 崩缺、露出黑风道底,带裂纹延伸至根部。""" + c = _new() + + # 左风扇断叶:位于右上方叶片(约 15°~45°) + cx, cy = FANS[0] + # 崩缺露出底部风道黑腔 + for r in range(16, FR - 2): + for deg in range(12, 44): + rad = math.radians(deg) + # 形成犬牙交错的不规则裂口形状 + r_edge = 18 + int(3 * math.sin(deg * 0.7) + 2 * math.cos(deg * 1.3)) + if r >= r_edge: + px = int(cx + math.cos(rad) * r) + py = int(cy + math.sin(rad) * r) + c.put(px, py, "n" if (px + py) % 3 else "k") + + # 断裂口侧缘受光白色高光毛刺与背光阴影 + break_edge = [ + (cx + 17, cy + 6), + (cx + 18, cy + 8), + (cx + 19, cy + 11), + (cx + 20, cy + 12), + (cx + 22, cy + 14), + (cx + 24, cy + 16), + (cx + 25, cy + 20), + ] + for i, (bx, by) in enumerate(break_edge): + c.put(bx, by, "h" if i % 2 == 0 else "w") + c.put(bx + 1, by + 1, "k") + + # 裂纹延伸(Stress crack)自断面一路裂向轴心根部 + crack = [ + (cx + 16, cy + 6), + (cx + 15, cy + 5), + (cx + 13, cy + 5), + (cx + 12, cy + 4), + (cx + 10, cy + 4), + (cx + 9, cy + 3), + (cx + 7, cy + 2), + ] + for kx, ky in crack: + c.put(kx, ky, "n") + c.put(kx, ky - 1, "l") # 裂缝边缘受光面 + + # 右风扇:叶尖崩掉一个小角 + rx, ry = FANS[1] + for r in range(FR - 8, FR - 2): + for deg in range(215, 235): + rad = math.radians(deg) + if r > FR - 6 + (deg % 3): + c.put( + int(rx + math.cos(rad) * r), + int(ry + math.sin(rad) * r), + "n", + ) + c.put(rx - 21, ry - 14, "h") + c.put(rx - 22, ry - 13, "w") + c.put(rx - 20, ry - 13, "k") + + return c + + +def fan_oil(): + """3. 风扇轴心漏油/褪色:轴承油渍沿离心方向与重力向下渗出浸润、轴心贴纸褪色混浊。""" + c = _new() + + for cx, cy in FANS: + # 轴心贴纸油污褪色(盖掉原来的鲜艳色,变暗浊褐灰) + for dy in range(-4, 5): + for dx in range(-4, 5): + r = math.hypot(dx, dy) + if r <= 4.2: + c.put(cx + dx, cy + dy, "e" if r < 2.5 else "d") + + # 轴心缝隙溢出的深色环状油垢 + for deg in range(0, 360, 10): + rad = math.radians(deg) + for r in (5.0, 6.0, 7.0): + ox = int(cx + math.cos(rad) * r) + oy = int(cy + math.sin(rad) * r) + c.put(ox, oy, "c" if deg % 20 == 0 else "e") + + # 向下及顺着离心叶片流淌的渗油泪痕(重力向下,沿扇叶根部流淌) + # 1) 主滴漏条(竖直向下) + drips = [ + (cx, cy + 7, "c"), + (cx + 1, cy + 7, "e"), + (cx, cy + 8, "c"), + (cx - 1, cy + 8, "q"), + (cx, cy + 9, "e"), + (cx, cy + 10, "c"), + (cx + 1, cy + 10, "h"), # 油液反光 + (cx, cy + 11, "e"), + (cx, cy + 12, "q"), + (cx, cy + 13, "e"), + (cx, cy + 14, "c"), + (cx, cy + 15, "h"), + (cx, cy + 16, "e"), + (cx + 1, cy + 17, "q"), + ] + for dx, dy, col in drips: + c.put(dx, dy, col) + + # 2) 右下斜向叶片根部浸润油晕 + side_drips = [ + (cx + 6, cy + 5, "e"), + (cx + 7, cy + 6, "c"), + (cx + 8, cy + 7, "q"), + (cx + 9, cy + 7, "h"), + (cx + 10, cy + 8, "e"), + (cx + 11, cy + 9, "c"), + (cx + 12, cy + 10, "e"), + (cx + 13, cy + 10, "q"), + ] + for dx, dy, col in side_drips: + c.put(dx, dy, col) + + # 3) 左上回渗微斑 + c.put(cx - 6, cy - 4, "e") + c.put(cx - 7, cy - 5, "q") + c.put(cx - 8, cy - 5, "c") + + return c + + +def fin_dim(): + """4. 金手指发暗:镀金磨损发褐,失去高光亮黄,露出发黑氧化的暗铜色和划轨。""" + c = _new() + x0, x1 = SH0[0], SH1[0] + + for x in range(x0 + 2, x1 - 2): + if NOTCH_X - 2 <= x <= NOTCH_X + 3 or (x - x0) % 4 == 3: + continue + pin_offset = (x - x0) % 4 + + # 顶部斜切高光被暗黄铜/暗灰取代 + c.put(x, FING_Y0, "q" if x % 2 == 0 else "m") + + # 针脚本体:失去 'Y',变为接触氧化的暗褐 'e'、暗铜 'q' 与焦褐 + for y in range(FING_Y0 + 1, FING_Y1): + # 模拟 PCIe 插拔划道痕迹(中间有极细竖向磨损深槽) + if pin_offset == 1 and y in (112, 113, 116, 117, 118, 120): + c.put(x, y, "c") # 磨损黑槽 + elif (x + y * 2) % 5 == 0: + c.put(x, y, "c") + elif (x + y) % 2 == 0: + c.put(x, y, "e") + else: + c.put(x, y, "q") + + # 底部插拔磨耗端 + c.put(x, FING_Y1, "c" if pin_offset == 0 else "e") + + return c + + +def fin_oxide(): + """5. 金手指氧化:铜绿由根部与底部向上爬蔓延,斑驳的蓝绿/深绿锈斑('G'/'g2'/'S')。""" + c = _new() + rnd = random.Random(205) + x0, x1 = SH0[0], SH1[0] + + # 定义几个主要锈蚀蔓延爆发区(树枝状爬生) + oxide_zones = [ + (35, 62, 11), # (x_start, x_end, max_h) + (78, 105, 8), + (125, 168, 13), + ] + + for x in range(x0 + 2, x1 - 2): + if NOTCH_X - 2 <= x <= NOTCH_X + 3 or (x - x0) % 4 == 3: + continue + + # 计算当前 x 的铜锈高度 + h_grow = 0 + for z0, z1, max_h in oxide_zones: + if z0 <= x <= z1: + mid = (z0 + z1) / 2 + span = (z1 - z0) / 2 + wave = math.cos((x - mid) / span * (math.pi / 2)) + h_grow = max( + h_grow, + int( + wave * max_h + + rnd.randint(-1, 2) + + (1 if x % 3 == 0 else 0) + ), + ) + + if h_grow > 0: + # 铜锈从底部根部 FING_Y1 往上爬 + for dy in range(h_grow + 1): + y = FING_Y1 - dy + if y < FING_Y0: + continue + # 锈壳中心粉绿 'S',主体 'G',深根 'g2' + if dy == h_grow: + col = "S" if rnd.random() < 0.4 else "G" + elif dy > h_grow // 2: + col = ( + "G" + if rnd.random() < 0.7 + else "S" + if rnd.random() < 0.5 + else "g2" + ) + else: + col = "g2" if rnd.random() < 0.8 else "c" + c.put(x, y, col) + + # 少量铜锈蔓延到相邻缝隙 + if (x - x0) % 4 == 2 and rnd.random() < 0.65: + c.put(x + 1, FING_Y1 - (h_grow // 2), "g2") + + return c + + +def brk_scratch(): + """6. 挡板划痕与凹坑:斜向金属切划痕(亮边+暗槽)与冲压碰伤凹坑。""" + c = _new() + + # 细划痕 1:贯穿上部金属区(斜向上提) + scratch1 = [ + (5, 18, "h"), + (6, 17, "w"), + (7, 16, "h"), + (8, 15, "w"), + (9, 14, "h"), + (10, 13, "l"), + (11, 12, "h"), + (12, 11, "k"), + ] + for x, y, col in scratch1: + c.put(x, y, col) + c.put(x, y + 1, "k") # 划痕背光刻沟 + + # 细划痕 2:接口 1 与 2 之间的斜割痕 + scratch2 = [ + (7, 31, "w"), + (8, 32, "h"), + (9, 32, "k"), + (10, 33, "h"), + (11, 33, "w"), + (12, 34, "h"), + (13, 35, "k"), + (14, 35, "h"), + (15, 36, "w"), + ] + for x, y, col in scratch2: + c.put(x, y, col) + c.put(x, y - 1, "d") + + # 细划痕 3:接口 2 与 3 之间十字交叉滑刀 + cross1 = [ + (6, 51, "h"), + (7, 52, "w"), + (8, 52, "h"), + (9, 53, "h"), + (10, 54, "w"), + (11, 54, "k"), + ] + cross2 = [ + (6, 54, "w"), + (7, 53, "h"), + (8, 53, "k"), + (9, 52, "h"), + (10, 51, "w"), + (11, 51, "h"), + ] + for x, y, col in cross1: + c.put(x, y, col) + for x, y, col in cross2: + c.put(x, y, col) + + # 细划痕 4:底部螺丝附近的起子滑刀伤 + slip = [ + (8, 103, "k"), + (9, 104, "w"), + (10, 104, "h"), + (11, 105, "w"), + (12, 105, "h"), + (13, 105, "k"), + (14, 106, "w"), + (15, 106, "h"), + ] + for x, y, col in slip: + c.put(x, y, col) + c.put(x, y + 1, "k") + + # 冲压小凹坑(小落伤,凹陷光影:左上暗槽、右下挤压高光圈) + pits = ((14, 22), (8, 72), (16, 75)) + for px, py in pits: + c.put(px, py, "k") + c.put(px + 1, py, "d") + c.put(px, py + 1, "d") + c.put(px + 1, py + 1, "w") + c.put(px + 2, py + 1, "h") + + return c + + +def brk_port(): + """7. 挡板接口数量不对:第三个接口被粗糙铁皮焊死/堵死,带焊渣点与开孔被封死。""" + c = _new() + y0, y1 = 56, 69 + + # 盖上一整块粗糙铁皮盲板封死 + c.rect(5, y0 - 1, 18, y1 + 1, "d") + c.rect(6, y0, 17, y1, "m") + + # 盲板拉丝与表面凹凸 + for x in range(6, 18): + for y in range(y0, y1 + 1): + if (x * 3 + y * 7) % 5 == 0: + c.put(x, y, "b") + elif (x + y) % 4 == 0: + c.put(x, y, "d") + + # 边缘粗糙焊缝与接合处阴影黑线 + for y in range(y0 - 1, y1 + 2): + c.put(5, y, "n") + c.put(18, y, "k") + for x in range(5, 19): + c.put(x, y0 - 1, "n") + c.put(x, y1 + 1, "k") + + # 两处粗糙固定冲压铆钉/点焊斑点 + for ry in (y0 + 2, y1 - 3): + c.rect(10, ry, 13, ry + 2, "k") + c.put(11, ry + 1, "b") + c.put(12, ry + 1, "h") + c.put(10, ry, "d") + + # 焊渣与高温变色痕(铜黄/焦色斑点) + weld_slag = [ + (5, y0 + 1, "e"), + (6, y0 + 1, "q"), + (17, y0 + 4, "e"), + (18, y0 + 5, "c"), + (6, y1 - 1, "q"), + (5, y1, "e"), + (18, y1 - 2, "c"), + ] + for sx, sy, scol in weld_slag: + c.put(sx, sy, scol) + + return c + + +def shroud_chip(): + """8. 散热罩磕碰/掉漆:外罩棱角撞击凹瘪、掉漆露出底铝银光与发散暗裂纹。""" + c = _new() + + # 1) 顶部主磕碰坑(x=80~90 处受剧烈撞击) + # 撞入深凹坑 + c.rect(81, 14, 88, 16, "k") + c.rect(82, 14, 87, 15, "n") + # 露出的底漆生铝金属高光反光 + c.rect(83, 16, 86, 17, "w") + c.put(82, 16, "h") + c.put(87, 16, "l") + # 漆皮外卷毛边 + for kx in range(80, 90): + c.put(kx, 13, "h" if kx % 2 == 0 else "l") + c.put(kx, 17, "k" if kx % 2 == 0 else "d") + # 撞击点向下延伸出的塑料/金属外壳发丝状应力裂纹 + crack1 = [ + (84, 18, "n"), + (84, 19, "k"), + (83, 20, "n"), + (83, 21, "k"), + (82, 22, "n"), + (81, 23, "k"), + (81, 24, "n"), + ] + for cx, cy, col in crack1: + c.put(cx, cy, col) + c.put(cx + 1, cy, "h") # 裂缝一侧高光 + + # 2) 中筋(两风扇之间)被工具磕掉漆皮 + c.rect(104, 46, 107, 51, "k") + c.rect(105, 47, 106, 49, "w") # 露底生铝 + c.put(106, 50, "h") + c.put(104, 45, "h") + c.put(107, 52, "d") + + # 3) 右上角倒角处擦碰 + c.rect(179, 17, 183, 20, "k") + c.put(180, 18, "w") + c.put(181, 19, "h") + c.put(182, 20, "l") + c.put(178, 16, "h") + + # 4) 下部边缘刮蹭掉漆痕 + c.rect(34, 93, 44, 94, "k") + for gx in range(35, 44, 2): + c.put(gx, 93, "w") + c.put(gx + 1, 94, "l") + + return c + + +# ============================================================================== +# 背面 Case +# ============================================================================== + + +def print_overlay(model_text, style="normal"): + """9. 型号丝印: + - normal: 激光蚀刻(深色凹槽衬底+规整高光金属字) + - skew: 字歪重印(各字上下抖动、墨色不均、重影移位、边缘溢墨) + - stamp: 盖章式补印(原字发暗底层+倾斜补印红框印章层覆盖) + """ + c = _new() + scale = 2 + # 丝印凹槽居中计算 + total_w = len(model_text) * (5 + 1) * scale + x_start = max(42, 38 + (136 - total_w) // 2) + y_start = 31 + + if style == "normal": + # 先打一层蚀刻内凹深色边缘刻痕 + text57( + c, + x_start + 1, + y_start + 1, + model_text, + "k", + scale=scale, + skew=False, + gap=1, + ) + # 精致激光银白字 + text57( + c, + x_start, + y_start, + model_text, + "h", + scale=scale, + skew=False, + gap=1, + ) + + elif style == "skew": + cur_x = x_start + rnd = random.Random(309) + jitters = [0, 2, -1, 1, -2, 2, 0, 1] + + # 1) 先打一层失准的底墨重影(偏移) + for i, ch in enumerate(model_text): + dy = jitters[i % len(jitters)] + # 偏色与残墨 + text57( + c, + cur_x + 1, + y_start + dy + 1, + ch, + "d", + scale=scale, + skew=False, + gap=1, + ) + cur_x += (5 + 1) * scale + (1 if i % 3 == 0 else 0) + + # 2) 正式墨迹(每字高度不齐、颜色深浅不同) + cur_x = x_start + ink_colors = ["h", "l", "b", "h", "m", "l"] + for i, ch in enumerate(model_text): + dy = jitters[i % len(jitters)] + col = ink_colors[i % len(ink_colors)] + text57( + c, + cur_x, + y_start + dy, + ch, + col, + scale=scale, + skew=False, + gap=1, + ) + + # 边缘溢墨斑点 (Ink bleed) + if ch != " ": + for _ in range(4): + bx = cur_x + rnd.randint(-1, 10) + by = y_start + dy + rnd.randint(-1, 14) + if 36 <= bx <= 178 and 26 <= by <= 50: + c.put(bx, by, "x" if rnd.random() < 0.5 else "d") + + cur_x += (5 + 1) * scale + (1 if i % 3 == 0 else 0) + + elif style == "stamp": + # 1) 底层被磨掉/发暗的原型号痕迹(原先低配型号残影) + orig_text = "RZX 50" if "80" in model_text else "PMD 60" + text57(c, x_start + 4, y_start + 1, orig_text, "z", scale=scale, gap=1) + text57(c, x_start + 5, y_start + 2, orig_text, "k", scale=scale, gap=1) + + # 2) 盖章边框(红章边框,微倾斜) + box_x0 = x_start - 4 + box_y0 = y_start - 3 + box_x1 = min(176, x_start + total_w + 4) + box_y1 = y_start + 17 + c.rect(box_x0, box_y0, box_x1, box_y0 + 1, "R") + c.rect(box_x0, box_y1 - 1, box_x1, box_y1, "R") + c.rect(box_x0, box_y0, box_x0 + 1, box_y1, "R") + c.rect(box_x1 - 1, box_y0, box_x1, box_y1, "R") + + # 章角溢印与盖印残红 + c.put(box_x0 - 1, box_y0, "r2") + c.put(box_x1 + 1, box_y1, "r2") + c.put(box_x0 + 1, box_y1 + 1, "r2") + + # 3) 盖印文字(红色印油,因印泥压力不均带斑驳漏白) + text57( + c, + x_start, + y_start, + model_text, + "R", + scale=scale, + skew=False, + gap=1, + ) + rnd = random.Random(409) + for y in range(box_y0, box_y1 + 1): + for x in range(box_x0, box_x1 + 1): + if c.px[y][x] == "R" and rnd.random() < 0.22: + c.put(x, y, "r2" if rnd.random() < 0.6 else "w") + + return c + + +def print_skew(model_text="RZX 80Ti"): + return print_overlay(model_text, "skew") + + +def print_stamp(model_text="RZX 80Ti"): + return print_overlay(model_text, "stamp") + + +def print_normal(model_text="RZX 80Ti"): + return print_overlay(model_text, "normal") + + +def sticker_hand(): + """10. 序列号贴纸:白胶条盖住原条码,上面粗劣手写伪造序列号。""" + c = _new() + + # 白胶带打底覆盖条码区域 (x=116..168, y=68..86) + c.rect(116, 68, 168, 86, "w") + # 胶带边缘立体层感与受光边 + c.rect(116, 68, 168, 68, "h") + c.rect(116, 86, 168, 86, "l") + c.rect(116, 68, 116, 86, "h") + c.rect(168, 68, 168, 86, "l") + + # 手写体字符 "SN:8942-X"(手写黑色笔画,带运笔粗细与倾斜波动) + strokes = [ + # S + (120, 72), + (121, 72), + (122, 72), + (119, 73), + (120, 74), + (121, 75), + (122, 76), + (119, 77), + (120, 78), + (121, 78), + # N + (125, 78), + (125, 77), + (125, 76), + (125, 75), + (125, 74), + (125, 73), + (125, 72), + (126, 74), + (127, 75), + (128, 76), + (129, 77), + (129, 72), + (129, 73), + (129, 74), + (129, 75), + (129, 76), + (129, 78), + # : + (132, 74), + (132, 77), + # 8 + (136, 72), + (137, 72), + (135, 73), + (138, 73), + (136, 75), + (137, 75), + (135, 76), + (138, 76), + (135, 77), + (138, 77), + (136, 78), + (137, 78), + # 9 + (142, 72), + (143, 72), + (141, 73), + (144, 73), + (141, 74), + (144, 74), + (142, 75), + (143, 75), + (144, 75), + (144, 76), + (144, 77), + (143, 78), + (142, 78), + # 4 + (147, 72), + (147, 73), + (147, 74), + (147, 75), + (148, 75), + (149, 75), + (150, 75), + (150, 72), + (150, 73), + (150, 74), + (150, 76), + (150, 77), + (150, 78), + # 2 + (153, 72), + (154, 72), + (155, 73), + (154, 74), + (153, 75), + (153, 76), + (153, 77), + (153, 78), + (154, 78), + (155, 78), + (156, 78), + # - + (158, 75), + (159, 75), + (160, 75), + # X + (162, 72), + (163, 73), + (164, 74), + (165, 76), + (166, 77), + (166, 78), + (166, 72), + (165, 73), + (164, 75), + (163, 77), + (162, 78), + ] + for x, y in strokes: + c.put(x, y, "O") + c.put(x + 1, y, "O") # 笔尖圆珠粗细 + c.put(x, y + 1, "k") # 圆珠笔纸面压痕阴影 + + return c + + +def sticker_scratch(): + """10. 序列号贴纸:条码被硬物反复恶意刮花破坏,白纸撕破、划痕露底。""" + c = _new() + + # 横向主刮痕(钥匙/一字起深划过,条码截断) + for x in range(116, 168): + c.put(x, 75, "w") + c.put(x, 76, "w") + c.put(x, 77, "h" if x % 3 == 0 else "l") + c.put(x, 78, "d" if x % 2 == 0 else "m") + + # 两道斜向猛烈刮叉痕 + slash1 = [ + (120, 70), + (123, 72), + (126, 74), + (130, 77), + (134, 80), + (138, 82), + (142, 84), + (145, 86), + ] + for x, y in slash1: + c.rect(x - 1, y - 1, x + 1, y, "w") + c.put(x + 2, y, "d") + c.put(x - 1, y + 1, "k") + + slash2 = [ + (160, 71), + (157, 73), + (153, 76), + (149, 79), + (145, 82), + (142, 84), + (138, 86), + ] + for x, y in slash2: + c.rect(x - 1, y - 1, x + 1, y, "w") + c.put(x + 1, y + 1, "k") + c.put(x - 2, y, "l") + + # 纸屑翻边卷毛 (Torn paper fibers) + for fx, fy in ( + (128, 74), + (132, 78), + (146, 83), + (152, 75), + (162, 74), + (121, 77), + ): + c.rect(fx, fy, fx + 1, fy + 1, "h") + c.put(fx, fy - 1, "w") + + return c + + +def sticker_torn(): + """10. 序列号贴纸:贴纸被撕掉一大半,留撕破犬牙撕口与发黄恶心残胶。""" + c = _new() + rnd = random.Random(510) + + # 撕裂区域:x=120..172, y=64..100(右侧大半被撕走,露出背板石墨底) + for y in range(64, 101): + # 锯齿状撕裂边界 x_tear + x_tear = 120 + int(3 * math.sin(y * 0.45) + (y % 4)) + # 撕除暴露出的背板底色(重现 backplate 拉丝暗底) + for x in range(x_tear, 173): + c.put(x, y, "d" if y % 2 else "m" if (x // 3) % 4 else "d") + + # 犬牙差互的白纸撕口边缘 (White torn paper fringe) + c.put(x_tear - 2, y, "w") + c.put(x_tear - 1, y, "h") + c.put(x_tear, y, "l") + c.put(x_tear + 1, y, "d") + + # 背板上残留的大片发干、粘着灰尘的胶痕(残胶:'e', 'q', 'm', 'd', 'k') + glue_patches = [ + (126, 68, 142, 82), + (148, 72, 168, 92), + (132, 84, 150, 96), + ] + for gx0, gy0, gx1, gy1 in glue_patches: + for gy in range(gy0, gy1 + 1): + for gx in range(gx0, gx1 + 1): + val = rnd.random() + if val < 0.55: + c.put( + gx, + gy, + ( + "e" + if val < 0.20 + else "q" + if val < 0.35 + else "m" + if val < 0.48 + else "k" + ), + ) + + # 没撕干净的局部纸片孤岛 + c.rect(156, 82, 165, 87, "w") + c.rect(157, 83, 164, 86, "h") + c.put(166, 88, "d") + + return c + + +def seal_missing(): + """11. 封条缺失:防拆封条被撕除,留边缘红碎纸片、底层 honeycomb/VOID 残胶与刮痕。""" + c = _new() + # 封条原本位置: x=174..182, y=60..104 + + # 露出底板金属 + for y in range(60, 105): + for x in range(174, 183): + c.put(x, y, "d" if y % 2 else "m" if (x // 3) % 4 else "d") + + # 顶部和底部断裂未撕净的红色封条碎片 (Torn seal scraps) + c.rect(174, 60, 182, 63, "R") + c.put(174, 64, "R") + c.put(175, 64, "r2") + c.put(178, 64, "R") + c.put(181, 64, "r2") + + c.rect(174, 102, 182, 104, "R") + c.put(176, 101, "R") + c.put(177, 101, "r2") + c.put(180, 101, "R") + + # 撕裂防伪胶转移层遗留的网格残胶斑(VOID 格状残留胶质) + for y in range(65, 101): + for x in range(174, 183): + # 规则点阵中带撕损 + if (x + y) % 3 == 0: + c.put(x, y, "r2" if (x * y) % 2 == 0 else "e") + elif (x * 2 + y) % 5 == 0: + c.put(x, y, "m") + + # 指甲抠挖清理残胶的竖划痕 + for y in range(70, 95): + c.put(177, y, "h" if y % 3 == 0 else "k") + c.put(180, y, "k" if y % 2 == 0 else "d") + + return c + + +def seal_reglued(): + """11. 封条被重新粘过:封条贴歪、角落起翘卷边(带投影)、内含明显鼓起气泡与折痕。""" + c = _new() + + # 封条重贴发生偏斜(整体往左歪 1px,并露出右边缘的旧胶印) + # 旧胶缝留痕 + for y in range(60, 105): + c.put(182, y, "e" if y % 2 else "d") + + # 重新贴上的红封条(略微偏斜移位) + c.rect(173, 62, 181, 103, "R") + c.rect(173, 62, 174, 103, "r2") + c.rect(180, 62, 181, 103, "r2") + + # 上端角落起翘卷边 (Curled Dog-ear corner) + # 起翘角露出白色背胶与内卷高光 + c.put(179, 61, "w") + c.put(180, 60, "w") + c.put(181, 60, "h") + c.put(179, 62, "h") + c.put(180, 61, "l") + # 翘起卷角下方投下的深暗阴影 + c.put(177, 62, "n") + c.put(178, 62, "k") + c.put(178, 63, "n") + + # 起泡 1:中间圆形隆起气泡 (Air bubble 1) + bubble1 = [ + (176, 73, "l"), + (177, 73, "w"), + (178, 73, "h"), + (175, 74, "l"), + (176, 74, "R"), + (177, 74, "w"), + (178, 74, "R"), + (179, 74, "r2"), + (175, 75, "h"), + (176, 75, "R"), + (177, 75, "R"), + (178, 75, "r2"), + (179, 75, "k"), + (176, 76, "r2"), + (177, 76, "k"), + (178, 76, "r2"), + ] + for x, y, col in bubble1: + c.put(x, y, col) + + # 起泡 2:下部条状长气泡 (Air bubble 2) + bubble2 = [ + (175, 87, "w"), + (176, 87, "l"), + (175, 88, "h"), + (176, 88, "R"), + (177, 88, "r2"), + (175, 89, "h"), + (176, 89, "R"), + (177, 89, "k"), + (176, 90, "r2"), + ] + for x, y, col in bubble2: + c.put(x, y, col) + + # 被撕下时产生的死褶横折白印 (Crease stress marks) + for x in range(173, 182): + c.put(x, 81, "w" if x % 2 == 0 else "h") + c.put(x, 82, "r2") + c.put(x, 95, "h" if x % 3 == 0 else "w") + c.put(x, 96, "r2") + + return c + + +def screw_opened(): + """12. 背板螺丝被拆过: + - (174, 94) 右下螺丝十字孔严重拧花/滑丝,溢出金属毛刺,起子滑出刮花背板; + - (36, 24) 左上螺丝十字槽口豁开变形磨损; + - (36, 94) 左下螺丝换成了一颗不同款的一字平头生锈旧螺丝。 + """ + c = _new() + + # -------------------------------------------------------------------------- + # 1. 右下螺丝 (174, 94):十字彻底滑丝拧烂 (Stripped screw) + 滑刀大划痕 + # -------------------------------------------------------------------------- + sx, sy = 174, 94 + # 彻底磨平滑丝的中心烂圆坑 + c.rect(sx - 2, sy - 2, sx + 2, sy + 2, "k") + c.rect(sx - 1, sy - 1, sx + 1, sy + 1, "n") + # 被起子强行旋转挤压出来的银白色金属毛刺边缘 + c.put(sx - 2, sy - 1, "w") + c.put(sx - 1, sy - 2, "w") + c.put(sx + 2, sy, "h") + c.put(sx, sy + 2, "h") + c.put(sx + 1, sy + 1, "w") + c.put(sx - 2, sy + 2, "l") + # 螺丝刀猛烈滑出拧花槽、在背板上划出的一道深深弧形刀痕 + driver_slip = [ + (sx - 2, sy - 2, "w"), + (sx - 3, sy - 3, "h"), + (sx - 4, sy - 4, "w"), + (sx - 5, sy - 4, "k"), + (sx - 6, sy - 5, "w"), + (sx - 7, sy - 5, "h"), + (sx - 8, sy - 5, "k"), + (sx - 9, sy - 6, "h"), + (sx - 10, sy - 6, "w"), + (sx - 11, sy - 6, "k"), + ] + for px, py, pcol in driver_slip: + c.put(px, py, pcol) + c.put(px, py + 1, "k") # 划痕阴影 + + # -------------------------------------------------------------------------- + # 2. 左上螺丝 (36, 24):起子咬合磨损划口,槽角崩损 + # -------------------------------------------------------------------------- + tx, ty = 36, 24 + c.rect(tx - 1, ty - 1, tx + 1, ty + 1, "k") + c.put(tx, ty, "n") + c.put(tx - 2, ty, "w") # 槽口外翻高光 + c.put(tx + 2, ty, "h") + c.put(tx, ty - 2, "w") + c.put(tx, ty + 2, "k") + c.put(tx - 1, ty - 1, "l") + c.put(tx + 1, ty + 1, "d") + + # -------------------------------------------------------------------------- + # 3. 左下螺丝 (36, 94):被换成了一颗规格不一致的一字平头暗铜色旧螺丝 + # -------------------------------------------------------------------------- + lx, ly = 36, 94 + # 重新画一个完全不同的圆头一字锈螺丝(基调为暗铜色 'q'/'e') + c.rect(lx - 3, ly - 3, lx + 3, ly + 3, "e") + c.rect(lx - 3, ly - 3, lx - 1, ly - 3, "q") + c.rect(lx - 2, ly - 2, lx + 2, ly + 2, "q") + c.rect(lx + 2, ly + 2, lx + 3, ly + 3, "c") + # 一字槽(水平横槽,而不是十字孔) + c.rect(lx - 2, ly, lx + 2, ly, "n") + c.rect(lx - 2, ly - 1, lx + 2, ly - 1, "h") # 一字边缘受光 + c.rect(lx - 2, ly + 1, lx + 2, ly + 1, "c") # 一字边缘阴影 + + return c + + +# ============================================================================== +# 导出字典 +# ============================================================================== + +CASES = { + # 正面 + "gpu_big_ov_fan_dust1": fan_dust1, + "gpu_big_ov_fan_dust2": fan_dust2, + "gpu_big_ov_fan_chip": fan_chip, + "gpu_big_ov_fan_oil": fan_oil, + "gpu_big_ov_fin_dim": fin_dim, + "gpu_big_ov_fin_oxide": fin_oxide, + "gpu_big_ov_brk_scratch": brk_scratch, + "gpu_big_ov_brk_port": brk_port, + "gpu_big_ov_shroud_chip": shroud_chip, + # 背面 + "gpu_big_ov_print_skew": print_skew, + "gpu_big_ov_print_stamp": print_stamp, + "gpu_big_ov_print_normal": print_normal, + "gpu_big_ov_sticker_hand": sticker_hand, + "gpu_big_ov_sticker_scratch": sticker_scratch, + "gpu_big_ov_sticker_torn": sticker_torn, + "gpu_big_ov_seal_missing": seal_missing, + "gpu_big_ov_seal_reglued": seal_reglued, + "gpu_big_ov_screw_opened": screw_opened, +} + +__all__ = [ + "CASES", + "print_overlay", + "fan_dust1", + "fan_dust2", + "fan_chip", + "fan_oil", + "fin_dim", + "fin_oxide", + "brk_scratch", + "brk_port", + "shroud_chip", + "print_skew", + "print_stamp", + "print_normal", + "sticker_hand", + "sticker_scratch", + "sticker_torn", + "seal_missing", + "seal_reglued", + "screw_opened", +] diff --git a/art/sprites.py b/art/sprites.py index 01c3f99..f866b90 100644 --- a/art/sprites.py +++ b/art/sprites.py @@ -568,7 +568,13 @@ if __name__ == '__main__': canvas.png(os.path.join(out, name + '.png')) for name, make in OVERLAYS.items(): make().png(os.path.join(out, name + '.png')) - import big - for name, make in {**big.BIG, **big.BIG_OV}.items(): + import big, big_cases + for name, make in big.BIG.items(): make().png(os.path.join(out, name + '.png')) + for name, make in big_cases.CASES.items(): + if not name.startswith('gpu_big_ov_print_'): + make().png(os.path.join(out, name + '.png')) + for m in MODELS: + for style in ('normal', 'skew', 'stamp'): + big_cases.print_overlay(m, style).png(os.path.join(out, 'gpu_big_ov_print_%s_%s.png' % (style, key(m)))) print(out) diff --git a/src/Decentralized.Domain/CardLook.cs b/src/Decentralized.Domain/CardLook.cs index d05f80d..e4efa64 100644 --- a/src/Decentralized.Domain/CardLook.cs +++ b/src/Decentralized.Domain/CardLook.cs @@ -32,6 +32,19 @@ namespace Decentralized.Domain return new CardLook { Fan = D(0), Fingers = D(1), Bracket = D(2), Print = D(3), Sticker = D(4) }; } + // 外观维度对应卡的真实状态:价格、损耗、暴毙概率都随之变化,所以看外观就是在估价 + private static readonly double[] FanValue = { 1.00, 0.96, 0.88 }, FanWear = { 1.00, 1.10, 1.30 }, FanDeath = { 1.00, 1.00, 1.20 }; + private static readonly double[] FingerValue = { 1.00, 0.96, 0.88 }, FingerDeath = { 1.00, 1.10, 1.30 }; + + /// 外观对价值的折扣:风扇积灰 −4%、缺角 −12%;金手指发暗 −4%、氧化 −12%;挡板划痕 −2%;封条缺失(开过封)−6%。 + public double ValueFactor => FanValue[Fan] * FingerValue[Fingers] * (Bracket == 1 ? 0.98 : 1.0) * (Sticker == 2 ? 0.94 : 1.0); + + /// 每晚损耗倍数:风扇积灰散热差 ×1.1,缺角 ×1.3。 + public double WearFactor => FanWear[Fan]; + + /// 暴毙概率倍数:风扇缺角 ×1.2;金手指发暗 ×1.1、氧化 ×1.3(接触不良)。 + public double DeathFactor => FanDeath[Fan] * FingerDeath[Fingers]; + /// 只在假卡上出现的取值:玩家一旦看到,就能肯定是假的。 public bool HasFakeSign => Bracket == 2 || Print != 0 || Sticker == 1; @@ -87,8 +100,8 @@ namespace Decentralized.Domain return Math.Max(1, (long)Math.Round(spec.Price * f)); } - /// 真实价值(芯片型号 + 健康度)。 - public static long True(Unit u) => Of(u.FakeOf ?? u.Model, u.Health); + /// 真实价值(芯片型号 + 健康度 + 外观折扣)。 + public static long True(Unit u) => Math.Max(1, (long)Math.Round(Of(u.FakeOf ?? u.Model, u.Health) * u.Look.ValueFactor)); /// 标称价:贩子报的价,按标称型号算;二手卡也折旧,但只按贩子"自称"的健康度。 public static long Quoted(Unit u, double claimedHealth) => Of(u.Model, claimedHealth); diff --git a/src/Decentralized.Domain/Mining.cs b/src/Decentralized.Domain/Mining.cs index 50b3a82..0c2c8d2 100644 --- a/src/Decentralized.Domain/Mining.cs +++ b/src/Decentralized.Domain/Mining.cs @@ -103,14 +103,14 @@ namespace Decentralized.Domain public double DeathChance(ModuleBonus b) { double p = Tuning.DeathBase + Tuning.DeathWorn * Math.Pow(1 - Health / 100, 2); - return p * Label.DeathFactor * (FakeOf != null ? Tuning.FakeDeathFactor : 1) * b.Death; + return p * Label.DeathFactor * (FakeOf != null ? Tuning.FakeDeathFactor : 1) * b.Death * Look.DeathFactor; } /// 一夜的损耗与暴毙判定;返回是否在今晚暴毙。 public bool Night(ModuleBonus b, Rng rng) { if (Dead) return false; - Health = Math.Max(0, Health - Label.WearFactor * b.Wear); + Health = Math.Max(0, Health - Label.WearFactor * b.Wear * Look.WearFactor); if (rng.Chance(DeathChance(b))) { Dead = true; diff --git a/src/Decentralized/GpuInspectView.cs b/src/Decentralized/GpuInspectView.cs index 14df97e..f4499cd 100644 --- a/src/Decentralized/GpuInspectView.cs +++ b/src/Decentralized/GpuInspectView.cs @@ -58,6 +58,34 @@ namespace Decentralized }); } + /// 检视大图的叠加层。五个维度各自对应一种或几种细节,组合时再加几处同源的小细节(磕碰、开过壳的螺丝、重新粘过的封条)。 + public static List BigOverlays(GameItem item) + { + var o = new List(); + var u = Items.ToUnit(item); + if (u.Dead) return o; + var l = u.Look; + string P = "gpu_big_ov_"; + if (!Items.IsBack(item)) + { + if (l.Fan == 1) o.Add(P + (l.Fingers > 0 ? "fan_dust2" : "fan_dust1")); + if (l.Fan == 2) { o.Add(P + "fan_chip"); if (l.Fingers == 2) o.Add(P + "fan_oil"); } + if (l.Fingers == 1) o.Add(P + "fin_dim"); + if (l.Fingers == 2) o.Add(P + "fin_oxide"); + if (l.Bracket == 1) { o.Add(P + "brk_scratch"); if (l.Fan > 0) o.Add(P + "shroud_chip"); } + if (l.Bracket == 2) o.Add(P + "brk_port"); + } + else + { + string model = (l.Print == 1 && u.FakeOf != null ? u.FakeOf : u.Model).ToLowerInvariant(); + o.Add(P + "print_" + (l.Print == 2 ? "skew_" : l.Print == 1 ? "stamp_" : "normal_") + model); + if (l.Print == 2) o.Add(P + "screw_opened"); // 重印过,说明拆开过 + if (l.Sticker == 1) o.Add(P + "sticker_hand"); + if (l.Sticker == 2) o.Add(P + (l.Print != 0 ? "seal_reglued" : "seal_missing")); + } + return o; + } + private void Build(InspectionUIManager m) { root = new GameObject("_PdGpuInspection", typeof(RectTransform)).GetComponent(); @@ -92,12 +120,11 @@ namespace Decentralized { foreach (Transform c in cardRoot) Destroy(c.gameObject); var keys = new List(); - string baseKey = Items.LookKeys(item, keys); - keys.Insert(0, baseKey); - foreach (var small in keys) + string baseKey = Items.LookKeys(item, keys); // 小图键名只用来取底图(品牌与正反面) + var layers = new List { "gpu_big_" + baseKey.Substring("gpu_".Length) }; + layers.AddRange(BigOverlays(item)); + foreach (var k in layers) { - // 检视用大图:键名对应小图(gpu_probidia_f → gpu_big_probidia_f,gpu_ov_fan1 → gpu_big_ov_fan1) - string k = small.StartsWith("gpu_ov_") ? "gpu_big_ov_" + small.Substring("gpu_ov_".Length) : "gpu_big_" + small.Substring("gpu_".Length); var sprite = Items.ModSprite(k); if (sprite == null) continue; var go = new GameObject(k, typeof(RectTransform), typeof(Image)); diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png deleted file mode 100644 index 21e08d2fb9f4fa6da97a02033e53a2cbd5674213..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsh6HEjv*Dd-rhRM+n^xgaxnK) z#j@n?1^SkO4Ca&OY94%0-=P9jh5%D4=6|f_x}x{b(q5lo?zczbj3Epm3^g3i>8uON zUae+WW_ROvGgku$G65lk1tdWx2rRb}NdLWn2@^uiKk}8Mv{)d@Clp$Ewr!;^O0vQ;7*KhdGE(#QeL4+GIS?@M7G@H)T3;fY^6eQ{C>gTe~ HDWM4fZGBK^ diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png deleted file mode 100644 index e8043323e864bfbfa2977d0a740b0a680c306274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsjZ$ajv*Dd-d^3v*GQ$rXoek75f%m}21X(c1}j^i@gQu+|8}?Z3m~qitDnm{r-UW| DRu(hB diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk_port.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk_port.png new file mode 100644 index 0000000000000000000000000000000000000000..697655e3b071fe4aa6b498eb7e888c22246685ad GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnemTk_SubGlLVt1Oe;3@PHo_R6k9m+yVs9Do|_a;ssXiv!QO4N@2=qrnYHY-4nv4l zyx%N&W&4oIJNY15;^)B={2Q&8tM}tbJM6G4{<_V7-y=!u*`1k&iw_TrIHT#q;bHB^` zuK&1lpMXBYmHXd5UABQK0?`d?9<*1~wYjgo_$RJ~;eZgQ&O~HsD7)d$hqwNr3#=IK v{aa$k^4`%vJ3y9YGt;3DTuokR%0KA(>$V&aKHG8193gTe~DWM4fx`1-3 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png deleted file mode 100644 index dbf02f7e0e43f02a2628d4e9400d79643e3cb9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne!SQ;=y`9x^c0i zIzwrJ2?ka~PL7G4RGYIdxa$)wVM(=Q&L-TZMV*BT<+j8-#+tC>3eV29| z{@$~6u1N;Z?ZS?0tL0X&`z5pYneO5{m!z$BS~5R9SX;`sWRJSVQ;Xz;BYhe&wf|S& z*Zs4M>o>N}pXGAitWjIH|597sv)|tO z>gVgd!%M3|i+Z2llVX(Z+mb$Q!p?xiz2?``stzoBlHu|CeBQi*e5kH*D>t;=aYS}9UZ5pPdTj@z4~C%|&D z;d8U`dS2;kCq!=<>E4m5%9;A|g`?8*7ODL0_uqbfXQS}%T8Zzg&jss#ev{dfZm`Ts z;Sg;Cud7d4pHM2`jHG`%)_P@yX}b4->B4Gn8<+asp4`Qg6u50={Nr{1l<^w92`x1m?x^{0Q`_b*#?g&|V~ fEoWipZkSYm!fxT-8|;d2Kngrv{an^LB{Ts5Rpa6? diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png deleted file mode 100644 index 9933c6a6a3707c48a684ee19ccee44e9e9aa59b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsaKvZjv*Dd-rjNKYB1noIq=8% z!?XXjF8`M*a47BMx-_>j&Zce6)mu@lK(+WmO62sn0j!IdFYr!Pv|?~_s9|7XR1{!1 z!=M0!0-_Cu-?CST1hYTL`|>?NaoMtqj6maF9iA#4df<|B$cO3SiV9V?8*eu3*u4Gx zGjm~q%J1)+64Vs(uBVpAa&*`>>(GFAJbY6#Lx4(Yk_@B4?It$zkhaHb!J`kTe zd2&zYpzG^iRyFF1T;n)MXg* z!@l+txBX!`>q|~?=8L1b1s={;-~V&|!((#F0(|pocjYUt?@oNEUd8fiEo(^6jr9&% zM?X9c(EoGpxk{bPr?2fd3Rmdxt!|xBxZ?Y?0L7$Zic=XD{5USQfe-F9LX01?tre@Z UCr{e?JOQNC)78&qol`;+04F(wl>h($ literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cefee64619159c9f313dd3abedc5c9baeff692 GIT binary patch literal 509 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneu5Ho?mH?6_c_vt3MTT zV8e@!^QO6X55M?#&^Phd(Z?a@rtxeHvia2%_4)5ko=vYE_B`yFm*ahZ{uA}w2#J3| z@7e8=&u`3lXIEROCGsGU!?)zU@TSc3mu#ya`O9WB%fB#uv2JD{d;Pi8M-c)QL1Ihx z-(~JT!0_8OB~j_%6;7TGtF3$Ard6EC?fsrnar3LU&CE$Vr&`_g^?Ij&Fn?nJPu<7K zEw5ZeU;dll@>+W4%7w2~cA5mu-LP9K$KljMKZlQndra8TLl`^1Vb@=#mcw<4U&1FZ P1F7(I^>bP0l+XkKx8u}1 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_dust2.png new file mode 100644 index 0000000000000000000000000000000000000000..32d2733c8ee312bff4172f4fd21aae126a1dfd4a GIT binary patch literal 1873 zcma)7`#%$k1Krm}CAukZc{JB&9*vO4Ji5|0>T`{}n~M_jn318`xF+%_A&p^d^IDQf zLX0I>9;*+_tA$Ht_7?}>btiq>}~wK_Wmo2m4q!#RxDi%xvi zvAhW^oX|P<^c^L-FzvRjc=Zc$+HQ_WdYQ1%h&3RtvT}MFPSP?OuNr<4Z;R-wwCJY% zH|>eY-h?wzyKWE-VgQL#ZIfMRdtES}A(89!5ec9#E!y&;RO?;?2w8VC*OJ$B3EIx7 zK=`J9n;mva;;hT~gpdw^EJV9zzXILK@~nJIt;M!_X9qA6}c% zt>&3cu5eW$!OF?mP@lD`6fU2K?&rjpHUfYzUWVD5R29hBXaA95+d--6*LVM=fS29R zKIACQH3jcgro6zLs&7=v2xWBxWoz}Cw;@361M7!RLB{kx(&@#IRY^qSd}S#|pu-1s zvPf^02cs+IBlpkb9k9&_St_Gab&ihJbxXcm`#|n?hLd{Zf)EPFDUb`RbheS?W88S z3)+R|`HD6w=8(mTIySpj2Z?nX54A2fk9hdIQ&3EAda!4i(%WWv|wDBJV9vy6gPTaMiZ+Ey0SQj)JhAO|$dAWz9X1kLRm{VJWPez<> zP_M!R@{ESK)t6MyE-GrrW|$5?cIQ|Ij^gy=f}+EjAz8i{c}H1p0zHpcee&YBq1dia z`R7u%x5UC>hNlAlJ8_9^SIisb5~hBWO`2giSCm*$-UOuy7?6Nc*U5TIx`q$170>ebg51ceyR8FZj_%DM zru~pvlZR1dTRXTc?iN@F^gPM6tyz=x5yKFut8|O5TTS8iA3NJA=zpTQ|e`0Vl?>cG0y}sm}fU~_NC@3+bgt63fa!2 zz7J`NtC?zvIDkpU4`6biiCU!97iU5*@>v|CzXY_Kize`P6f@+8T!1@pqMXEuc%bsK z`ZLXO7>Hoa`uS0cvCj_bQ44v;lkhQa(@FNi*82dGZK~zylk#!?U%pa4E=0JAi%Tk; zf5z~*#{HI|k@xRP4peK}oQOuQtwJUXlModN+x+~hv?8Yecyz^k2nA#;{eV- zSCnXiwD~$GINcFsFlrV{y{`o>TU|JX&$=+z=bU>$rl@_%(!Z~)SKDsLS8Fu)Ne%99%QXo?L zsphoWb4&Kq?YrJK@wjXMU>;at-z4XdeaG=bXMrHB`1s0gEGiz{D0tBpC8YV{`oq#? z;b_${Z)e2qYlBY*Y@E!-6rFR(@74N1v9YH;q^W)4nfo`o;V+pJpOQIAb)^hXu89gfp1V*b&A ztv~l2cW`UN`IB!QVGRB;(kKW;(taJ2_Lgf9kh}fkY>P!bJ6Z-i@O-|rRnqW5q#Y;G z3o)IRp&zd$j5R}fcC?A63J8qS<$9CePW$>=Q1mDeE=c;%-cDF~$C#-Q2=zet%%E8@ znXHB%f~yhKkHaOUJqwoZvAzABCW)_0yRKSFO8)B+{r>?gwz$H1({xQSGVFh)D=-AK J-r+{de*xWpjdTD2 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_oil.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan_oil.png new file mode 100644 index 0000000000000000000000000000000000000000..4e37fdb751c5de1e562bbefbb4a747d2dbd019a2 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnea3!ori&arWLjnyNbyaqmfX3)#EDNu_3`&58ReTp{<|l)r_2KC#}CXb&JzbWY%eFW@W>rwP zTzc#Lx~Wp9dxiahO3iO3t$bT!du!)CSCEwEj_@p<@P$QQJGX34_TKpMbJ3*WRZIVd zZ`|fkI4^$!!ZnICNh>7gzNcx3l`#_{J?$87pvTg?Cd*edPJ|MTh9 z+vexj?c_heylUq8Z#nk0d-)G=$5_vQd$aD-{v|Av9E3cWJQX-q8dW9`!C?WqSh|8S X&O9wleMZs~ko!Gd{an^LB{Ts5qq9Z} diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png deleted file mode 100644 index 04de9f5c6589b54149fdfb9696e128503e743c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneE0M~0oDN5 zr%Rm+IQ$N1T82w*&RF1hW$o!{TPm8)GqPQ7uB)GPG->b8Z@fV5)CCWw|N4D@|GxUa ze}0~qzrX+Azh8fU*;wxX|Lf1z|CML1n?3&+|9eUDzHRlgpa1T<*Z;TfT-m$s+^BkZ`+bo79 z>{F#uq!`{GpK0}>?B8bLxyP;R^JR^4=fBIBYIy$FpZVRNeXKnte}f$|WuM>qpELin z-7>~`R$nT4*V*9`m}TD{>EPVKB1& ze|#-t(ACse0k@fFDE*sucst*Q5yCyNJ<^M#jJ7&uM#(rE3 zD{Z$i-fFtOnEgOWVzifW>AJAc8A=ISo0q=bet&J(Cf!q)ekuDtTzTrFC)bsrSt}3c zr9Sg#zO|+Hw7{hXFXL<1yFzN z5yR-Kt3p>@`uBFPr}xHNO1pGV1xx{vxxfCrD8JonCAZBn4prS|lv!=KJ+$-E zqMzH6w;c0zZPq=Sq5o^!l%&;vrOipQF{`xolAM@&a VUyM&LV!sEu2ee@cC z>}x5f==ay%--|!h*{^z^C1d@AzoPf9J+0jm_xj>*SIg7+=d2n3?P|KM|0iqjUS*fp zi@$UiO}jtmKTksct?T-yBI`c-KKjH7<#pL5<|`^xff zAK$@G-Zg9m$KSvIeoivs$)8K}7~cf`{d tp8KX9P`Uoy>c!3*YNpi)g92*ZH}09Mt9JhsIS>xwdb;|#taD0e0sxuGsNnzr literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin_oxide.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin_oxide.png new file mode 100644 index 0000000000000000000000000000000000000000..abe8e800a2c2eaf81218dbe3d68295af75dabae5 GIT binary patch literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnei8pET9S@Po@>8!FAr!0bwSMKKJrgTb9W ztG??@;m3EXwfDNM7+=)}+GIE@{n&NJl2?7!S&fIc_txyM)mtwc{lEClwU+hL1zRUZ zTR#c6Sa&t$ZRwAiBayQhN}Z0U`?j)M*WH~U^}wP&Zt3GIEkC$qH|$GU!6_5FZ+qY0 z6T-^%`^*el4K_*|x=pwG_u}7Xp>=jF&)!d%AHFVvr!?v+-~8+M@7?=n`RIt1eCsr+ z8B9CQ?oB%_yX1P|CpR70iSrCMR&h?SelnFy@lmw(j~71o*G0d%?O(@s;`ilux~4kk zS*6ci*gG-Wy(ph$zUYIkOfj!J&d&<_`ul62#aDIpiZzdSg$wMQ`LyZ7suF{`y4~R`_gAl}y|4TIb<2yp=Y8KjUGB*3;@2^=VLhwG`tPsw zzH&@<|L@ay?w2ui@zuOrmAo!p{A^NpNb-y2YeXcObjqxnBBBS_GB9OlNTy8UOtHC os@bOC#(K4TzIrk+9o;w>e{}n!<{F_-e?Y0q)78&qol`;+0Aipv3IG5A literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz470.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz470.png new file mode 100644 index 0000000000000000000000000000000000000000..23d18e1b3ec03cf0973dbc69038d285d76b8b2cc GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne_1m^vdsxxe$x!74;!$1`LpItc=(pTH)}6`O!+$7 z)=rGO;r;sgd()Nv?bWxMx2A6M@#FTq4fi<%cX>&EUh{TiZAsHsp9>!Qj~8y=C*IBO zaQ^+`x5|tHFU^1N6=0}-eedtw)Wy~R=7~O8bN`y|LM2xT?lnM zf9lUgh816yomh2f}Hz)GztGk z?!MK&i_bSaQ2epV&u-Sw?Ow6_w=sQXd2ymRVhh)om1io$L%kRR=5j2Z`e0ptqmkOX z!ao;Zi7`F+)Kl<%yTjuDKCAx+-|gQ1ukNd_-`XmZWENtL&nDLA R$IS%k@pScbS?83{1OU1orzHRY literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz580.png new file mode 100644 index 0000000000000000000000000000000000000000..2a440bad2b18025786b630505872060b5b25d268 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneZ={xtN%C86C9p_8k=J{nR)x)yBQ3NzQ4Z<6s(D4n8*C+g~cqx>fG;d7c*MyzV?4({{7wc zx6kKPvm{7c+TW`CR(kvM=KtbM0#X-#OO_wq?QY62%}IyXq0H_4y1%Rq+rt~rrG0sG zW`6DTjN9(NZ*sd-%Q6ZyXkMLjlX+znYt>g50S3O+hVEBq-ZcL2!Qi&q;i5VV(*!Ar z)$9RVR|VHDf6yJ@bpF+o&1wH$h~LR#sPZ>rRM>JY&a@!x`qx_a1vUc8*{@H<&Grd> zF8fxn;mfUEyRN5wy(d@Q$Z`Gg;^)f0%hPK3e}q(H2?gSXwB($mYb#bvlKBJD Jvd$@?2>_b*p#=Z{ literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz6800.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rz6800.png new file mode 100644 index 0000000000000000000000000000000000000000..cf272a81b238c3a8a7b82041697648dbb3d0e3c7 GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnefHgor zHKsb5|KVN(Js+M-@8v-`r>Z%*AG6Q$V3(}g3DkxS6tq15ym89547=^|B{CO3{?k7H zMEF73UVUBRguOtKoqrcUe?2#S66c41jlt2Yn4WFA|MM32v)?~nCtrOQ^!Ux(^h2B% zKK%{+`NE?5xgn#Oc4hyc_2MP(*87_Da~fQkdx&L0wD^jUg^Q=|+4}p7W!+ngV(}lp zEY?=~-D17xbH)p&AQV^HiuTkZPn?<=>i7T)W8<=M)mE~_mnxCA4eK6 zMxFb9%>8|^^|_lLJsMK(>}&eg^Sokyps>~V>&wjKI14nGwA>PkZwJ@>AzIJe7P_q_dUrrh4@KDVRHSb~LUA%TyK XC5MfrU#y%3iYf+AS3j3^P6MVck%P$ zuiw^vJ};aVF<(CZ`^2^%JJyxW|5UdXEdKiH@!6~g@|$;9tusnn`)22#bqpC-|5}`y zr}`^yPbI?{lM7KlWf?zoeRpDLk$PeIcwTkSwL1%R_7|d$D&igJc4 z^MV-+OwI1^wc29Eu&9{Dr)joimDy+a*C*=?^H^_OE#_iyTCKX7_xb*HMw|@0co%Nn zHR&$*mPLy5=BsatnyTB+;L*Q!{#NmflKlR?4l)zopr0CD-LeE@qJ~9y6v}eoqGaRc_^p1Eh*>QX0CUWy{dN0 z{V-eqc^3}simQ`TX8yQ6Zspu9doO*xSQq^@>hH%?#t%{gJLC0|r=8k2Jzkb!@!x5$ zW^!7D@n4AfdG+o8?RA0-?wXJHrN6s%OF`GZ=zpg5#c(A?1%_#C4qN8N&b0rvpFv>{ zcgX1rwli(!a+an13p=p%yCMUN!}WEiUYQ<>G`_x0vV;FN>#4U~XVd;gvBk~(>D?$B ztNh_} dAy%xcf~jM|Bf(u4Rttc%c)I$ztaD0e0swCatbPCh literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx80ti.png new file mode 100644 index 0000000000000000000000000000000000000000..a65824e9dffba1053506f2646932ae33ffb11ee1 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne_Z`-=<{=4v3>c6VL z{D^$(e!l$6AB#wanz|a>YPBQp>z3AS`#ZI+zwi5s{~5pUF`Tfn|EI}N_iw@8T>a*$ zx7OWGXFpISGqG^nw)L8G@0VHMx}RfR$&ixvB9c+yZF*SRw2Q0`7S8L96I7i4yE1&S z-fu2}x}jM0ks zjQO8rALL~>Zel(#_d!e4^-Wixr+b* literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_normal_rzx90.png new file mode 100644 index 0000000000000000000000000000000000000000..d9ad64a6ec60658577b265d68a2eee082b813b24 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneBV2K_GkJdbA492b$oWc*}cU-H$VP)fu-V}K=tjoqdC2?{ql1eURxLy zh8=6;+99`*`+eZTrX)7f7l zN>xIxv5V*FiTq=)*qz_F$=l#>J>PDvn}08Ecc{*O_v+78y#W8~9!yxmgLt7cpBP%0 V6kX=VX;ymhotJk8_I=05HEHlnz2vU9? zcd@p%UeEOUiEZ0N{{8y3)!(!>P*Rv}!MC4558E%A*4So=Wz3ygr2IeZ&btq@er$Xt z(D3B*&adAtx?T}(2>9~aNZtI?@?S}60uAp{j|Vb#OppIqq+_GE_Tl4+_3LGqn$6-= z<95(kaYZj+RY#EPT>+#&NS$>676z*!%IO&&$c8!K%Jb0v`_Xzy%$OirB(IqD!S+2fd~d}Rg7kR0`njxgN@xNA D|Gwz& literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz580.png new file mode 100644 index 0000000000000000000000000000000000000000..4c959d59c54b498c8d5f8517fcd5b698c8fbcbbe GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne@Z^i?!KOO(Bdx*78cxHNe$Y3u9@qXz3yj< zMG4cMJ^Q?w*3CU%pS{*L`a%13#T%E?R1?CPwxpfg-hV#lzpioK>sdu7Z_avo`QN3| z;tMP%&dyr+wCU~h@6~TJHw!E9eT!l`qU~_Y{@1O_M=USi=Cjt#h&_CM?`j8a&Bxoy zSx@w;emT0{wVg%d+x4bT*A!met-G4`>w=TgvvX{P52hbWQk}rCySXrg>B_f%OKodb zGKI|g>3uyz)gpqar9q1|TCX9?ar4uBH`z1W!y3I9=jAONi< z``h-ssm;WDEHf(Y6TU^T*zL{_Im>ayz31q59xTy8tkCwK?6T}uXARcx^Z;q`boFyt I=akR{0L$a-J^%m! literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz6800.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz6800.png new file mode 100644 index 0000000000000000000000000000000000000000..1d81cef13a0ab09d7cb71bb11f988fe750d7c5c3 GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne-%U0lW@65dDb(fak($@zXfdz#Bsj97= zGHc$$mBJ5BUwtL97LkZi7{_pduZ}IQ_d*rOp zg6|dDANntT{ZU;SvWE5URmlYD^5k-*#Sg`?XlMGvb!? zl1BMhZ#!X^=SiAhmT(3Xn=*PS*T27~yo$k9xxS?D<;TanRSrDkoN(_+&0$H_L=h9^ z|Hj%c-BvpUGCeuH^K(U=U*&&~hThc09i}k+d?TvrV3oY=uQH?AP3D>-v+CV4zrEtQP<7wSiF3n6wH@2n z*=C=$-)t0GEw&E|KcAr__j!(^!oc%{=&!@EMO>ggPIM1UX-1}RtZd}Up&-OR4I=o@yJ(d}QBCDHopYHt3ve|9*-Jel+QnAD%u|g4#<>jA7 U?~OZ~xCNxe)78&qol`;+0BtZ1a{vGU literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz7900.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rz7900.png new file mode 100644 index 0000000000000000000000000000000000000000..0a05090180f0a0adb64f7f930d04c75a59f432fc GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneC6(w~s&XDs5fUo2mCA zYpUJb^S#w?Z=B(<_HWp^O7d3BhQEL6;-jP9vvf4Co5JvsXTrDbeYX4f*M9GutLl(l zulvEdl-E9gW!KJ@p60ctj9z~~?r@I(Q*AYG>Gw`Y;RRv~b}GEGeYWFLyO@yScF8{N z+LyLh)@5pzTwu|7IhEm~kuuBoJFlPnH5749kWRiMzfP5r&A;J?;&SP;E48+<{hRdv zrctE#=HP6mC8u|;wBK7+Rj+d3z;cJR>T2It{K*zx9nSRRUz+-|Q}){r#svQ?_MTiF z@-OCrKc~$8`6dT0-_)MY@Ucg7|2!6n6#fruvj45ss?R&Kb$@ntEvLZ+wH;q$en(#W zv(&dBFQ@qVzon9k%#6Jn4*E4l$-P+IXFXlT;q8>=+r%^GN~#`cIKE)3e^YhnziS(} z&SSbdX}gK@leA;eey1g#Onz{W-+J%2TkqemnYp*=sm1yN7E`kkul#WQw=y?@Z< zU!7ImG|m5@>m|o6Y6rv|FIw-Y>YK}aMr!M}=ieV`GGj&|u_6xg|Noz1_DQVf*b36( M>FVdQ&MBb@0Bu+W9RL6T literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx50.png new file mode 100644 index 0000000000000000000000000000000000000000..e281b2d3ef731a882b0b2acdfff3c1912313ce9e GIT binary patch literal 592 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne@;Yf>x%X`r$iibA+5tnM;_R~&t(Fxwt)75={=g9E^&AdPhr=(V>W)2c zIsP)n{-5m}V=cxkPl4~&HtKacRw@n~_nIBoV-2*rwBGR3^V}fxvoer*%?@RWzPRQu0@&$F29_^ z62LmEN?UF10#EmUrmy}BHEcekTp#r{GRVB&{ok#mvL{jtwq2I~b;YaU%PUpJvR!Nu z)#v6*|BSx6Q1CayUd{`<-5#`wA6)wD{|d|hcgpfM9PPe)$JXIv_LEotc9wB&xU3a$ ze(C~q4=+xG^}238tx>-j*6!TL62NA=rL3u1+ePt$`+Jt}Zvv+Xr>mdKI;Vst0Bc+AumAu6 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx60.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx60.png new file mode 100644 index 0000000000000000000000000000000000000000..1eab1c221afbb0c10f951abaa4ca6af5fa9d4a46 GIT binary patch literal 596 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne{)>xuU4^ zyc>$XO=4ib%e-dqvwpXKVWlsmj2&LvvfpC4{_219+Mn(Fyqk67U%Q`YdOBb5>fgn6 zoCO!OE=-x3kTv0oP{NJqoLIizw6<$e@k|=cWoxYu25Y-$Uie-mlJrK-RrkR3DV~Mu z6=4Nigi_zLU%SJe5LWPP>4lx=neKl2F1NePf1=TA#!c007T*87wU~Lc+v>ZY%Rg!} gW5y4$A_r3cF({iH=g?1hH5sJG)78&qol`;+0Dvp>Gynhq literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx70.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx70.png new file mode 100644 index 0000000000000000000000000000000000000000..7a30318b277c2993e6562d8391bd88d871a9eff1 GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne0Ri_MG{W`qAs7~sg=_>7ht{Z*Iv(GS1)q{&A=Uaa%`(VE|EI6}$=VQn>sZfjhn?##Oq#gA%y{>4TL(Rcoeaxa=bejVD!5SH za54MeofG$8@x>;wW$bzo5%9Ktix&H`=2U1p3iy2wBA--fZ;r2mw(fA5%<*^+pFX@lzkIw zV1B82ZpY+JU+Npz{oIxPd|$c7PQks5J6a#@d|LdRE3Nlh+3D+#*7IOS3(+F~KXY52 Vo*sJ2VYdcIkEg4j%Q~loCIIjF@zwwU literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx80ti.png new file mode 100644 index 0000000000000000000000000000000000000000..dd69532ab933930d032e077f7dee29d384f26dd3 GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneAjM#P0=;Pt@5A8Ce6IC+5n&-`+doc$~rF)U1WFYgyJZSC=vz z(RQfXTN>2I(XhGh{o{mXejE+AUN2?jy=f|Y<3sVTCCBFrlZ+5i#SX}#ZqtKJ4wO8){{Xa>Kr*TsN z!xf#sJKuWPY}jj@u#V}9m1OmLmVTCoPJ2ZLr)_6K8?)4328PWo-I2YP>8V=s>3@5+ zT3jePZxP7R(7oDWtLWrQ49jQMyZqh%jmN->p=ym*A;Xy!QG30spZTx0(`Dac@p-;% zn)^J)b4&_$+)tPkV)uq|GZ>d%l3eh8-hYkH(^ol%uVGkve(xmTm-7mji8F}HHWh#U zA6WhG@2$nmbHf@hl{faSa@c7X!FaDybVZtK#@ehU`?sg>7K~naX}81Dz5iA*KF~4P z$P-m16ceq;)ok|5v*4_8*PWC-%YCdi^Sqk7z;!;$cAvhW1!wA%e)*hd%xTSgd_PFX z_guxx+Apf>r~az_cDI^6^>s1BdLNxt$GziLe^0$qZa(q<=Fr7g=IzvXlf)AD#0p*e YATF>{GFfoyz5tLGPgg&ebxsLQ00Ge>EC2ui literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_skew_rzx90.png new file mode 100644 index 0000000000000000000000000000000000000000..51ae82e53dbb17be83ff465aebbce7454d14110a GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnepv?CJ$UyoQ0T+$pMPwxA3MRK!J3#|=lh`j`orQ&iK-9$IWKUX zYG3~RP0gQu*=i0ijW7MYR9bw2x&5tM}J=G3glk2BOKTEyj-8@!ZO0-z_ zWoxy7qR@iZIull}TKd)_=I8W=*=9M-&$cn!ftfo}HvJHFgeV&q$*Zt*zm#jW>DcR$r$U-$Qx=SjaWY6s++($8N% q$Gb*q?Z)TTALBvsO(tkK{fA*=`;lAw{g?HCjPP{zb6Mw<&;$UP`vf%r literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz470.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz470.png new file mode 100644 index 0000000000000000000000000000000000000000..845c47fd8832288407f02e10876c7ca40f9cf9d1 GIT binary patch literal 865 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneHaVGxMy4(&=5@UZ*u2G&z-=B4fdAED3 zP4Lb1saw|ei{^#+@x9eB*}G}g{rlScb+axCvmB^D^#9$a!wYg(R<%TCn@jZ_Ie$K6 zQ$@|*$9JOMzLH3@y*Kl*aD#fz(KN=2&+jhBd&|uWIXo|{?sr^Wyzbhh?|s(q_4%i7 z`(9ap)j;iiID?*CLxiJ!-H)Q^sBCHb?x#oJZvUS9JF8aD{+)W*o5kus*6w-Lvi0r$ zx2u1}G8HUjIMOvqJ7fK#Ct|jB_p%eevn+VUsI~F=jZ+y~o0IMdJd0z@(EXyru=DuKvthkV0@Y@W1}v|_rev**x}eN>qgpoUO3`uE z`1LE!*{*sl!oVoOwjgvt+|irD4X>KQ?96XSH^h{gMyoO~U9gRmiJfrExZ3Eo;3~yi z8MUH&F79+O-J31;;t}JDv`RPU39oh?+{<*~+4J)(3iG`=7|Lg|$<8%7u6fLuF=FQ3 zNZz=8!X>3;*-!1Xop?8?{Qu=%F0?EzP& zf+ebVHvfIKR-pRb$(5(#HPhdJTb#|k$L3vd;^N$IVMlI$yQ*{1mdQZtecbKWjPt&9 zZm?;Qv}G;*vhlD*Ojq&e#nCInzlGasZhKyMZt?3Yi`1)BioQzTx%l}=wbR9FpTe+< z;rr~lJ^uM#eSOjHalGlvgYAz0xG@teu_Ax0_cLaOUv|^peXbCs$J5o%Wt~$(6970| Bf7bv2 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rz580.png new file mode 100644 index 0000000000000000000000000000000000000000..81f1a55f6fb7fa85b02b2d1bac72566b61d3c2d5 GIT binary patch literal 876 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne+)Xu;fF&l@l?hIg@~wWoH#?C(of{9QS_#VEP|?z5+?KtnLV1N)!f z{=HrQKHmQS&A9r1JM846YyN(!+0ywt|L&^K>$aW#xjp9a#Mf)?1;3TPURx>R$^S-< zvC@0P`lgaSa?E*UbLMQ>ykuqH)xW=2KkoMxv2|qnp;A+}T(?;-+FWT()$T}3q3`*e z%T~3Y`yHly<5f-dZSRK3Uz0Xpdiv?dv%AapZ(El;FaF8*-p`@OPp10o*l%MivAh4K zO8@xVb@^#~!bNO12&U{*?_>P+@$mH5W=)3gx{sfJ>ptOV?Z?{1wby4Kdwf=CyH)<4 za}}~zKNkPKbB?265{m?*op*!Gg`LM^w!Rly@X9yev!UXi#Dl^olGmeE4`ivFm@mq| zM`V}khHZQ9^{T}FzQbI8dmhURw{5HbY9yz1=CfE_lu=;!o5~Q|xrOV(jmO8n88WU) zJ+rE0CTq@`uf=cgPqlkoQ7E^;i$VFoNwtH~Szq>U{gag_@*&DV@O?4a$DE-|3%ODtNy&W z6>eKQRUmrZZKD^Hr#V~|Pp%eD@IQZlYyWD4*ra>PjK^dY&zbr(`P;F-Q0xA_>gVpD zHQWbYS*6>%%vLShnzL)xA8!WEg1hq7=d=p?zWljbl)iP9aWv~GWjCJ*p-efk_qKAC zG^JjUu(+Fb=7zmm|Kr-q*xIYX<)_!Ie$TkdvmnOo?YYZ;<6fTNNMos(6uLmdV6}eB zqt|!EBP<)z_ix=9&J7G?q|}>fPKxB0d9S~(etY8M_ccnnk>~E*uKVU4H7`N( zOX?=O{a?S@auz)Kp*wS5kN3a7KQDf}^1SUfsRe_OjQm8>`pEZLfWPEpgGYXO7GXW;PXHpB6h-8Sm}$fA&s` zue*Qbl-VkiP}Z|Qdr$4IU9WY2E#qdR=RvRa%mmNbI@IhBZTtS-&Q^Y{)3Ni9zE-{5 zu3RU!U;OfSCZqZ5+k`jQL_b}9O8Wfq_wz01Tx7m;aL1QxU0Y>$vf4{Ag#Ozrm$Y@x zTJ^4<+luywFvz^Ltyt*!VGYx|unVhppMQD#_o`BvuMCUlDLs#$x_ef3h^?EP*en+N z1b%~65vv(5c#B8hnPIo>fcDGur#IrZzka&0-f#YN&*EQN_ifkiWZ1D-@xrUDb2<)b zjhoEx-%$Ggjq6jv>R-0SJB!b6xV3l&i+u#c7Q^CuXI`$IcBZN$(7Vo!;Y(Q7H#P_D z=P&-;`?yE$LEkjTYSE=uZlX!oK0U7qYY*A(7gX&$H}1hRvHiEg4cIF-{BCp;U4DJh zGlm_dJn_7#NxydNx^hbJ{`xokPaOJfBhM_)`sgm*uw5_noY~7AAB-~Qgv>L1_Fh+T zn?rQu)tSA^)1BvK)i3s{4`aB&zT+~(iR34HZf)BBRDSKQFHtY1hAy*ZoX}pd)_v8f z{pn8G@(&uPITj~`d>44S@boLKpm{anq8oR)?mm_NmG5lU{0Aqz`YaF3eb3S#=AE{k zt^XbCsq63W-Zzf6J;fNXHZ1h1?9%sl%igB#`2R%g?#+mOw{FH-ev7G3oAO`sG8)K|6H7=`YI~>*17!Dl!MpT*;oIYn6R!&U2g)z+R!^dLtNi~@2~1x%XwjXFl+Gr z#X6;DnReyBbmtV1ZZd8&cCX@}SE*^@-LY4zq8d3WQb~RdlAX><@j&8lw6^G zr8fDJU)^pioEHq91?A1AmQyAQ<8rICKby}nQ zK5VtW(1YGHjBbslQu~knbr*i{LSTj0m76Rl!WvZ$NJp~Hie<|^+*PsPXWPEIGNvP? zKeax(l}h)1-2A!UC#6=nraitTbh}8n^Q>31A6vAqnC2L5c{A(kwX192gr%Dw-a9e6 zB)wfBou~1d+Re?^PFX+xqx^-zysH1#wT2bv&WClL<2thT>7Ed#H#=*axNQW@cF9)c zz7T%Sc=Pw>j}>NbPQnwwp00i_>zopr0Ot~(umAu6 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx50.png new file mode 100644 index 0000000000000000000000000000000000000000..a44d7af964518a97ad531178d3e9a52dbfd4c5f1 GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneF{*cF}fHz>m9;3yQw>`PNC%>P(C|COW$uQ%8-k-j(01d$aADs5> zsr~!;_4EGy+vV@?x80u?y}!Qt?x`>H@9#=IJ~#LF$MACxPgJJeKWUf!eD7aTPyRP@ zjFsLS&Npp&`<^*3#NX#u;H8w((Es&e^|xIvata;Lf4F`38-tA7tK<@|-Rf;q{`^v0V4&#unqug|%_bQ%u-rv+vKhU92_Pk+-vgrZW8fx8~o?fK~Yi-8ltLr*@jZ z=KR8-?$cnA(y99^r~cZazNjbrYD6zYcH7Ke9r84JZ{ZI!>vt=@KWSXgy5l=i*g9B6_H=Ht z%3OEtT)Ok3tDYZT$t0A9X1&*%zyfs65$&yuQ%~(}yu6<8uRo_ib0q%*s{;j7m(MZ@ zFOOLl!+GwVZGPKdSaEAE&&`}VCTR?%x$ z!#dwhWLW&`U1%KB zoFAPVF6N&7D^Xp-{pFN!{ME^^)pGl7cD;X*JpHQjl0`2L3Mcq)NJ;(^xnO-w{WJwb zh1J&=Cx_Md+m+uj=Tdrku-&na6(gMzE%0w{{NnxZ*^}K;7lZV8y85}Sb4q9e02bbe AYybcN literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx60.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx60.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c587741bafd32307b98cedfd9ac7348cd2f4de GIT binary patch literal 855 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnea&_9D=}(Fnfrem!AO8FH z*8hI}`}+C%ZPVx5$Hi~geYbyKUh1Rg-}4qf4!iyJhxYS=)0KVujDM|}`~B;BkE#TB zmM69c<5)9q%QNSN`On|7d5PrJsek`3{&ice%Wnch9q0bLm-(94MPE}6S$j9fLdd@V z>+#33q9JR)<{giD`|%xT5@*4our*!{=I`zPZav#(RcJ9$cK!PGwafSJFSWaT-TK%6 zM<2Ab3RR~$>>ds3b6AddzCJapTwdd?_2Oyu*A}NVn!RRxw93D9-rwhcE03{s zbZRlqs}Rj73C!3MRg}+kqW23qeOVy*$1$q!66gdM*Y`ru4hd)ceg zVWnx;H_ScCLi6jVK5~A2-qy!`+aCWgeqQj*Cj0;LZ;_VoAIDGpa^Rid zgz%H0aLSVUpczj-kYj0jX^qW<3)jIS7-Cr=d4Y1o~QrhfbRS3x3bZd_pRUC*sS6W zF0x*Gf7*FxCY#P6*XZ~C2^Ig}T|OPwq+2I;yZiTbtvb$gpK9~=vy`m^DmICI~C^Km9E6D~D-|*0(ICBafdI_pJ6_%hF-{(2MB>quG3x>tXI$ zj6tgx7#Fv!c3u$obRF-`sOOemcV=d5Zum@7G1o(e(Rf?QKzmj+gudT2-`Q4JMrhW&P`9HA3w6SGUmLn zOFU!QrsIFJRy%y`%HP+Xkyh%>bmv>0#bakV}t^HfQO8Qw|Y%O2^HmyIVbUXI$ke9<|(Hi>r6LXNAuk5)aaSgU?K zOz!=hzkVXQUp$`NOfRZFFTP&I_3g%^feX(6`5)NyCV1NeK`}g+$ z{rmUz^ZmEi&$o}O?_YbT{-qQ>yJ@P6vW_s%B$Wg?3*T@@P5>hrdHlr)NNud7Qt(!dth#-gG8;N7-QIMUCGjkY1yCd ze4od8;M(+D%Z}o+(y@yy>TC4+6Wy+#*S((Aoh|mlZ$JBq^~C{C7;e5i{QR|B)7-$% z*N!plTpb*@+-J^Iu?*7%rHyh40x{klGg%_u9^NjLpC}xfDG#JW-7l=LBYIta?(1JHvo(=37j7kEh9Q3o#-CA?u)f?aZvK3c_ zzC_Il41ae9XyT;|#(7Vw8?Kooz3n`GPa^rsqBGlA7P~h^KaG{${l@Org;{GSF_h0> zNEN<2`&m!Js{drb<(bnjD=9{I~ZQYcY-nnFj-3FCUXLP@pmtX(iXLp_Zo6M5M z3|itl&aC5)^ISG_>D0APXD)8puJg%3`+*)to*-J_L&ZM^pDEWW`CV3egEV=%`njxg HN@xNAaYnX> literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_print_stamp_rzx90.png new file mode 100644 index 0000000000000000000000000000000000000000..4240368c60100eac55cd32d97535b6f8a4691054 GIT binary patch literal 874 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnex;TbZ+j@EPeb)??6)gp7mc{6^{R2%NZcN{+hMc z{C3mWO3n`pI43ZF`McZSKl;u2`A>fp{S2(V7O6OtILM#MTLJn zdaf3#Hn9BA4k+rLdHT8BqHhwLSyphGWlcUD?M?r8!3D7ko-g!!7r9Gp*R~U@Kb5Y#IJew9)qx=W?rAR@hEeywL35uraLJx}G{ca4iJ#-PM*oF6pRr-!_rYlF*ia*v zd%sS5Wy=|$ACVi$+GTk(%SiU?@d??btrb%l^4jel8oijuGUM(po2b4yu?o_$mg|Z; z0-2tt-d?dhdhM%ezTvB*qwB2wD!kucQ#^6))8^1cH&v=vN7jDV&6x-WMr8U)`vd=%B>Hhs~txmAWTm{Co$v15e zUW)ac$NFp9|9Dl8T7%`)w$^Fi%cnB5IZmHmZ+K=sX0jz#x;TbZ+g6_D&odVWrZ?2#a-vr;yXgL_pY}!O$${MM>FVdQ&MBb@04OGNj=9)1s|1bu-W)+WeEWfs%lFjkk&X@9*6Y;^MftYNxfqjohpXd;6GBSsj@ ZosfN|uW{rPpUVo6oTsaw%Q~loCIAOYv6%n> literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_seal_reglued.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_seal_reglued.png new file mode 100644 index 0000000000000000000000000000000000000000..ab260be6f8843230145a76bf8506e3548c4e1946 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne|@g0@3kA&B&dD&-_^<;*T`{SmS4{nfIn=jWe` zG#D{Ya2EJpa89O%HS2BQAZ2XaY@i@a7@%>BzNerK2 z?ZxY5I)WLzYFTFK*Hkm)G>I}WFJRDU0BT=g{qe1T-S_`*)-jaCH~iOQJs`*M25jtt z)r=?Nn}E9H+h$*PVAL>YD3kyiUM+P+j$w8J>j4H0kSh!rxDH(SeP7||-fc3)O z_RhKP2G`V%oywjRAjp4^(Sn)vdW3OnYg4( z^}JiZkH37iYLf=T{rKs3O&A>*92gQ@8Rqq!-yd~byneFp0gG+d<7F4$a^JRphc3e! zz5^zmaq;)w<-XcqE63?zZ8!TuX#F1>+5O^8-+q59XFBkTA!Ksi$s@VPd+xoQZkPI~ za_ey+2D7OSksOa?ch33}`ZK6Ecl+(-XJR<7a(6Los1%fOzHl$I`fFwAtB};QSFTqd zI`Yx5pl}UPig&_PbP0l+XkK=cb-W literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_scratch.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_scratch.png new file mode 100644 index 0000000000000000000000000000000000000000..e31399207921e4bb8594f2a4a45f996d7e6cbca1 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnex_bZyc<`%X?@PM|5If{H!! z->;A9j&HuexuLrDw9u4*IJ4V-;+x+V{5c`iP_Woh|HW;W)=>9m)9U;Ct7;cB@V{*J zUw;1nrYGsK-Y1e?zIQzEU|)#W2VUWXGo`_&Zv2k7^6xJC&JwYDistz{ESDGEu{p2D z82-wPAv^Q_`r~^KyuF)#u28acSQif<#w#mDxyjoCNcsBcW!DU3HToUEDuEIxl$!JzL7NS&vvpUXO@geCykXqx!| literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_torn.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_sticker_torn.png new file mode 100644 index 0000000000000000000000000000000000000000..f563a403773a515d28e2221fc58e051643f54ffa GIT binary patch literal 1011 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnepFe6>ZLO~Qy#DT(cstnEtYp&kJ=3@N z&jXr960mWyudmtv_uJdoZ=dVW&x_w%S6#k$|4z%w*u#JA6927W{-ZtJe}?@l7A1y7 z4IBsl-}>O+yG{Pyo*!@jz1_L*{o~!sl^CweGS0KFuDpI=)5HApx%RW~-d``wxMNq} zgvCFueb}CDbMCnjQ_lH(Ui-xdD|DC&rphY1|IImb`?2Av^GXM=Nv>hs@r&a^@&Cf7 zQ3)kY|8A}n-1YwC{`2>o-KPa-^UT-c-zInB*uCJ{A2-hto4acppYbvuN!@Mx%Uw>g z?W+Qs_akb7`A{$KRWYRU2))C6pNW&HkSk+_Bkyvta!mHSrVGk#qZ$7AKxpa`-n>wrEcr z%YzMG1%0RPF0dAwW9|N)Z_@tsYa2E%PWg3Js=@g?)6 zUpiBs{+%ltl{(#sY0hQFA}bZ9f{Pj#KL3~NtQ`SJ{hC?zk4LlXhX?lm8ih^+D(? zlh5DhzMFIQfB4kLp?4L6wdPcc;p2YZsQ+ew&gNCi?E^_pJI!90wK# zCYV~CFKb)(jidLiz-EsNy)~hQ?=Hr(JV=UM5V>?)@$Z{6+!wz;cIV|4o4A`-@7=U) zxhk15U#q>&JR>jd^x4AApZ6_JeE;`f58LB=eSER$H>~p?2tT{P^+D(A&F3w@L&DGB zJa6m#CR(u~Wa@)?T~EF&JI|7S%h>(h-p~8?iFdfmvWCr^ezSJ++jB5f6DS&4J7aB L>gTe~DWM4fhkMYG literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk1.png deleted file mode 100644 index 14051a7dca7adbf043e4d194f172854b135e319a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneYeF5Z5v?*Eo6 z;i6~3`vp0?ZB^~dzm^*XKYeo`%f#ch)QR4Iu`C;2s90DnJo=aWabvu5!un9%@3U&g)#u`p zpS`^LX7_294G&}#tj?U;$7}down}ZmiH2OWIL009Kc=6*8-7mx3?oazPN0FR42%)L sFjH+{W!~{`d1UG7mqHC#W1{c9@Qjv*Dd-rh0fYB3ODxgg`G zxntT$9x7x2L=`f-3bf=cbIz5&lB1RWG-NBI%3|ypuoV? zAjXl?ctA#Ki$el07ZXF2!Ud*AOOuSo15zR^3|kx)urd{A0EJ97I2bY-9k^MZT>uJY p2M90#1?$_{;F3F-7|~t7X9q*Iq@LM@uxxvfl&7no%Q~loCIC}cRI300 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png deleted file mode 100644 index 55b73bab344378e70056e69de5265dd5aa02170b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsn4D+jv*Dd-rn-%YgQ0w2z*!1 zFB~2hn9sn|{P@uKN$b4oeV%zA*k%e;iVakqd%dH&fBioHtEICT7&#ai&)C^>rIl_- zi(&ghey zCEFy}z;GhZ_1?dOtFq=YuqXfxT=2>)wUpr>S0e+9!`0l&s}33+;Bdg^5TeEYTxD+C VKjoXz^wj$xJ)W+9F6*2UngBdbQlS6< diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png deleted file mode 100644 index f42f89eb5169f1f6321ae6ac4f770d0b4fe1417e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsc)Vxjv*Dd-rjQLYBAt(2z+19 ze{gE}m95gg$yu8F*f&efPED=C`jqe)m{y|Mh46e11lbhDxT6x_Hwa z`RoQ&d9Ob!GB7GMylL3Nc0nq@?8frXzD*1)4XPH_5__jzd&RJ*QGtQ+!~Xpai`n;= zURdm1V5Y&M!0>N7%lEq48Grw-QjK8Xa9{}G4|%W6m4Eo-FJYkhk$M|<-f3fC!R8pE a#lqFa)ERW$gTJ(bw0OGuxvXhqhu2KK^X~8du=${y{7$!ed7$7LdzS6<=I_nRXSn%2)Y*zj zfZ@J9Qz-w&y~h_j7nFG9@v<;-G?cbIxOq6?{kJD87Tn)f$$OAVpn)N$`CJsk=Jp4x se8C;>lKOJ`f2n#y@1@Da!uPgg&ebxsLQ07KNZ;lr~@0Y{JnAR&g;>y`{L|>{Ss(k_~Fm6_4s18 z?cerzz1|i#KY>Mofstduw;z|!_uI|io#4%E_xiU315?6Z-w$sN%8NR@{vBk%;lQxw zv+#@6&G)7AUaRdi7XWIyc9X?Dmo44)gH-A4>uM1UOacwJ7X&i@zRsQwRK6ou%2Z+V i_0QoPK&6y`eXp3BJeyVJzldD`8RO~d=d#Wzp$Py5b6KMR diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png deleted file mode 100644 index 65f66cc0dcd1197438fab201428ae371a007d7fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsV|-`jv*Dd-rhRR+2SDJ;Q0Bx z^M{l!sm9N59x;Gc8vt{G4zHsIA)yx(j7ir4*e=l{(MYhYk$V2J9!-c)I2 zuhp>qeLn-sfqG_%y>agk#eB745&+68G~Dz}di`@V_qy+u*$+7#7(k+n;te;&HM+gO zEXBbjz+iSTaQ5S?$sWl8ED8*p>N$Sjnz6O~P3A*o21WtfwlB}kfWnl36Q#^-i!Rg| S|N9^gGRD)@&t;ucLK6UI&r~=7 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png deleted file mode 100644 index d91bf65d67207e5ccb7a2864efca95afb9688c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsUMy$jv*Dd-rn-&YB3OSIC$s3 zT$A?t73v26`?^96wA*`}x<`Gm{}AUSOTi|ik!Lo zeKC_p?u+d#9Skf7zB9jwU2ocR@%OsD@{Ak~3`_zCUQDpqrI`NTFSmk8pn-u!q2Z?c zycNm;*&7x+8!-tm{FiP@=RLlpMHv^=PLFf{gKW^>bP0l+XkK%KlPk diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png deleted file mode 100644 index 0cd95fbe7e2c9a2edb7baa6205878b55e4266869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsV|-`jv*Dd-rn-&YETey2>iak ze?egM8qp>C)mm39FRXaM9Cu-r2v8w5ko7IuIy?H>&+6~}b$-eY3``CT7yqtJc-MEH zE8*)`!3KsO`3!rXS6dlup0~Wzo=KpAfkmNVd-stSA2+krnQ$<20JR7>e4CPfO+>@0 zwVSPpfu+H<;M${#E7>QmUUz3;daz&qP}qO2iC-DdasYKN;Q1w*7`j7&ffDdz6}Nv{ VC*Q_hpM*fhc)I$ztaD0e0sszXR73y( diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png deleted file mode 100644 index e6d8c83f10b14cdb1c0af005c9293f9aac91869d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxned%@2%Hs-xpu`p8JVKf#II8 z!@IA$6V~06w-wmQEc^B6((kN2_m*RJUm}(D@h(g1E*`~$v^4siEuD7W%fOIiQY;}FLHSP<4 zxW9Zemm>p{z=4{6-~XSUn=$JE6<~2E(LxP@e&09jTYKruntLEUp00i_>zopr09LwP A9RL6T diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png deleted file mode 100644 index 77e5d14373eabf51b99430acf339ab4d74ae28a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsXv}Bjv*Dd-rkDlYBmsX2>iaE z|DgW%71|eiPD;pIvj18d;q~0->Jb!zPXZ$IwNzs$nnz`&tUwMXR4 z#h*7BUD$u=GAc1Je)!9fwZ7c6=S_k)<4hJt4hHXnw+Sxi^JRBjW7y>6!oc*P-oCMl zw=Rt1qUxS9Pd5gpggvSj*_Q8Wr8iyAjbKq=IQCchO>V!F%l+eT{ej$fQFimIcAPbD f#^xfT#S%oU8;|T*H|yXELy#U%S3j3^P6QTIdOw@#Z<(v-TNzjy816~^dG%o4KNTZJCIJSf4!!Qs=6KmVu@OuT3``1E5~0WE zUQ9mwCPq!v0ahvtyse4ggjgx~x Ox;$O|T-G@yGywn<-co)5 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png deleted file mode 100644 index 5777ff6b772a5b932bcb8b88b2a16180bc7e50e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsW+Z3jv*Dd-rhRM*s zbm@0Lzkc7l&lO+)J25ahFkEG}-Sy=pTY_c_1B*k6K)9~zrr8hHE3hE7h8j!)44c^ucUQ)J&1w!;6lh?e2sG61U_3iNNHuGv`!$e3 Mp00i_>zopr09>r7O4KfzV-(fxf8cupB2~4<-ous;83!<;QOlsS>e(#tpW`UEZCeuyx5wTOl90U U7pBZ!I~AnK)78&qol`;+02WJDivR!s diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png deleted file mode 100644 index eac40892085ce07b24e72e86999f2070ef809b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsZX9Rjv*Dd-rh>&b1>jxyKwiv z3E#uGISns%b)Bv5lwZ`gB!1IEQ=md@;N6?wWp{Ef{#yOntyg$&T&XRS0>c^khI@~1 z{#yRn<^ASea*P5DEDLshbT|KU^@>_lKLZED|7e!|cYo~t9=#XDd+pn}@79mK=RcNs ziLP~LU}-27KbUXoRJP}p>t+Uy1|Yh=U~zrxiMou_db4K7D+(|$Vsi-bV#|t{8eiU@ TdCW{=HAs`EtDnm{r-UW|PrO>R diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png deleted file mode 100644 index c1d5ccec12a632a3d3634d3fe2a8bdedfa05ec94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsn?z^jv*Dd-rjQLYBmsXxOnHk ziJa2+OM53Ak!;iWBv%r+N^|LFMaF1mpjs>-VcGY`bM`K}e*eAn+RtA;zxlrI-RJYl z3@fBAT>N^KanIM?0u2lT4p*&iHumM!hP|G_z{tVCn8M$EHG1-@35(wgHZW{py=D62 zDzinD{VrE02BrgwJF*J)Rh4Hs{_TMq&`SQM~WPlC_`c|9Hvxve&< R&3=M(dAjiZ( zme|96uWT>Wt)DQ5dG8sEOB3WZrU(I5Vgsg@@#Sx`WdHw*&7Ak*`^DdRf9vPjFg4ud zE-7WW_;K|iX9gw*hQ*)PME!_=oZBkU!0^JB<^8QgXROwo=MrG#X!yL{VYk@7Hw9jw z-I*OhYWL3n|8{~d1B(KK+jgFVdQ I&MBb@0KB$NqW}N^ diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png deleted file mode 100644 index 6d16b6473d63e5116af8de3fd7aaa6bd6a57f807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsXv}Bjv*Dd-rkDlYBmsXxcH{t zRPRvj%l!!_l8q)5@O@dnb>p-c32$#kpjs?o!Lxnqmw$U<`|tO@{iRXy`L^{}K5o8l zU0uuJ!0?1!V6Wri>+fUJuO8d7kX3$ywSt&P2m#3?r%Q~loCIEtgRnGtb diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png deleted file mode 100644 index 66399361c34f2cccc7cd1aa0f7259fed8cdee929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsaKvZjv*Dd-rjQLYBmsYz4)fy zR8Q&mrJV^TA5}T#G0Se*x?ikFQPi6es1^%Yu=HAPzHL>%ef_(vbCOw^5f%6XPTDI12UNszI=KVp4aMe->Q*;1&i$@2z~Hncm2=u_mz4nC^#5A MUHx3vIVCg!01>iK8~^|S diff --git a/tests/Decentralized.Domain.Tests/Program.cs b/tests/Decentralized.Domain.Tests/Program.cs index becffce..36b8d8b 100644 --- a/tests/Decentralized.Domain.Tests/Program.cs +++ b/tests/Decentralized.Domain.Tests/Program.cs @@ -156,6 +156,11 @@ internal static class Program var u = new Unit { Model = "RZX90", FakeOf = "RZX60", Health = 80 }; Check(CardValue.True(u) == CardValue.Of("RZX60", 80) && CardValue.Quoted(u, 80) == CardValue.Of("RZX90", 80), "真实价值按芯片型号,标称价按标称型号"); Check(CardValue.Quoted(u, 80) > CardValue.True(u) * 8, $"假 RZX 90 的标称价 {CardValue.Quoted(u, 80)} 远高于真值 {CardValue.True(u)}"); + var worn = new Unit { Model = "RZX70", Health = 100, Look = new CardLook { Fan = 2, Fingers = 2, Bracket = 1, Sticker = 2 } }; + Check(Near(CardLook.Decode("22102").ValueFactor, 0.88 * 0.88 * 0.98 * 0.94, 1e-9) && CardValue.True(worn) == (long)Math.Round(800 * 0.88 * 0.88 * 0.98 * 0.94), "外观折扣乘进真实价值:风扇缺角 + 金手指氧化 + 划痕 + 封条缺失"); + var clean = new Unit { Model = "RZX70", Health = 80 }; + var dusty = new Unit { Model = "RZX70", Health = 80, Look = new CardLook { Fan = 2, Fingers = 2 } }; + Check(dusty.DeathChance(ModuleBonus.None) > clean.DeathChance(ModuleBonus.None) * 1.5 && Near(CardLook.Decode("20000").WearFactor, 1.3, 1e-9), "风扇缺角、金手指氧化抬高暴毙概率与损耗"); Check(CardValue.Of("RZX70", 100) == 800 && CardValue.Of("RZX70", 0) == 200 && CardValue.Of("RZX70", 50) == 500, "健康 100 满价、0 剩 25%、50 为 62.5%"); });