From e643332a41b26f18b7eb18dc1e4b362cc058bae5 Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 12:04:08 +0800 Subject: [PATCH] GPU art: redraw front and back with real detail Six-blade fans with rim, air duct and hub, graphite shroud with fin stack, copper heat-pipe ends and an 8-pin connector, PCB with parts and per-contact gold fingers; back has brushed backplate, vents, screws, recessed silkscreen plate, QR/barcode sticker and a seal. Overlays realigned. Co-Authored-By: Claude Sonnet 5.5 --- art/__pycache__/sprites.cpython-314.pyc | Bin 12131 -> 46013 bytes art/sprites.py | 205 +++++++++++++----- .../ModFiles/Textures/Items/gpu_burnt_b.png | Bin 256 -> 460 bytes .../ModFiles/Textures/Items/gpu_burnt_f.png | Bin 390 -> 611 bytes .../ModFiles/Textures/Items/gpu_ov_stk1.png | Bin 133 -> 160 bytes .../ModFiles/Textures/Items/gpu_ov_stk2.png | Bin 116 -> 122 bytes .../ModFiles/Textures/Items/gpu_pmd_b.png | Bin 235 -> 428 bytes .../ModFiles/Textures/Items/gpu_pmd_f.png | Bin 354 -> 592 bytes .../Textures/Items/gpu_probidia_b.png | Bin 237 -> 431 bytes .../Textures/Items/gpu_probidia_f.png | Bin 353 -> 583 bytes 10 files changed, 148 insertions(+), 57 deletions(-) diff --git a/art/__pycache__/sprites.cpython-314.pyc b/art/__pycache__/sprites.cpython-314.pyc index 1a3c05e686b7a2804863befd422b98f10bee42ff..dc5f2d462212e48c02a53842f1e5c82a72788de7 100644 GIT binary patch literal 46013 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
|x6dUl;{T z#Gf$zig;FZL?W;6=S^NAg#2wv1Wb>mynL&@Zd-Zz?y%Xj8|CWlb=5m|o8~lbtHo4c z6MV}y7`iToniAo0w}}D}&|p;_tXOcYo#Dk<8*z_38e%6JsnK_?jnx>$H{Xy=ff}wR zYamWE6Kp|K(Ru+JV8&JmE_ed|L*Od_dab`y2CFArS!&R&saMQ=?XXtEy`(lBB=nwf zxmE21Ah*$K1#OX*C&B}c8VM~ak{&C~FY#EOu;xpT=WQraPIvRcLd5ala#MxfQSC7{ zY(yT+6!u-J~-~&@xED0y{J}j<4)o39W`z?z|(bF+-n}1rAM}hE?#FOmTGeJ#M6v|c5P!!ly~o3JkMFTJC=o}!{^EywlH6D zUSAIQTDW-Lyxs9WPg-QV4Rhu|xl69}M6Il*>w{%`eckTrDvxDNLsdZ?;cJ%C>YdJJ z88-7{=v*9G#!-f`g@JyfG^2(CH0FiT1!UwY4lBuCK*r;WLpj+u!;rs?a0t>$4hPA2 z1qK|t$WA(8qo)*ypW#Ptqg1*ThZ6d@o{XoMgB(d8t>l1#h2p3s`ww8qtt=J!yX4~& za{XBGL9KlBC>d)Nhlk0I<|T|`T?lc=uTYTHu*-*89HYDGBZ0o7bC{3O%Va+ZLw-X^ zL?QHTrmyE^amp1Qb8PJ{mh~9ny19qw<#U8dhM0#?4`ht1N??Ux=(Y)PZ zo4r`7pp*yBzYP^jb_t8X2#V;Uc4-4D5Un&;KGi+8dU3%Lwb|iq#A&;f)q@52Y8JY{y>0=p|fziJ+HA^(Bg4 zqScoedWltE;^-w_eMz8~MD-PsfQOjTZ#0*-Bdk&OT?;vW`giK$;e|2*~9dNIVJ&?fbkk*pIY_h#fM z*7=Kim#kK-k3Z2{T*0i2c&WF{@cX&qmsu6R%&Pb$t4iI}TcOI!#B_>VeOa)WVpm_* zh(#i$z+RPVNWB$Cp)7(DN_|m6sV`b6_NvrZ>a7S06|RK(f?iroU&Tj?F(9WUyfvrA z)FQTIUyF)vH?)M~rRrL!rFDwx8k*K(`Z6R$9RDRkWPLR$MV$QA!ewIAmn#jT_>}mS z5ill%!ALQ|h-Pj=c%9f1@@2?s5l&AU7Qk!-W6mUwO1hGqbIp`^ zB{}<=DdtMtY-Y~7W{SI#u#}lgu9?DGbFZ1A+by@^!XgYUp~N8ZR}!YWw_aIL!2I0T zHT%kvwSld-!pxC|7R&8OAtJ72`L&$+eOaqo9&O#!S>ldAQZ^7Z^@?d4b1l%h_L*pS zjfnd)+$=&kj1^3gt-A+|gw;Zc~5cv}=*^`&YNEZkG@5II!dJa|fPtuQ>haiAQm!YGHR`Psooa_KjP1 zsi}8OdF$%I$fvRJkv8+oa7$Ry7x6+^bZ_(|cU0H6dbaji9=~cSx?(BnEiSoQy#7k@ z`m4p8t`u+Twb`%QYOdI7dTTci*y-C|g!;Zqz3 zy2bTS*X*8&eU?>MErnMsg_oEAdetvi{rd4=KHj@wa@(`b2{e?rp{DZBQo~Y0)Jl6g~LH~_x}@Wr*dET7Y_-hRE9VFKd8no&Hw-a delta 5955 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 I_|@b7PxQM%0ssI2 diff --git a/art/sprites.py b/art/sprites.py index 1277bd0..0ddf7c5 100644 --- a/art/sprites.py +++ b/art/sprites.py @@ -30,6 +30,12 @@ C = { 'Y': (0xC8, 0xA4, 0x4A), # 金手指 'c': (0x2E, 0x2A, 0x2A), # 焦黑 'e': (0x6B, 0x4A, 0x3A), # 焦痕 + 'p': (0xC0, 0x7A, 0x4A), # 铜 + 'q': (0x8A, 0x4F, 0x34), # 暗铜 + 'w': (0xE6, 0xE2, 0xD0), # 白 + 'n': (0x1E, 0x1B, 0x25), # 近黑 + 'x': (0x4A, 0x4E, 0x58), # 石墨亮边 + 'z': (0x2D, 0x2F, 0x38), # 石墨暗 } @@ -117,92 +123,176 @@ def outline(c): def bracket(c): - """左端金属挡板,三个接口孔。""" + """左端金属挡板:带折边、网孔、三个接口(带高光边与内壁)、底部固定螺丝。""" c.rect(1, 2, 5, 27, 'b') - c.rect(1, 2, 1, 27, 'h'); c.rect(5, 2, 5, 27, 'd') - for y in (5, 11, 17): + c.rect(1, 2, 1, 27, 'h'); c.rect(2, 2, 2, 27, 'l'); c.rect(5, 2, 5, 27, 'd'); c.rect(4, 2, 4, 27, 'm') + for y in (5, 11, 17): # 三个接口:外框亮边、内腔深色、中间一条触片 c.rect(2, y, 4, y + 3, 'k') - c.rect(2, y, 4, y, 'g') - c.put(3, 22, 'k'); c.put(3, 24, 'k') + c.rect(2, y, 4, y, 'h'); c.put(2, y + 1, 'g'); c.put(4, y + 1, 'g') + c.put(3, y + 2, 'd'); c.put(3, y + 3, 'g') + for y in range(20, 27, 2): # 散热网孔 + c.put(2, y, 'k'); c.put(4, y, 'k') + c.put(3, y + 1, 'k') + c.put(3, 3, 'k'); c.put(3, 27, 'g') # 顶部卡扣与底部螺丝 + c.put(2, 27, 'h'); c.put(4, 27, 'd') + + +def fan(c, cx, cy, accent, burnt=False): + """风扇:深色风道里六片弯曲扇叶(前缘高光、叶面按受光渐变),外圈细边,轴心带品牌色点;光从左上来。""" + import math + for y in range(cy - 7, cy + 8): + for x in range(cx - 7, cx + 8): + dx, dy = x - cx, y - cy + r = math.hypot(dx, dy) + if r > 7.4: + continue + ang = (math.atan2(dy, dx) / (2 * math.pi)) % 1.0 + lit = (dx + dy) < 0 + if r >= 6.5: # 外圈细边 + c.put(x, y, 'l' if dx + dy < -3 else ('b' if dx + dy < 3 else 'g')) + elif r >= 5.6: # 风道 + c.put(x, y, 'n') + elif r <= 2.3: # 轴心 + c.put(x, y, 'h' if (dx + dy) < -1 else 'b' if dx + dy < 2 else 'm') + else: + t = (ang * 6 + (r - 3) * 0.16) % 1.0 + if t < 0.55: + c.put(x, y, 'h' if t < 0.09 else ('l' if lit else 'b') if t < 0.30 else ('b' if lit else 'm')) + else: + c.put(x, y, 'n' if t < 0.85 else 'k') + c.put(cx, cy, accent) + c.put(cx - 1, cy - 1, 'w') def gpu_front(accent, accent_dark, burnt=False): - """显卡正面(48×32,3×2 格),略微俯视:顶面是带两个风扇的散热罩,左端金属挡板(三个接口), - 前沿露出 PCB 和金手指,右端一道暗侧面。每格中心都不透明。""" + """显卡正面(48×32,3×2 格),略微俯视:石墨色散热罩带斜切角与品牌色斜条,两个七叶风扇, + 右端露出鳍片,顶沿露出铜热管和 8 针供电口,前沿是带元件的 PCB 和逐根画出的金手指。每格中心都不透明。""" c = Canvas(W, H) bracket(c) + # 散热罩底色:左上亮、右下暗的渐变,右上角切角 for y in range(TOP0, TOP1 + 1): for x in range(L, R + 1): - c.put(x, y, 'm') - c.put(R, y, 'd'); c.put(R - 1, y, 'd') + c.put(x, y, 'x' if y < TOP0 + 3 else 'd' if (x - L) < 4 else 'z') for x in range(L, R + 1): - c.put(x, TOP0, 'l'); c.put(x, TOP0 + 1, 'b') - for x in range(L + 1, R - 1): - c.put(x, TOP1 - 1, accent) - c.put(L + 1, TOP1, accent_dark); c.put(R - 2, TOP1, accent_dark) + c.put(x, TOP0, 'h' if x < R - 5 else 'l'); c.put(x, TOP0 + 1, 'l' if x < R - 8 else 'b') + for y in range(TOP0, TOP1 + 1): # 左缘受光 + c.put(L, y, 'l'); c.put(L + 1, y, 'b') + # 右端鳍片(竖向细条) + for x in range(R - 4, R + 1): + for y in range(TOP0 + 2, TOP1): + c.put(x, y, 'g' if (x - (R - 4)) % 2 == 0 else 'k') + c.rect(R - 5, TOP0 + 2, R - 5, TOP1 - 1, 'x') + # 中间的筋条(两个风扇之间)与上下沿的槽 + for y in range(TOP0 + 3, TOP1 - 2): + c.put(25, y, 'k'); c.put(26, y, 'x') + # 品牌色斜条(从前沿向左上延伸)与前沿色条 + for k in range(0, 8): + c.put(L + 3 + k, TOP1 - 1 - k // 2, accent) + for x in range(L + 1, R - 5): + c.put(x, TOP1 - 1, accent if x % 9 else accent_dark) + c.put(x, TOP1, accent_dark) for cx, cy in FANS: - for y in range(cy - 7, cy + 8): - for x in range(cx - 7, cx + 8): - d2 = (x - cx) ** 2 + (y - cy) ** 2 - if d2 <= 49: - c.put(x, y, 'k') - if 26 <= d2 <= 38: - c.put(x, y, 'g') - for k in range(-5, 6): - if abs(k) >= 1: - c.put(cx + k, cy, 'g'); c.put(cx, cy + k, 'g') - for dx, dy in ((-3, -3), (3, 3), (3, -3), (-3, 3)): - c.put(cx + dx, cy + dy, 'g') - c.rect(cx - 1, cy - 1, cx + 1, cy + 1, 'b') - c.put(cx, cy, 'h') + fan(c, cx, cy, accent) + for dx, dy in ((-7, -7), (7, -7), (-7, 7), (7, 7)): # 风扇四角的固定孔 + c.put(cx + dx, cy + dy, 'n' if dx + dy else 'k') + # 顶沿:铜热管端头 + 8 针供电口(带针脚) + for x0 in (L + 6, L + 8, L + 10, L + 12): + c.put(x0, TOP0 - 1, 'p'); c.put(x0 + 1, TOP0 - 1, 'q') + for x in range(L + 18, L + 28): + c.put(x, TOP0 - 1, 'n') + for x in range(L + 18, L + 28, 2): + c.put(x, TOP0 - 2, 'k') + for x in range(L + 19, L + 28, 2): + c.put(x, TOP0 - 2, 'Y') + # 前沿:PCB(绿)带元件,之后金手指 for x in range(L, R + 1): - c.put(x, TOP1 + 1, 'g2'); c.put(x, TOP1 + 2, 'g2') - for x in range(L, R + 1): - c.put(x, TOP1 + 3, 'Y'); c.put(x, TOP1 + 4, 'Y' if x % 2 == 0 else 'e') - for y in (TOP1 + 3, TOP1 + 4): - c.put(L + 17, y, 'k'); c.put(L + 18, y, 'k') - for x0 in (L + 4, L + 12): # 顶上供电口 - c.rect(x0, TOP0 - 1, x0 + 4, TOP0 - 1, 'k') + c.put(x, TOP1 + 1, 'G' if x % 7 else 'g2'); c.put(x, TOP1 + 2, 'g2') + for x0 in (L + 4, L + 11, L + 22, L + 29): + c.put(x0, TOP1 + 1, 'b'); c.put(x0 + 1, TOP1 + 1, 'g') + for x in range(L, R + 1): # 金手指:每一根带深色分隔 + if x in (L + 17, L + 18): + continue + c.put(x, TOP1 + 3, 'Y' if x % 2 == 0 else 'e'); c.put(x, TOP1 + 4, 'Y' if x % 2 == 0 else 'q') + c.put(x, TOP1 + 5, 'e' if x % 2 == 0 else 'k') for x in range(L, R + 1): for y in range(TOP1 + 1, 28): if c.px[y][x] is None: c.put(x, y, 'k') if burnt: - for x, y in [(12, 8), (13, 9), (18, 17), (35, 8), (36, 9), (40, 18), (24, 12), (25, 11)]: + for x, y in [(12, 8), (13, 9), (18, 17), (35, 8), (36, 9), (40, 18), (24, 12), (25, 11), (19, 9), (33, 16)]: c.put(x, y, 'c') - for x in range(L + 1, R - 1): + for x in range(L + 1, R - 5): c.put(x, TOP1 - 1, 'e') + for cx, cy in FANS: + for dx, dy in ((0, 0), (1, 1), (-1, 1), (2, -2), (-2, -2)): + c.put(cx + dx, cy + dy, 'c') outline(c) return c +def screw(c, x, y): + c.put(x, y, 'b'); c.put(x + 1, y, 'g'); c.put(x, y + 1, 'g'); c.put(x + 1, y + 1, 'k') + + def gpu_back(accent, accent_dark, burnt=False): - """显卡背面(翻面后):左端仍是挡板;黑色背板,上面一行丝印(型号用叠加图画), - 右下一张序列号贴纸,贴纸边上一道封条。""" + """显卡背面(翻面后):左端仍是挡板;拉丝金属背板,带通风槽、四角螺丝、品牌色斜条; + 中上是一块凹进去的丝印区(型号用叠加图写在这里),右下是带二维码和条码的序列号贴纸,贴纸边上一道封条。""" c = Canvas(W, H) bracket(c) for y in range(TOP0, 28): for x in range(L, R + 1): - c.put(x, y, 'd') - c.put(R, y, 'k'); c.put(R - 1, y, 'k') + c.put(x, y, 'd' if (y % 3) else 'm' if x % 2 else 'd') + c.put(R, y, 'k'); c.put(R - 1, y, 'z') for x in range(L, R + 1): - c.put(x, TOP0, 'm'); c.put(x, TOP0 + 1, 'm') + c.put(x, TOP0, 'l'); c.put(x, TOP0 + 1, 'b') + for y in range(TOP0, 28): + c.put(L, y, 'b'); c.put(L + 1, y, 'x') + # 丝印凹槽 + c.rect(9, 7, 43, 13, 'z') + c.rect(9, 7, 43, 7, 'k'); c.rect(9, 7, 9, 13, 'k') + c.rect(9, 13, 43, 13, 'x') + # 品牌色斜条与前沿色条 for x in range(L + 1, R - 1): c.put(x, 16, accent) c.put(L + 1, 17, accent_dark); c.put(R - 2, 17, accent_dark) - for x in range(L + 2, R - 2, 5): # 背板螺丝 - for y in (22, 25): - c.put(x, y, 'b'); c.put(x + 1, y, 'k') - c.rect(26, 18, 41, 21, 'h') # 序列号贴纸(印刷条码) - for x in range(27, 41, 2): - c.rect(x, 19, x, 20, 'k') - c.rect(44, 17, 44, 22, 'R') # 封条(红色) - c.rect(43, 17, 43, 22, 'r2') + for k in range(0, 7): + c.put(R - 3 - k, 15 - k // 2 if k < 4 else 14, accent_dark) + # 通风槽(左下一组) + for y in (19, 21, 23, 25): + for x in range(L + 4, L + 14): + c.put(x, y, 'k') + for x in range(L + 4, L + 14): + c.put(x, y + 1, 'x') if y + 1 < 27 else None + # 四角螺丝 + for x, y in ((L + 2, TOP0 + 3), (R - 5, TOP0 + 3), (L + 2, 24), (R - 5, 24)): + screw(c, x, y) + # 序列号贴纸:左边二维码,右边条码与小字 + c.rect(22, 17, 41, 23, 'w') + c.rect(22, 17, 41, 17, 'h'); c.rect(22, 23, 41, 23, 'l') + qr = ['1110101', '1010011', '1011101', '0001010', '1101111', '0100101', '1110011'] + for j, row in enumerate(qr): + for i, ch in enumerate(row): + if ch == '1': + c.put(23 + i, 17 + j - (1 if j == 6 else 0) * 0, 'n') if j < 6 else None + for x in range(31, 41, 2): + c.rect(x, 18, x, 20, 'n') + for x in range(32, 41, 3): + c.put(x, 18, 'w'); c.put(x, 19, 'w') + for x in range(31, 41): + if x % 3 != 0: + c.put(x, 22, 'm') + # 封条(红底白字) + c.rect(43, 16, 44, 24, 'R') + c.rect(43, 16, 43, 24, 'r2') + for y in (18, 20, 22): + c.put(44, y, 'w') + # 背面金手指一行 for x in range(L, R + 1): - for y in range(28, 28): - pass + if x in (L + 17, L + 18): + continue + c.put(x, 27, 'Y' if x % 2 == 0 else 'e') if burnt: - for x, y in [(14, 9), (15, 10), (30, 11), (36, 13), (20, 14)]: + for x, y in [(14, 9), (15, 10), (30, 11), (36, 13), (20, 14), (26, 21), (12, 22)]: c.put(x, y, 'c') outline(c) return c @@ -265,14 +355,15 @@ def ov_sticker(kind): """贴纸叠加:1 手写序列号(条码被盖住、写了歪歪扭扭的字);2 封条缺失(只剩撕过的残胶)。""" c = overlay() if kind == 1: - c.rect(26, 18, 41, 21, 'h') - for x, y in ((27, 20), (28, 19), (29, 20), (30, 19), (32, 20), (33, 19), (33, 21), (35, 19), (36, 20), (37, 19), (38, 21), (39, 20), (40, 19)): + c.rect(22, 17, 41, 23, 'w') + c.rect(22, 17, 41, 17, 'h'); c.rect(22, 23, 41, 23, 'l') + for x, y in ((24, 20), (25, 19), (26, 20), (27, 19), (29, 20), (30, 19), (30, 21), (32, 19), (33, 20), (34, 19), (35, 21), (36, 20), (37, 19), (38, 20), (39, 21), (24, 22), (26, 21), (28, 22), (31, 22), (35, 22)): c.put(x, y, 'O') else: - c.rect(43, 17, 44, 22, 'd') - for y in (17, 19, 21, 22): + c.rect(43, 16, 44, 24, 'd') + for y in (16, 18, 20, 22, 24): c.put(44, y, 'm') - c.put(43, 18, 'm'); c.put(43, 20, 'm') + c.put(43, 17, 'm'); c.put(43, 21, 'm'); c.put(43, 23, 'x') return c diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_burnt_b.png b/src/Decentralized/ModFiles/Textures/Items/gpu_burnt_b.png index 7f86961d7a5ccdce3af9bc62af66535f07ac6258..f8db5bb546346d89c04a7e3b898ffd1d4ce63b95 100644 GIT binary patch delta 435 zcmV;k0ZjgY0?Y%DBYy#tNkl=gu~We>3j@C*iCqveg%Qk2y{H9gurFb$7xd;aS4byd&oWHPo2+QHtjlNubr z`|8b|o?Nik&vXC;kCUk94iH=k$>#?F=tK@cbGWdCwCAe;GKu*T(g5buX)&l?07^obs!#|Z zM>+83DpWEDk^y{G2xIjBB{&m0ZmvQYTZ90t*U0Oo`0-9jTzUf|kl;q90X#P6Rq5$y z?$*skdKJo94u81M?#}*J^f&J_9i%eTW76XeycfN5@0X107Sk;CRS;z{SnyKekvI zOc=uh!4c7L4DvvHM#iAUSUq5F>Ilam4-8fea^I*22BinkGch5or=>NtJupz7!07?> zQi#@=T+feY;(?ACntOoO`GTsMc+i(Z*;2#0Wj8RH_{fnB z6yZVP0g&0`&?CbGv@V5co`gUS2l*J?12FNyAU2>eK$m&|TMP{O{=i^LLc_Z$G1Tzr faO5Z$1rPuL;cXJW)7mQE00000NkvXXu0mjf83twG diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_burnt_f.png b/src/Decentralized/ModFiles/Textures/Items/gpu_burnt_f.png index e26942dcdba371c786c3bf78246ec9d2e3b2e627..0cea91f4547d1f99d29fd5c38cd64998c941b895 100644 GIT binary patch delta 587 zcmV-R0<`^x1LFjcBYy%aNklRj7J?uaL1JMO5VQ^C zMI^PQrGl0C5GgEu1`A)~XbUgmnYa*!tRLC9(;)yPuW<&dx8Q0e{YBua&54AA7IXM0rON zfFQMh4f(A?P{7sbx=bOpR={95DxsyO4?@npjW}~~5S!Yd06kFPvhdvR3NJF?Y1&NW5=8fU{c>ibzE{TO2waq0y$;b>KbaLy+Of#8^> zw}=U7%F${Q4?9_!Se9R^aAgSe#4_%2ps}xleuO z;cZi&SwzmH70?T-ilh~IdmNNG*rw$`YRlu>q!p0i^s?WoML=5~-v$NzH*|kTc2{?O ZUtbl$$rd>jamD}u002ovPDHLkV1l~<60QIM delta 364 zcmV-y0h9jY1cn2UBYy!+NklL5^n z0;{dqNx&WjeS^!#w zY)8&?50;(O!%Gg(L{q{uM>~ggE%opMpi5lUX;IwYS5rd!@c8)*`1bIY#NVvnMswgV zs!&}G$9schA7wCkcsWWmwG(q5w2H;EP_U;_E{XGW7MyAUpe6$VU4Ly$#bZ4K^L!Gl ztY)B-0C)x-=Ts~x3O>BBtN~QgNUi`N^`Tc5plgbMN5&T0r@a6`t)Ro^kUOjZ0000< KMNUMnLSTYC8lZ>( diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_ov_stk1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_ov_stk1.png index d3fb04f4bc839d790ae9e388067d79e3ed80f956..d13de8fd01e7ae7b233610936be1920778f8b482 100644 GIT binary patch delta 131 zcmV-}0DS+20iXepBz$K{L_t(|+U?Xa3cw%?g<;R)*1cC2Iu#G$0eS`puaV9|NF74s z@P7~lb;vVdN&o-=0DxI*RXpqW0HZ(RS)l=rd`_#jr=4vPV5LDT*cKD`YI@~P_ynxi lwnBvkxb7mJ#lH>!(7eY}xa@0%G>-rP002ovPDHLkV1fXcH%b5i delta 104 zcmV-u0GI!u0fhmOBwv7=b+hrYQz3j;#~`;m|| v`D8om1o{2$8U@7-Omz>QGwn2EWw6lET%z2f`r!R~1|aZs^>bP0l+XkKMIIq# delta 85 zcmV-b0IL6bbdV%aJ4r-ARCwC$(XkBxAPfURhC@{BK%4y+0Hvj;h`5`;*0%-#0Kj{F r%)KIZ*#kK~Pbi?kuLa5<0D#*8Q~ekd%MGxX00000NkvXXu0mjf_c|gi diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_pmd_b.png b/src/Decentralized/ModFiles/Textures/Items/gpu_pmd_b.png index ca149699364b6285d21cd869ac8b2a002918cd05..52ec90687762a069ee7f415e31ba75983b600aa1 100644 GIT binary patch delta 403 zcmV;E0c`&30jvX%BYy#NNklXeycfN5@0X11r`o{cmpS_&+`)W9WLI zV@em;11@ep|FOl&V8R$4IC5kI9D_Un@{E^X1ehLd7^??@Bcj1c2t*@$0K|sH%3z>% z^)0Y_0OWX(A{dPv12E4G1V*tSGId9pI`Kv!TekKnDyuz6sEm))Sk zAWwj3qDvw4=pzM#%#o8;g<}{WnI;9pVgjcJsNEKN_UHoGp~y6hjV_KXk4qfp0T7$y zQV1qa42G#kcYg>zhm+y~oH0PC6e6~mL-qh6M-lQ6Nil%jBg2-2NQnXDB!n#%&_kRU zOjHbj98K*Qz!%~mkHS2Qk405AWn1M2~hBYyz0NklXeycfN5@0X107Sk;CRS;z{SnyKekvI zOc=uh!4c7L4DvvHM#iAUSUq5F>Ilam4-8fea^I*22BinkGx4Yg=}jCx?S z6dDE|*x+S1=rBp8P?fRXpbCAEdqAETkUVhY$Oek=pzr|5Y)NwHk>LSamqIj8LLi5O ze2ne^nD}528_*b_OFe)s28Mi1JeZQu@NP;BH9R^TISNJr1ONcZ1s_QB-AV=k0000< KMNUMnLSTZ)Bvr8h diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_pmd_f.png b/src/Decentralized/ModFiles/Textures/Items/gpu_pmd_f.png index 686a41a36789390926af6a719036c310eef293e3..46ac7e966e56f35bf1f446b0de58c9ddc5094aeb 100644 GIT binary patch delta 568 zcmV-80>}O00?-7IBYy%HNklWvH&)KdS+1A4lX*oW?7(4WXJ*g6XXfsmNqW7mtU=k?>em{p z6-x)_YM4r42y< z1)=_Jz^)HY0oS9OCWKH+0o8ES09(yA;WDo0fU^V#eM9XOfB`tpngY-UcK1(O(2y&h zxk_?AMWk@xJ-N7E0i56yAdO<2ZG@g4vjoI&1Pjm~u}gp?m+^{c5X)yNLJCOXC@z38 z$rYnPwDCTT!+)S9AciAIfR%+Pz=~JC!?>k!^w9wd$mQ?~u(FUAAk!HPe15$D=;P|L z?Glj6k(Gs{akS;C&8tDXa_r+OS^`oyva%43^U9%D62>$v0jV5WA2E$HE?tIQ@$C|j z%8{LgWO~CqKC=zSm|d(al)_OY3t7f#h|h9PsDNc0MSrpoPf>lyFdXQBcHVUo$8bbl zB|`5)JRPlgmCjptp-_%ucOmp6)d6&Zh9snu034D+^!PFk-eQA3V*Vnd06IK9*lXJs zRy8MT2lzoz0LcCtddGmE9k_iQ)`Q7WQv-}yK8KEJ=((X|k~3%r@WQ$xXb0Y&s(MnL zX4O29axr;y9kc_OIJ@d+)fAA+qid&t|Ay}G$gXtdyLXeycfN5@0X107Sk;24_+2zhcq0|DIw zE^a;;j#;s8DF!A*p4u401Hlo|a18PQvWEs6#_9ocQ%5)kc_2O`gJ=xWLyCGz%z&j1 ziah{RiyU(>F;W~&su@)A0J^25rxYX(japl4!279)EY7k{4?W>Dk-WP_0{#Ky+u z07}ik=>haoh}e)LBt~sBD9Quq84ZMyV-DSN5T>>nWP1QtrUO}ewzI(6OX92(4cIMV#~xEyzB-Y#_IuCnGEwlm9ZYhAxljRau3ll zV3%z+XfaVSFhL|efE)uSmUvN&VTA%U%tFRQdm!7(iXs~30ZPq5r?GlqsNvD!$Wbr~ aAOHYKey|iz+%yLO0000XeycfN5@0X11r`o{cmpS_&+`)W9WLI zV@em;11@ep|FOl&V8R$4IC5kI9D_Un@{E^X1ehLd7^??@Bcj1c2t*@$0K|sH%3z>% z^)0Y_0OWX(A{dPv12E4G1V*;XcKBIF^GVgR{EhAjz^5(CId2wN7;Ov%@4VPrT_o{07*qoM6N<$f^99J AE&u=k delta 210 zcmV;@04@Ko1MLBjBYyz2NklXeycfN5@0X107Sk;CRS;z{SnyKekvI zOc=uh!4c7L4DvvHM#iAUSUq5F>Ilam4-8fea^I*22BinkGx4Yg=}jCx?S z6dDE|h@0a#=rBp8kX^RfpbGseW4-?yyzB-h4;(qNfg(I8JWBvFn;d#%c!1WW5Y3Yi z$l)L#qk8}*J{ZIXGzREW4`7RdAzu>@rX)1Hn-W6}j}AwUf>8hg0OAlKoJL)pRsaA1 M07*qoM6N<$f^G*=!2kdN diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_probidia_f.png b/src/Decentralized/ModFiles/Textures/Items/gpu_probidia_f.png index 37acd0c42556fedc82c8d3343cf297ff56897294..269d388a7d2032f431a27a87474fd379527dfad2 100644 GIT binary patch delta 559 zcmV+~0?_^80>=c9BYy%8NklPFtgdeXoOoBc5ip?oB3wvW;YoO`nCpbXKUDMStWLL zdjNQTd1?>$PuttcBnX)52XSqc2Humw4HBS2h=4STb&ipGdd(w{f)PzXf5a962`=*$&j6Osl7u9XgHfFTbCMCG zL5%S}jl-ZvAb$lTihx&zNWjZizQeqwam>*H5-7z867Z^!CLqfh419jP|CnQRIkpJo zViZ*&X&hr2wVQ|0B66H#6g>ht7)4cx#(Cw?k%TcV9)VnpqK}xynU|JfE59uQxfsP& zNR~I~@tI>d#_Hl#p&X1VRmd|=LwuGxu>_W3RH;HdMSt}n!*rkn+Ij0FPQggJO2poU zcshFdDxLT4La`Xt?n0PHse{l78j>QNguo$5M6WNy;4L=lBjztM5}?B;(}Ts>lU3;? z?EpV05&+m=i{3Fv)DGxqFlVhuh1Rra-PkpW8MOoJ5PeUgcHr%?X{XI`QO^UZ6i4?_ xI{?MmXeycfN5@0X107Sk;24_+2zhcq0|DIw zE^a;;j#;s8DF!A*p4u401Hlo|a18PQvWEs6#_9ocQ%5)kc_2O`gJ=xWLyCGz%z&j1 ziah{RiyU(>F;W~&su@)A0J^25rxYX(japl4!279)EY7k{4?W>Dk-WP_0{#Ky+u z07}ik=>haoh}e)LBt~sBD9Quq84ZMyV-DSN5T>>nWP1QtrUO}ewzI(6OX92(4cIMV#~yFbNmJ!#_IuCnGExQUA7s;AxljRau3ll z08%_yF;OuvBtSiY90Mnocu|aDg#tCqLdHaUAlu7|A{yoaO3gv1v3g*r;nCs9Q7{T1 Z006d%vTS#4*XaNN002ovPDHLkV1j;AfS&*W