From 847b329c3965716fed65a692384f4a26fe0477d1 Mon Sep 17 00:00:00 2001 From: junshenlale Date: Mon, 25 May 2026 17:36:37 +0800 Subject: [PATCH] Add bounty signal console pixel art --- assets/pixel-art/bounty-signal-console.png | Bin 0 -> 1266 bytes demos/bounty-signal-console-demo.mp4 | Bin 0 -> 32832 bytes scripts/generate_bounty_signal_console.py | 208 +++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 assets/pixel-art/bounty-signal-console.png create mode 100644 demos/bounty-signal-console-demo.mp4 create mode 100644 scripts/generate_bounty_signal_console.py diff --git a/assets/pixel-art/bounty-signal-console.png b/assets/pixel-art/bounty-signal-console.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d3b102b5e0b5d77b94a807d202ed4b03caa61a GIT binary patch literal 1266 zcmV$-Mw*|x+=ve_R`(P_90I>!3a8Zg}Ok_J_d;B|JarCa^ zyt$6&*fT!YNw$aA?{CkZzr2I8t@7p;fIUC}2tX&8Ccrr+oI(BC^~?Z-06GBz0CE7< z#pnQl5C9;6G2DJWk^@*>2k*{5fDT}ADB*A8N)f1GK+pE( z^lkSXK-$<|gh|x_dOEbG%_U6o@>V9E7fouASl5_{9=01_srj0%l& zB-y^!43%>IwMTr{Bv5jZ($3Ow%2mRr^*z0(`Dz4s_wn=e*quL1TZhvD_C`ItdIK6D zM1Zb300ihyfbJmx=d>fhlcz847?J>P13@{O5TIlo2?6>OpsNl50T!46Y7yY=uUiq$ zo$=|*_i8BluJiwXxP8k81b_hjbAS>ZfN8sb4$xHxz-ijnc0o=w) zcK~ZRZr@p(YUjt-+Ykis_3siPz_-QwynS4Q0LQj!sh!>Nhx6Ufxig8+`BFQvN7gJu zfDprb5Fj+_-Q%qYAbDm{(;Prs2WUY6_oj-No%2XP%D!VQ2$1sBvT1by4FdS?n(;Y5 zX2&<`eFSjpYUThr&n+|^0(>O!9cw)U98N#~Z8Za!$^p&}PbGkM4&XXF^m)1*KwAgU zUIiRZ4~2!=tANmS?<*guxe73;1H^KI+B!fD0xYcqtfmCkB0#PZ2muze)BU#q_5-jV zfEj?FgCPI}U{9dUJ%QX8z=asmxIN6cR` z1f(W@l7z6-`6-E?Bq1zyzMJ?hMS$GwU$Pn~b$$s6a^`m z2Pk=o;)vjV0T6(ngU^X1xV7q+3;|b8*K(}J$Y}LFy@{~(Oz3htVzhI#oGcj}O>zLOa_E9m zVrH&AY5TOV_v-wV{?Kk;bsZpQBx{YZ8l$%McWd`i_YlzAp(~$TlL*_$A_Xv_15j^J z2LMRH00MyFasbM<%FF;!p5C9+mKnI|V4gd%N00IDX0P4{J03iTC c0I($f0+Rba-v0eGPyhe`07*qoM6N<$f(P*?+5i9m literal 0 HcmV?d00001 diff --git a/demos/bounty-signal-console-demo.mp4 b/demos/bounty-signal-console-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e895178c62d19c8bb5d74e8158df32882e409e82 GIT binary patch literal 32832 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 cK list[list[tuple[int, int, int, int]]]: + return [[color for _ in range(WIDTH)] for _ in range(HEIGHT)] + + +def pixel(img, x, y, color): + if 0 <= x < WIDTH and 0 <= y < HEIGHT: + img[y][x] = color + + +def rect(img, x, y, w, h, color): + for yy in range(y, y + h): + for xx in range(x, x + w): + pixel(img, xx, yy, color) + + +def border(img, x, y, w, h, color): + rect(img, x, y, w, 1, color) + rect(img, x, y + h - 1, w, 1, color) + rect(img, x, y, 1, h, color) + rect(img, x + w - 1, y, 1, h, color) + + +def line(img, x0, y0, x1, y1, color): + dx = abs(x1 - x0) + sx = 1 if x0 < x1 else -1 + dy = -abs(y1 - y0) + sy = 1 if y0 < y1 else -1 + err = dx + dy + while True: + pixel(img, x0, y0, color) + if x0 == x1 and y0 == y1: + break + e2 = 2 * err + if e2 >= dy: + err += dy + x0 += sx + if e2 <= dx: + err += dx + y0 += sy + + +def diamond(img, cx, cy, r, color): + for y in range(cy - r, cy + r + 1): + span = r - abs(cy - y) + rect(img, cx - span, y, span * 2 + 1, 1, color) + + +def draw_icon(img, index, cx, cy, color): + if index == 0: + border(img, cx - 4, cy - 4, 9, 9, color) + rect(img, cx - 2, cy - 2, 5, 5, PALETTE["bg"]) + elif index == 1: + line(img, cx - 5, cy, cx - 1, cy + 4, color) + line(img, cx - 1, cy + 4, cx + 5, cy - 4, color) + elif index == 2: + line(img, cx - 6, cy, cx, cy - 4, color) + line(img, cx, cy - 4, cx + 6, cy, color) + line(img, cx + 6, cy, cx, cy + 4, color) + line(img, cx, cy + 4, cx - 6, cy, color) + rect(img, cx - 1, cy - 1, 3, 3, color) + elif index == 3: + line(img, cx - 5, cy + 4, cx, cy - 1, color) + line(img, cx, cy - 1, cx + 5, cy + 4, color) + line(img, cx, cy - 5, cx, cy + 5, color) + rect(img, cx - 1, cy - 6, 3, 3, color) + rect(img, cx - 6, cy + 3, 3, 3, color) + rect(img, cx + 4, cy + 3, 3, 3, color) + else: + diamond(img, cx, cy, 6, color) + rect(img, cx - 2, cy - 4, 5, 9, PALETTE["bg"]) + rect(img, cx - 1, cy - 3, 3, 7, color) + + +def draw_art(active_step: int = 4): + img = blank(PALETTE["bg"]) + + for n in range(0, WIDTH, 8): + for p in range(0, HEIGHT, 4): + pixel(img, n, p, PALETTE["grid"]) + pixel(img, p, n, PALETTE["grid"]) + + for x in range(18, 111, 11): + line(img, x, 22, 64, 40, PALETTE["grid"]) + line(img, x, 106, 64, 88, PALETTE["grid"]) + + rect(img, 18, 30, 92, 68, PALETTE["panel_shadow"]) + rect(img, 15, 27, 92, 68, PALETTE["panel"]) + border(img, 15, 27, 92, 68, PALETTE["panel_hi"]) + rect(img, 19, 31, 84, 8, PALETTE["panel_shadow"]) + rect(img, 22, 34, 16, 2, PALETTE["cyan"]) + rect(img, 42, 34, 23, 2, PALETTE["muted"]) + rect(img, 69, 34, 11, 2, PALETTE["muted"]) + rect(img, 84, 34, 15, 2, PALETTE["green"]) + + colors = [ + PALETTE["cyan"], + PALETTE["green"], + PALETTE["purple"], + PALETTE["white"], + PALETTE["gold"], + ] + xs = [28, 46, 64, 82, 100] + for i, cx in enumerate(xs): + light = colors[i] if i <= active_step else PALETTE["muted"] + rect(img, cx - 7, 51, 14, 21, PALETTE["panel_shadow"]) + border(img, cx - 7, 51, 14, 21, PALETTE["panel_hi"]) + draw_icon(img, i, cx, 61, light) + rect(img, cx - 4, 76, 9, 2, light) + + line(img, 28, 84, 100, 84, PALETTE["muted"]) + for i, cx in enumerate(xs): + diamond(img, cx, 84, 3, colors[i] if i <= active_step else PALETTE["muted"]) + + rect(img, 23, 89, 78, 2, PALETTE["cyan"]) + rect(img, 23, 92, 52, 2, PALETTE["green"]) + rect(img, 23, 95, 68, 2, PALETTE["gold"]) + + diamond(img, 64, 19, 8, PALETTE["gold"]) + rect(img, 62, 14, 5, 11, PALETTE["bg"]) + rect(img, 63, 15, 3, 9, PALETTE["gold"]) + + return img + + +def write_png(path: str, img): + os.makedirs(os.path.dirname(path), exist_ok=True) + raw = bytearray() + for row in img: + raw.append(0) + for rgba in row: + raw.extend(rgba) + + def chunk(kind: bytes, data: bytes) -> bytes: + return ( + struct.pack(">I", len(data)) + + kind + + data + + struct.pack(">I", zlib.crc32(kind + data) & 0xFFFFFFFF) + ) + + png = b"\x89PNG\r\n\x1a\n" + png += chunk(b"IHDR", struct.pack(">IIBBBBB", WIDTH, HEIGHT, 8, 6, 0, 0, 0)) + png += chunk(b"IDAT", zlib.compress(bytes(raw), 9)) + png += chunk(b"IEND", b"") + + with open(path, "wb") as f: + f.write(png) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--output", + default="assets/pixel-art/bounty-signal-console.png", + help="PNG output path", + ) + parser.add_argument( + "--frames-dir", + help="Optional directory for demo animation frames", + ) + args = parser.parse_args() + + write_png(args.output, draw_art(active_step=4)) + + if args.frames_dir: + os.makedirs(args.frames_dir, exist_ok=True) + frame = 0 + for active in [0, 1, 2, 3, 4, 3, 4, 4]: + for _ in range(6): + frame += 1 + write_png( + os.path.join(args.frames_dir, f"frame-{frame:03d}.png"), + draw_art(active_step=active), + ) + + +if __name__ == "__main__": + main()