From 47b61af7c080fd97d9016ad8fcb7c48d46019993 Mon Sep 17 00:00:00 2001 From: spybrhy Date: Tue, 26 May 2026 23:44:50 +0300 Subject: [PATCH 1/2] Add milestone koi pond pixel art --- assets/pixel-art/milestone-koi-pond.png | Bin 0 -> 1493 bytes scripts/generate_milestone_koi_pixel_art.py | 201 ++++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 assets/pixel-art/milestone-koi-pond.png create mode 100644 scripts/generate_milestone_koi_pixel_art.py diff --git a/assets/pixel-art/milestone-koi-pond.png b/assets/pixel-art/milestone-koi-pond.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf55e82b595660eada972af13919241e74c35a3 GIT binary patch literal 1493 zcmV;`1uFW9P)G_36g~$Q8|Nfna zX*hr$0C<(Kh{ga;9z3jCXYq!^odJWe(E;EWGHwZSHn=6o+2Hnoao8vT@CzBY1UVbr z669=fd%#d^N&)zVj9Y@74Q>f?Hn=@tG&V&5{6YpTL9f4m{dfH~gtKW@f+hfggwLCv zdcc5eK<{i&01SKMBmpq{IO`I$Z#I4RfE}<=20*;^OaV-v zuPAu*!lwNUxV$>dW`MQs1jU98ApJNM0BbW~-wmL430ms`fk8S0Hs^sLStSoD#B3ga ze2(6PX8=quWGy8lGhE1c8ZUpmI{qC?3!0j6%s{;%*DNw=-qVN~@Bn0ve#)abCIE#j ziOP~4o3-r!{roM&jKMUVnjEbKKwQn}(w-5UwaSwMh-*=e=K;hkD=;VrV5clm&Tf%G z+5_TF0A$jO0o)wUSV06(;Vv`7Ak9A9L;1kK6hNKkOvyf|N$&^%sst6Do%uRI@#wqj z0eds)33R>Le@T@kH|br}oB2VLB zp}e|hlU`cW*Z#zmSI08x#Q^@CzhFf*ZNq8?fUr5Ld%6HRFzJD?sV}d(Ne@?E9nqv` zDzCapZ+kckd39)$UXv0;msi`E^pKmgk-RDpiwsSA$j#Yk25e%Wi$(e~fR(KB*LviK zQ;}D>GXS>)Ehfuiw`@FIIP!9JkFtNenMn`7IjaCL5>^#Vdf?5O`&4pqI2B#5#tguJ zIgePd8em7 zjm$3)mk1~(J=Xg{WJk|U{bu&3xV$=K7_e4q%}jdS_k#$Io}T@+t%ejB>I`a_^jPl) z5!}Emrap7+>jH=wP!!YJB}n#ukdm6S2q2UZ(;0C40pTZAO?uq-gA`u-br`S~2a7O>t~wo)Uj6K|)?6j27xZCPAu?PC$nKFX z0IX42`=_|6WaK%O-56LVJy!Nrgon+D)uf%6^zs!6hr#sWy8DsZnDkidWC4J342yTJ zVgT)XK+Hz)9!)WW{1Sl+fc18RX6pdfwVz)n$3qk{$go-b`5FN3-XScLo?x9Ej{bO7 zS{bJl`Zz2aTQid$Yn{Bv_^1d`=Xsy8n>Z} z>tx*x5HbL|0&wGXK-|Z)o}C#z4K5UbJ22^~ycbYq2IPkm3&4mbJtISlT?rzJkMz>o z-lS(?Xi?dTRj09aVA7+%q$!;}7O5Ak18l!ZucIxxl#KWHO?u;aG(f*eZ=7UV3^%$- zulaCp(rY=KoAlZbH?&C)VYuN;dT7H9WYWVNZXlB$=5V8!^pM}CvuBeY{&2V^y+MKj vz{4&a05$-R8VzF&fJgms01m(bcr=XvMcX$pMX+u_00000NkvXXu0mjf0Fth1 literal 0 HcmV?d00001 diff --git a/scripts/generate_milestone_koi_pixel_art.py b/scripts/generate_milestone_koi_pixel_art.py new file mode 100644 index 000000000..3ea653355 --- /dev/null +++ b/scripts/generate_milestone_koi_pixel_art.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +"""Generate the milestone koi pond pixel-art bounty asset.""" + +from __future__ import annotations + +import struct +import zlib +from pathlib import Path + + +WIDTH = 128 +HEIGHT = 128 +OUT = Path("assets/pixel-art/milestone-koi-pond.png") + +PALETTE = { + "ink": (18, 27, 35), + "deep": (18, 49, 56), + "water": (30, 92, 96), + "water_hi": (45, 130, 123), + "mint": (107, 184, 155), + "foam": (170, 226, 198), + "stone": (104, 126, 132), + "stone_hi": (157, 178, 174), + "stone_shadow": (57, 74, 82), + "card": (223, 229, 210), + "card_dark": (145, 154, 141), + "banana": (245, 198, 67), + "banana_hi": (255, 229, 118), + "orange": (217, 117, 62), + "coral": (225, 92, 86), + "leaf": (58, 143, 83), + "leaf_hi": (102, 188, 105), + "pink": (231, 149, 176), + "night": (12, 18, 28), +} + + +def new_canvas(color: tuple[int, int, int]) -> list[list[tuple[int, int, int]]]: + return [[color for _ in range(WIDTH)] for _ in range(HEIGHT)] + + +def set_px(img, x: int, y: int, color: tuple[int, int, int]) -> None: + if 0 <= x < WIDTH and 0 <= y < HEIGHT: + img[y][x] = color + + +def rect(img, x: int, y: int, w: int, h: int, color: tuple[int, int, int]) -> None: + for yy in range(y, y + h): + for xx in range(x, x + w): + set_px(img, xx, yy, color) + + +def ellipse(img, cx: int, cy: int, rx: int, ry: int, color: tuple[int, int, int]) -> None: + rxs = rx * rx + rys = ry * ry + lim = rxs * rys + for yy in range(cy - ry, cy + ry + 1): + for xx in range(cx - rx, cx + rx + 1): + if ((xx - cx) ** 2) * rys + ((yy - cy) ** 2) * rxs <= lim: + set_px(img, xx, yy, color) + + +def line(img, x0: int, y0: int, x1: int, y1: int, color: tuple[int, int, int]) -> None: + dx = abs(x1 - x0) + dy = -abs(y1 - y0) + sx = 1 if x0 < x1 else -1 + sy = 1 if y0 < y1 else -1 + err = dx + dy + while True: + set_px(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 outline_rect(img, x: int, y: int, w: int, h: int, color: tuple[int, int, int]) -> None: + 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 add_ripples(img) -> None: + rings = [ + (32, 39, 12, 4), + (57, 54, 14, 4), + (83, 69, 15, 5), + (55, 101, 20, 6), + (95, 93, 15, 5), + ] + for cx, cy, rx, ry in rings: + for offset in (0, 2): + for x in range(cx - rx, cx + rx + 1, 2): + yy = cy + (((x - cx) * (x - cx) * ry) // max(rx * rx, 1)) - ry + offset + set_px(img, x, yy, PALETTE["water_hi"]) + set_px(img, x, cy + (cy - yy) + offset, PALETTE["water_hi"]) + + +def add_work_cards(img) -> None: + cards = [ + (15, 29, 21, 13, PALETTE["mint"]), + (40, 42, 22, 13, PALETTE["banana"]), + (67, 56, 22, 13, PALETTE["coral"]), + (92, 70, 22, 13, PALETTE["foam"]), + ] + for x, y, w, h, accent in cards: + rect(img, x + 2, y + 2, w, h, PALETTE["stone_shadow"]) + rect(img, x, y, w, h, PALETTE["card"]) + outline_rect(img, x, y, w, h, PALETTE["card_dark"]) + rect(img, x + 3, y + 3, w - 6, 2, accent) + rect(img, x + 4, y + 7, w - 8, 1, PALETTE["card_dark"]) + rect(img, x + 4, y + 10, w - 11, 1, PALETTE["card_dark"]) + for start, end in [((36, 37), (40, 47)), ((62, 49), (67, 61)), ((89, 63), (92, 75))]: + line(img, start[0], start[1], end[0], end[1], PALETTE["foam"]) + + +def add_koi(img) -> None: + ellipse(img, 67, 92, 23, 10, PALETTE["orange"]) + ellipse(img, 72, 90, 19, 8, PALETTE["banana"]) + ellipse(img, 76, 88, 12, 5, PALETTE["banana_hi"]) + ellipse(img, 48, 94, 8, 6, PALETTE["orange"]) + line(img, 44, 88, 52, 94, PALETTE["orange"]) + line(img, 45, 101, 52, 95, PALETTE["orange"]) + ellipse(img, 72, 103, 9, 5, PALETTE["banana"]) + ellipse(img, 77, 81, 7, 4, PALETTE["banana"]) + rect(img, 90, 89, 2, 2, PALETTE["night"]) + rect(img, 62, 87, 8, 3, PALETTE["coral"]) + rect(img, 80, 96, 7, 3, PALETTE["coral"]) + for x, y in [(58, 89), (67, 97), (78, 86), (85, 93)]: + set_px(img, x, y, PALETTE["foam"]) + + +def add_plants_and_fireflies(img) -> None: + for cx, cy in [(21, 89), (31, 99), (102, 103), (111, 43)]: + ellipse(img, cx, cy, 8, 4, PALETTE["leaf"]) + ellipse(img, cx + 2, cy - 1, 4, 2, PALETTE["leaf_hi"]) + rect(img, cx + 1, cy - 1, 2, 2, PALETTE["pink"]) + for x, y in [(22, 23), (52, 28), (73, 39), (96, 54), (107, 66), (36, 68), (30, 51)]: + rect(img, x, y, 2, 2, PALETTE["banana_hi"]) + set_px(img, x - 1, y, PALETTE["mint"]) + set_px(img, x + 2, y + 1, PALETTE["mint"]) + + +def add_border_and_texture(img) -> None: + rect(img, 0, 0, WIDTH, 4, PALETTE["ink"]) + rect(img, 0, HEIGHT - 4, WIDTH, 4, PALETTE["ink"]) + rect(img, 0, 0, 4, HEIGHT, PALETTE["ink"]) + rect(img, WIDTH - 4, 0, 4, HEIGHT, PALETTE["ink"]) + rect(img, 5, 5, WIDTH - 10, 2, PALETTE["water_hi"]) + rect(img, 5, HEIGHT - 7, WIDTH - 10, 2, PALETTE["water_hi"]) + rect(img, 5, 5, 2, HEIGHT - 10, PALETTE["water_hi"]) + rect(img, WIDTH - 7, 5, 2, HEIGHT - 10, PALETTE["water_hi"]) + for y in range(8, HEIGHT - 8): + for x in range(8, WIDTH - 8): + if (x * 7 + y * 11) % 37 == 0: + set_px(img, x, y, PALETTE["deep"]) + elif (x * 5 + y * 3) % 53 == 0: + set_px(img, x, y, PALETTE["water"]) + + +def write_png(path: Path, img) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + raw_rows = [] + for row in img: + raw_rows.append(b"\x00" + b"".join(bytes(pixel) for pixel in row)) + raw = b"".join(raw_rows) + + 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("IHDR".encode(), struct.pack(">IIBBBBB", WIDTH, HEIGHT, 8, 2, 0, 0, 0)) + png += chunk("IDAT".encode(), zlib.compress(raw, 9)) + png += chunk("IEND".encode(), b"") + path.write_bytes(png) + + +def main() -> None: + img = new_canvas(PALETTE["water"]) + add_border_and_texture(img) + add_ripples(img) + add_work_cards(img) + add_koi(img) + add_plants_and_fireflies(img) + write_png(OUT, img) + print(f"Wrote {OUT} ({WIDTH}x{HEIGHT})") + + +if __name__ == "__main__": + main() From 5d057b5bdfcf970b3b4b84da91c78051c9d0287b Mon Sep 17 00:00:00 2001 From: spybrhy Date: Wed, 27 May 2026 16:01:02 +0300 Subject: [PATCH 2/2] Add pixel art demo proof --- demos/milestone-koi-pond-demo.mp4 | Bin 0 -> 19868 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/milestone-koi-pond-demo.mp4 diff --git a/demos/milestone-koi-pond-demo.mp4 b/demos/milestone-koi-pond-demo.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ec0d6d948851ebb84c76a563df77491bd09302d3 GIT binary patch literal 19868 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 literal 0 HcmV?d00001