From 9d51c74f56c49fea06682e97b6473e041a0baaea Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 10:05:06 +0800 Subject: [PATCH] Rig sprite: slightly top-down view like the game's machines Top face with vents and an indicator, lit left edge, darker right side, front with three card bays and a power port, two feet, rounded outline. The cell-centre check still passes, so nothing can sit under it. Co-Authored-By: Claude Sonnet 5.5 --- CHANGELOG.md | 1 + art/sprites.py | 89 ++++++++++++++---- .../ModFiles/Textures/Items/rig.png | Bin 246 -> 305 bytes 3 files changed, 73 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a6fe53..4dd8081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,4 +11,5 @@ - 命名:币为 PSC,合规交易所为 Poinbase,入口人脉升级为 Web3 治理社区。 - 入口升级归入游戏原有的"服务"栏(和 Probably Automated 一样),图标用交易终端。 - 修复矿架、交易终端与别的物品重叠:游戏按 mod 物品图每格中心的一个像素判断这一格算不算占用,矿架的卡位之间有缝,缝正好落在中心行上,8 格被当成空格。矿架加了实心背板、终端支架拉通;art/sprites.py 生成时按游戏的方式检查每格中心,有透明格就报错。 +- 矿架重画成和原版机器一样的略微俯视:顶面(带散热格栅和指示灯)、受光的左缘、暗的右侧面、正面三层显卡位和电源口、底部两只脚,轮廓削圆。 diff --git a/art/sprites.py b/art/sprites.py index cff09b4..bd9989a 100644 --- a/art/sprites.py +++ b/art/sprites.py @@ -108,24 +108,79 @@ def gpu(accent, accent_dark, burnt=False): def rig(): - """矿架(48×48,3×3 格):开放式机架,四层显卡位,左下电源。""" + """矿架(48×48,3×3 格):和游戏里其他机器一样的略微俯视(3/4 视角)——顶面是上窄下宽的梯形, + 下面是正面,正面里四层显卡位,左下角电源;光从左上来,左亮右暗;轮廓统一深紫、削掉尖角、底下两只脚和一圈阴影。""" c = Canvas(48, 48) - c.box(2, 3, 45, 44, 'd') # 外框 + 背板:内部不透明,否则游戏按格子中心像素判断占格会把空隙当成空格 - for y in range(4, 44): - c.put(3, y, 'b'); c.put(44, y, 'd') - for x in range(3, 45): - c.put(x, 4, 'l'); c.put(x, 43, 'k') - for i, y in enumerate((8, 16, 24, 32)): # 四层卡位 - c.rect(6, y, 41, y + 5, 'k') - c.rect(6, y, 41, y, 'g') - for x in range(8, 40, 3): - c.put(x, y + 2, 'g'); c.put(x, y + 3, 'g') - c.put(40, y + 2, 'G' if i % 2 == 0 else 'R') - c.box(6, 38, 17, 42, 'd') # 电源 - c.put(15, 40, 'S') - for x in range(20, 42, 2): # 底部走线 - c.put(x, 40, 'm') - c.rect(2, 45, 45, 46, 'k') # 脚 + FL, FR, FY, DEP = 3, 44, 24, 19 # 正面左右边、顶面前沿所在行、顶面深度(顶面后沿在 y=6,中心行 y=8 落在顶面上) + BOT = 44 # 正面底边 + inset = lambda v: v // 6 # 顶面后部只略微收窄:原版机器的顶面也近似矩形,并且要让左右两格的中心落在顶面内 + + # 顶面:后部受光、前部稍暗;左缘亮、右缘暗 + for v in range(DEP): + y = FY - v + x0, x1 = FL + inset(v), FR - inset(v) + for x in range(x0, x1 + 1): + c.put(x, y, 'l' if v >= 4 else 'b') + c.put(x0, y, 'h'); c.put(x0 + 1, y, 'l') + c.put(x1, y, 'd'); c.put(x1 - 1, y, 'm') + for x in range(FL + inset(DEP - 1), FR - inset(DEP - 1) + 1): + c.put(x, FY - DEP + 1, 'l') + # 顶面上的散热格栅和一个小指示灯 + for v in range(4, 16, 3): + for u in range(6, 24): + c.put(FL + inset(v) + u, FY - v, 'g') + c.put(FR - 9, FY - 8, 'G'); c.put(FR - 8, FY - 8, 'G') + # 正面:中间色,左端受光、右端暗;顶部一条暗折线 + for y in range(FY + 1, BOT + 1): + for x in range(FL, FR + 1): + c.put(x, y, 'm') + c.put(FL, y, 'b'); c.put(FL + 1, y, 'l' if y < FY + 5 else 'b') + for dx in range(4): + c.put(FR - dx, y, 'd' if dx else 'k') + for x in range(FL, FR + 1): + c.put(x, FY + 1, 'k') + c.put(x, BOT, 'd') + for x in range(FL + 1, FR): + c.put(x, FY, 'h') + c.put(x, FY + 2, 'b') + for x in range(FL + 1, FR): + c.put(x, BOT - 1, 'd') + # 正面里的四层显卡位(深色槽,上沿亮、下沿暗,右端一颗状态灯) + # 正面四层显卡位(深色槽,右端一颗状态灯);间隔行用中间色,保证每格中心都不透明 + for i, y in enumerate((FY + 3, FY + 8, FY + 13)): + for x in range(FL + 3, FR - 4): + for dy in range(3): + c.put(x, y + dy, 'k') + c.put(x, y, 'g') + for x in range(FL + 6, FR - 6, 3): + c.put(x, y + 1, 'd') + c.put(FR - 4, y + 1, 'G' if i % 2 == 0 else 'R') + # 电源口(左下) + for x in range(FL + 3, FL + 12): + for dy in (-3, -2): + c.put(x, BOT + dy, 'k') + c.put(FL + 10, BOT - 2, 'S') + for x in range(FL + 15, FR - 4, 2): + c.put(x, BOT - 2, 'g') + # 底部两只脚 + for x in (FL + 2, FL + 3, FR - 3, FR - 2): + c.put(x, BOT + 1, 'O'); c.put(x, BOT + 2, 'O') + + # 轮廓:实体像素挨着透明的一圈描成轮廓色,再削掉尖角 + solid = lambda v: v is not None + get = lambda x, y: c.px[y][x] if 0 <= x < c.w and 0 <= y < c.h else None + edge = [(x, y) for y in range(c.h) for x in range(c.w) + if solid(get(x, y)) and any(not solid(get(x + dx, y + dy)) for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)))] + for x, y in edge: + c.put(x, y, 'O') + for y in range(c.h): + for x in range(c.w): + if get(x, y) == 'O' and sum(solid(get(x + dx, y + dy)) for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1))) <= 1: + c.px[y][x] = None + # 圆角:正面底部两角各削一个像素,让轮廓和原版机器一样不是尖方块 + for x, y in ((FL, BOT), (FR, BOT), (FL, BOT + 0), (FR, BOT + 0)): + c.px[y][x] = None + c.px[y][x + (1 if x == FL else -1)] = 'O' return c diff --git a/src/Decentralized/ModFiles/Textures/Items/rig.png b/src/Decentralized/ModFiles/Textures/Items/rig.png index 3c08aa0b3bff4c7340d024d30a809b55a9ab74a5..2480244266c57020aca6b2811aebb06cca1d49ab 100644 GIT binary patch delta 278 zcmV+x0qOqs0kHy*B!BoxL_t(|+U=RK3c^4TMDs0n_KKY#h=quajUZ@gK1Hl8Z3AK< z`H1|NVTF@Jh3w+R%;GEzNpT1JvNK6YvW&%Iu^_A88{Cm(ZvJvBV6@9~8w3Fe&=SCE zy-6ZYz*F;P2sHa718_fqUub(?K12(-wGe9aY6w*Om;nx_BY&g_-~ynkN@z6#jD{0v zH3Fd8CrFh6@mi`|=eLqxrnALUYJhlbvaySEk-Qt307BYPJa3*r06@}z0=NzFrwnu% z;&MJ_h#6vr*mH>aBzBtt?bUG!u)h{>03mRxk7j^)F``r-x8lVJQaAtlixuscZ+jci c06bL<-%M3j%@09a5C8xG07*qoM6N<$g2vQ&_y7O^ delta 218 zcmdnU^o?7srr_TgeF$tcx409D+|i`5$m7!gfQ_-Ajs%g;fiZy{^}bo6mRb zcegcAu@R6Fv|V9vQqI7Cb4u3<9{e(9=EbE+aGm9KQFu~u+`5N=$uLm-04WjsY z`jSeTr{4v$dtk!1Z$RIuD~D}(-hkY`?56K zZvE)tnRP+gn5`{FP9jH@U$5sfvvbv=>J=?^JpA_jJfRE>#?A9La$S`8#Q+4Ju6{1- HoD!M<>hM=B