Terminal and graphics cards redrawn; rig slots 2 to 5 with electronics
Terminal: monitor with a top face and a trapezoid keyboard. Graphics card: a metal bracket with ports, two fans, brand stripe, gold fingers with a PCIe notch and power connectors on top, now 2x2 cells. Rig: two slots by default, an upgrade slot that takes the next level's electronics (4 common, 1 rare, 2 rare) and consumes them at once; the card grid reshapes with the slot count, which is kept on the rig's tags. Verified in game, including the slot limit, the upgrade items, five cards, and save and reload. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9d51c74f56
commit
3a4572efb6
12 files changed
+252
-40
No files matched your search
+114
-33
@@ -78,32 +78,75 @@ class Canvas:
|
||||
|
||||
|
||||
def gpu(accent, accent_dark, burnt=False):
|
||||
"""显卡(32×16,2×1 格):外壳、两个风扇、品牌色条、金手指。"""
|
||||
c = Canvas(32, 16)
|
||||
c.box(1, 2, 30, 12, 'm')
|
||||
c.rect(2, 3, 29, 3, 'l') # 顶边受光
|
||||
c.rect(2, 11, 29, 11, 'd') # 底边暗面
|
||||
for cx in (9, 21): # 风扇
|
||||
for y in range(5, 11):
|
||||
for x in range(cx - 4, cx + 5):
|
||||
dx, dy = x - cx, y - 7.5
|
||||
if dx * dx + dy * dy <= 16:
|
||||
"""显卡(32×32,2×2 格),略微俯视:顶面是带两个风扇的散热罩,左端金属挡板(带接口),
|
||||
前沿露出 PCB 和金手指,右端一道暗侧面,顶上一排供电口。每格中心都不透明。"""
|
||||
c = Canvas(32, 32)
|
||||
TOP0, TOP1 = 4, 22 # 顶面行范围
|
||||
L, R = 6, 29 # 顶面左右(左边是挡板)
|
||||
# 金属 I/O 挡板(左端竖条,带两个接口孔)
|
||||
c.rect(1, 2, 5, 27, 'b')
|
||||
c.rect(1, 2, 1, 27, 'h'); c.rect(5, 2, 5, 27, 'd')
|
||||
for y in (6, 12): # 两个视频接口(深色矩形孔,带高光边)
|
||||
c.rect(2, y, 4, y + 3, 'k')
|
||||
c.rect(2, y, 4, y, 'g')
|
||||
c.put(3, 20, 'k'); c.put(3, 22, 'k'); c.put(3, 24, 'k') # 下部散热孔
|
||||
# 散热罩顶面
|
||||
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')
|
||||
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)
|
||||
# 两个风扇(圆形,叶片用十字 + 斜线)
|
||||
for cx in (11, 22):
|
||||
cy = 13
|
||||
for y in range(cy - 6, cy + 7):
|
||||
for x in range(cx - 6, cx + 7):
|
||||
d2 = (x - cx) ** 2 + (y - cy) ** 2
|
||||
if d2 <= 36:
|
||||
c.put(x, y, 'k')
|
||||
if 6 <= dx * dx + dy * dy <= 16:
|
||||
if 20 <= d2 <= 30:
|
||||
c.put(x, y, 'g')
|
||||
c.put(cx, 7, 'b'); c.put(cx, 8, 'b')
|
||||
c.rect(2, 4, 29, 4, accent) # 品牌色条
|
||||
c.put(2, 5, accent_dark); c.put(29, 5, accent_dark)
|
||||
c.rect(6, 13, 25, 13, 'Y') # 金手指
|
||||
for x in range(6, 26, 2):
|
||||
c.put(x, 14, 'Y')
|
||||
c.rect(30, 3, 30, 11, 'k') # 挡板
|
||||
for k in range(-4, 5):
|
||||
if abs(k) >= 1:
|
||||
c.put(cx + k, cy, 'g'); c.put(cx, cy + k, 'g')
|
||||
c.put(cx - 2, cy - 2, 'g'); c.put(cx + 2, cy + 2, 'g'); c.put(cx + 2, cy - 2, 'g'); c.put(cx - 2, cy + 2, 'g')
|
||||
c.rect(cx - 1, cy - 1, cx + 1, cy + 1, 'b')
|
||||
c.put(cx, cy, 'h')
|
||||
# 前沿: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): # 金手指:连续金色带,中间一道缺口(PCIe 键位),带深色触点线
|
||||
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 + 13, y, 'k'); c.put(L + 14, y, 'k')
|
||||
# 顶上一排供电口(两个黑色插口)
|
||||
for x0 in (L + 3, L + 9):
|
||||
c.rect(x0, TOP0 - 1, x0 + 4, TOP0 - 1, 'k')
|
||||
# 保证每格中心不透明:下半部(第二行格子,y 16..31 的中心 y=24)落在金手指/PCB 上
|
||||
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 [(7, 5), (8, 6), (10, 9), (19, 6), (20, 7), (22, 9), (14, 8), (15, 7), (24, 5)]:
|
||||
for x, y in [(9, 8), (10, 9), (13, 17), (24, 8), (25, 9), (27, 18), (17, 12), (18, 11)]:
|
||||
c.put(x, y, 'c')
|
||||
c.rect(2, 4, 29, 4, 'e')
|
||||
for x, y in [(12, 3), (13, 3), (17, 11), (26, 10)]:
|
||||
for x in range(L + 1, R - 1):
|
||||
c.put(x, TOP1 - 1, 'e')
|
||||
for x, y in [(15, 5), (16, 5), (20, 21), (26, 14)]:
|
||||
c.put(x, y, 'c')
|
||||
# 轮廓
|
||||
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')
|
||||
return c
|
||||
|
||||
|
||||
@@ -185,20 +228,58 @@ def rig():
|
||||
|
||||
|
||||
def terminal():
|
||||
"""交易终端(32×32,2×2 格):小型显示器 + 键盘,屏幕上是 K 线。"""
|
||||
"""交易终端(32×32,2×2 格),略微俯视:显示器是一个带顶面的盒子(正面是屏幕和 K 线),
|
||||
下面是键盘的顶面(梯形,露出按键),左亮右暗。每格中心都不透明。"""
|
||||
c = Canvas(32, 32)
|
||||
c.box(3, 2, 28, 21, 'm')
|
||||
c.rect(4, 3, 27, 3, 'l')
|
||||
c.box(5, 4, 26, 18, 's')
|
||||
candles = [(8, 12, 15), (11, 10, 14), (14, 11, 13), (17, 7, 12), (20, 8, 11), (23, 5, 10)]
|
||||
for x, top, bot in candles:
|
||||
c.rect(x, top, x, bot, 'S')
|
||||
c.put(x, top - 1, 'T')
|
||||
c.rect(3, 22, 28, 23, 'd') # 支架(拉通,保证每格中心点不透明)
|
||||
c.box(2, 24, 29, 30, 'b') # 键盘
|
||||
for y in (26, 28):
|
||||
for x in range(4, 28, 2):
|
||||
# 显示器:顶面(浅色窄条,略收窄)+ 正面
|
||||
for v in range(4):
|
||||
y = 3 + v
|
||||
x0, x1 = 4 + (3 - v) // 3, 27 - (3 - v) // 3
|
||||
for x in range(x0, x1 + 1):
|
||||
c.put(x, y, 'l' if v else 'h')
|
||||
c.put(x1, y, 'd')
|
||||
for y in range(7, 21):
|
||||
for x in range(4, 28):
|
||||
c.put(x, y, 'm')
|
||||
c.put(4, y, 'b'); c.put(27, y, 'd'); c.put(26, y, 'd')
|
||||
# 屏幕(深青底、K 线)
|
||||
for y in range(9, 19):
|
||||
for x in range(7, 25):
|
||||
c.put(x, y, 's')
|
||||
candles = [(9, 13, 16), (12, 11, 15), (15, 12, 14), (18, 9, 13), (21, 10, 12), (23, 9, 11)]
|
||||
for x, top, bot in candles:
|
||||
for y in range(top, bot + 1):
|
||||
c.put(x, y, 'S')
|
||||
c.put(x, top - 1 if top > 9 else top, 'T')
|
||||
c.put(7, 9, 'T'); c.put(8, 9, 'T')
|
||||
# 支架 + 底座(拉通到键盘,保证 y=24 的格子中心不透明)
|
||||
c.rect(13, 21, 18, 22, 'd')
|
||||
# 键盘顶面:梯形(后窄前宽),按键网格
|
||||
for v in range(7):
|
||||
y = 24 + (6 - v) # v=0 是前沿(y=30)
|
||||
w = v // 3
|
||||
x0, x1 = 2 + w, 29 - w
|
||||
for x in range(x0, x1 + 1):
|
||||
c.put(x, y, 'b')
|
||||
c.put(x0, y, 'h'); c.put(x1, y, 'd')
|
||||
for y in (25, 27, 29):
|
||||
for x in range(5, 27, 2):
|
||||
c.put(x, y, 'm')
|
||||
c.rect(10, 29, 21, 29, 'm') # 空格键
|
||||
# 键盘前沿(正面薄边)
|
||||
for x in range(2, 30):
|
||||
c.put(x, 31, 'd')
|
||||
# 键盘与显示器之间的缝隙用桌面阴影色填实,避免 y=24 行出现透明格
|
||||
for y in range(22, 24):
|
||||
for x in range(4, 28):
|
||||
if c.px[y][x] is None:
|
||||
c.put(x, y, 'k')
|
||||
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')
|
||||
return c
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user