diff --git a/assets/tile-samples/tile_r1_c0.png b/assets/tile-samples/tile_r1_c0.png new file mode 100644 index 0000000..b759a0d Binary files /dev/null and b/assets/tile-samples/tile_r1_c0.png differ diff --git a/assets/tile-samples/tile_r1_c2.png b/assets/tile-samples/tile_r1_c2.png new file mode 100644 index 0000000..32f2a4b Binary files /dev/null and b/assets/tile-samples/tile_r1_c2.png differ diff --git a/assets/tile-samples/tile_r1_c6.png b/assets/tile-samples/tile_r1_c6.png new file mode 100644 index 0000000..4210948 Binary files /dev/null and b/assets/tile-samples/tile_r1_c6.png differ diff --git a/assets/tile-samples/tile_r20_c0.png b/assets/tile-samples/tile_r20_c0.png new file mode 100644 index 0000000..60eb96a Binary files /dev/null and b/assets/tile-samples/tile_r20_c0.png differ diff --git a/assets/tile-samples/tile_r30_c0.png b/assets/tile-samples/tile_r30_c0.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/tile-samples/tile_r30_c0.png differ diff --git a/assets/tile-samples/tile_r40_c0.png b/assets/tile-samples/tile_r40_c0.png new file mode 100644 index 0000000..eb6df53 Binary files /dev/null and b/assets/tile-samples/tile_r40_c0.png differ diff --git a/assets/tile-samples/tile_r5_c0.png b/assets/tile-samples/tile_r5_c0.png new file mode 100644 index 0000000..45e7d14 Binary files /dev/null and b/assets/tile-samples/tile_r5_c0.png differ diff --git a/assets/tile-samples/tile_r5_c2.png b/assets/tile-samples/tile_r5_c2.png new file mode 100644 index 0000000..a5625b8 Binary files /dev/null and b/assets/tile-samples/tile_r5_c2.png differ diff --git a/assets/tile-samples/tile_r5_c6.png b/assets/tile-samples/tile_r5_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/tile-samples/tile_r5_c6.png differ diff --git a/assets/verified-tiles/t_r0_c0.png b/assets/verified-tiles/t_r0_c0.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c0.png differ diff --git a/assets/verified-tiles/t_r0_c1.png b/assets/verified-tiles/t_r0_c1.png new file mode 100644 index 0000000..b5aeb0c Binary files /dev/null and b/assets/verified-tiles/t_r0_c1.png differ diff --git a/assets/verified-tiles/t_r0_c10.png b/assets/verified-tiles/t_r0_c10.png new file mode 100644 index 0000000..ecf6440 Binary files /dev/null and b/assets/verified-tiles/t_r0_c10.png differ diff --git a/assets/verified-tiles/t_r0_c11.png b/assets/verified-tiles/t_r0_c11.png new file mode 100644 index 0000000..af2fe12 Binary files /dev/null and b/assets/verified-tiles/t_r0_c11.png differ diff --git a/assets/verified-tiles/t_r0_c12.png b/assets/verified-tiles/t_r0_c12.png new file mode 100644 index 0000000..29c8794 Binary files /dev/null and b/assets/verified-tiles/t_r0_c12.png differ diff --git a/assets/verified-tiles/t_r0_c13.png b/assets/verified-tiles/t_r0_c13.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c13.png differ diff --git a/assets/verified-tiles/t_r0_c14.png b/assets/verified-tiles/t_r0_c14.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c14.png differ diff --git a/assets/verified-tiles/t_r0_c15.png b/assets/verified-tiles/t_r0_c15.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c15.png differ diff --git a/assets/verified-tiles/t_r0_c2.png b/assets/verified-tiles/t_r0_c2.png new file mode 100644 index 0000000..99e2c53 Binary files /dev/null and b/assets/verified-tiles/t_r0_c2.png differ diff --git a/assets/verified-tiles/t_r0_c3.png b/assets/verified-tiles/t_r0_c3.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c3.png differ diff --git a/assets/verified-tiles/t_r0_c4.png b/assets/verified-tiles/t_r0_c4.png new file mode 100644 index 0000000..5519bdf Binary files /dev/null and b/assets/verified-tiles/t_r0_c4.png differ diff --git a/assets/verified-tiles/t_r0_c5.png b/assets/verified-tiles/t_r0_c5.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c5.png differ diff --git a/assets/verified-tiles/t_r0_c6.png b/assets/verified-tiles/t_r0_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c6.png differ diff --git a/assets/verified-tiles/t_r0_c7.png b/assets/verified-tiles/t_r0_c7.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c7.png differ diff --git a/assets/verified-tiles/t_r0_c8.png b/assets/verified-tiles/t_r0_c8.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c8.png differ diff --git a/assets/verified-tiles/t_r0_c9.png b/assets/verified-tiles/t_r0_c9.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r0_c9.png differ diff --git a/assets/verified-tiles/t_r10_c0.png b/assets/verified-tiles/t_r10_c0.png new file mode 100644 index 0000000..aceaad0 Binary files /dev/null and b/assets/verified-tiles/t_r10_c0.png differ diff --git a/assets/verified-tiles/t_r10_c1.png b/assets/verified-tiles/t_r10_c1.png new file mode 100644 index 0000000..a83cc47 Binary files /dev/null and b/assets/verified-tiles/t_r10_c1.png differ diff --git a/assets/verified-tiles/t_r10_c10.png b/assets/verified-tiles/t_r10_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r10_c10.png differ diff --git a/assets/verified-tiles/t_r10_c11.png b/assets/verified-tiles/t_r10_c11.png new file mode 100644 index 0000000..305192b Binary files /dev/null and b/assets/verified-tiles/t_r10_c11.png differ diff --git a/assets/verified-tiles/t_r10_c12.png b/assets/verified-tiles/t_r10_c12.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r10_c12.png differ diff --git a/assets/verified-tiles/t_r10_c13.png b/assets/verified-tiles/t_r10_c13.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r10_c13.png differ diff --git a/assets/verified-tiles/t_r10_c14.png b/assets/verified-tiles/t_r10_c14.png new file mode 100644 index 0000000..ce7ba32 Binary files /dev/null and b/assets/verified-tiles/t_r10_c14.png differ diff --git a/assets/verified-tiles/t_r10_c15.png b/assets/verified-tiles/t_r10_c15.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r10_c15.png differ diff --git a/assets/verified-tiles/t_r10_c2.png b/assets/verified-tiles/t_r10_c2.png new file mode 100644 index 0000000..dafb2e8 Binary files /dev/null and b/assets/verified-tiles/t_r10_c2.png differ diff --git a/assets/verified-tiles/t_r10_c3.png b/assets/verified-tiles/t_r10_c3.png new file mode 100644 index 0000000..20e23fa Binary files /dev/null and b/assets/verified-tiles/t_r10_c3.png differ diff --git a/assets/verified-tiles/t_r10_c4.png b/assets/verified-tiles/t_r10_c4.png new file mode 100644 index 0000000..dafb2e8 Binary files /dev/null and b/assets/verified-tiles/t_r10_c4.png differ diff --git a/assets/verified-tiles/t_r10_c5.png b/assets/verified-tiles/t_r10_c5.png new file mode 100644 index 0000000..565b369 Binary files /dev/null and b/assets/verified-tiles/t_r10_c5.png differ diff --git a/assets/verified-tiles/t_r10_c6.png b/assets/verified-tiles/t_r10_c6.png new file mode 100644 index 0000000..2044ef9 Binary files /dev/null and b/assets/verified-tiles/t_r10_c6.png differ diff --git a/assets/verified-tiles/t_r10_c7.png b/assets/verified-tiles/t_r10_c7.png new file mode 100644 index 0000000..2f89b19 Binary files /dev/null and b/assets/verified-tiles/t_r10_c7.png differ diff --git a/assets/verified-tiles/t_r10_c8.png b/assets/verified-tiles/t_r10_c8.png new file mode 100644 index 0000000..78f5817 Binary files /dev/null and b/assets/verified-tiles/t_r10_c8.png differ diff --git a/assets/verified-tiles/t_r10_c9.png b/assets/verified-tiles/t_r10_c9.png new file mode 100644 index 0000000..2f89b19 Binary files /dev/null and b/assets/verified-tiles/t_r10_c9.png differ diff --git a/assets/verified-tiles/t_r11_c0.png b/assets/verified-tiles/t_r11_c0.png new file mode 100644 index 0000000..b3f685f Binary files /dev/null and b/assets/verified-tiles/t_r11_c0.png differ diff --git a/assets/verified-tiles/t_r11_c1.png b/assets/verified-tiles/t_r11_c1.png new file mode 100644 index 0000000..7af64f0 Binary files /dev/null and b/assets/verified-tiles/t_r11_c1.png differ diff --git a/assets/verified-tiles/t_r11_c10.png b/assets/verified-tiles/t_r11_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r11_c10.png differ diff --git a/assets/verified-tiles/t_r11_c11.png b/assets/verified-tiles/t_r11_c11.png new file mode 100644 index 0000000..496491e Binary files /dev/null and b/assets/verified-tiles/t_r11_c11.png differ diff --git a/assets/verified-tiles/t_r11_c12.png b/assets/verified-tiles/t_r11_c12.png new file mode 100644 index 0000000..4496d04 Binary files /dev/null and b/assets/verified-tiles/t_r11_c12.png differ diff --git a/assets/verified-tiles/t_r11_c13.png b/assets/verified-tiles/t_r11_c13.png new file mode 100644 index 0000000..57d4517 Binary files /dev/null and b/assets/verified-tiles/t_r11_c13.png differ diff --git a/assets/verified-tiles/t_r11_c14.png b/assets/verified-tiles/t_r11_c14.png new file mode 100644 index 0000000..bc60cc3 Binary files /dev/null and b/assets/verified-tiles/t_r11_c14.png differ diff --git a/assets/verified-tiles/t_r11_c15.png b/assets/verified-tiles/t_r11_c15.png new file mode 100644 index 0000000..aa70cdb Binary files /dev/null and b/assets/verified-tiles/t_r11_c15.png differ diff --git a/assets/verified-tiles/t_r11_c2.png b/assets/verified-tiles/t_r11_c2.png new file mode 100644 index 0000000..7af64f0 Binary files /dev/null and b/assets/verified-tiles/t_r11_c2.png differ diff --git a/assets/verified-tiles/t_r11_c3.png b/assets/verified-tiles/t_r11_c3.png new file mode 100644 index 0000000..3f1ce9a Binary files /dev/null and b/assets/verified-tiles/t_r11_c3.png differ diff --git a/assets/verified-tiles/t_r11_c4.png b/assets/verified-tiles/t_r11_c4.png new file mode 100644 index 0000000..7af64f0 Binary files /dev/null and b/assets/verified-tiles/t_r11_c4.png differ diff --git a/assets/verified-tiles/t_r11_c5.png b/assets/verified-tiles/t_r11_c5.png new file mode 100644 index 0000000..57a8d41 Binary files /dev/null and b/assets/verified-tiles/t_r11_c5.png differ diff --git a/assets/verified-tiles/t_r11_c6.png b/assets/verified-tiles/t_r11_c6.png new file mode 100644 index 0000000..fa26cb7 Binary files /dev/null and b/assets/verified-tiles/t_r11_c6.png differ diff --git a/assets/verified-tiles/t_r11_c7.png b/assets/verified-tiles/t_r11_c7.png new file mode 100644 index 0000000..fa26cb7 Binary files /dev/null and b/assets/verified-tiles/t_r11_c7.png differ diff --git a/assets/verified-tiles/t_r11_c8.png b/assets/verified-tiles/t_r11_c8.png new file mode 100644 index 0000000..c499e91 Binary files /dev/null and b/assets/verified-tiles/t_r11_c8.png differ diff --git a/assets/verified-tiles/t_r11_c9.png b/assets/verified-tiles/t_r11_c9.png new file mode 100644 index 0000000..fa26cb7 Binary files /dev/null and b/assets/verified-tiles/t_r11_c9.png differ diff --git a/assets/verified-tiles/t_r12_c0.png b/assets/verified-tiles/t_r12_c0.png new file mode 100644 index 0000000..937854c Binary files /dev/null and b/assets/verified-tiles/t_r12_c0.png differ diff --git a/assets/verified-tiles/t_r12_c1.png b/assets/verified-tiles/t_r12_c1.png new file mode 100644 index 0000000..7e15bdb Binary files /dev/null and b/assets/verified-tiles/t_r12_c1.png differ diff --git a/assets/verified-tiles/t_r12_c10.png b/assets/verified-tiles/t_r12_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r12_c10.png differ diff --git a/assets/verified-tiles/t_r12_c11.png b/assets/verified-tiles/t_r12_c11.png new file mode 100644 index 0000000..c52c8d6 Binary files /dev/null and b/assets/verified-tiles/t_r12_c11.png differ diff --git a/assets/verified-tiles/t_r12_c12.png b/assets/verified-tiles/t_r12_c12.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r12_c12.png differ diff --git a/assets/verified-tiles/t_r12_c13.png b/assets/verified-tiles/t_r12_c13.png new file mode 100644 index 0000000..dc29a04 Binary files /dev/null and b/assets/verified-tiles/t_r12_c13.png differ diff --git a/assets/verified-tiles/t_r12_c14.png b/assets/verified-tiles/t_r12_c14.png new file mode 100644 index 0000000..525a2f2 Binary files /dev/null and b/assets/verified-tiles/t_r12_c14.png differ diff --git a/assets/verified-tiles/t_r12_c15.png b/assets/verified-tiles/t_r12_c15.png new file mode 100644 index 0000000..3c53ed1 Binary files /dev/null and b/assets/verified-tiles/t_r12_c15.png differ diff --git a/assets/verified-tiles/t_r12_c2.png b/assets/verified-tiles/t_r12_c2.png new file mode 100644 index 0000000..fa60311 Binary files /dev/null and b/assets/verified-tiles/t_r12_c2.png differ diff --git a/assets/verified-tiles/t_r12_c3.png b/assets/verified-tiles/t_r12_c3.png new file mode 100644 index 0000000..77f9fe2 Binary files /dev/null and b/assets/verified-tiles/t_r12_c3.png differ diff --git a/assets/verified-tiles/t_r12_c4.png b/assets/verified-tiles/t_r12_c4.png new file mode 100644 index 0000000..1b3c8a2 Binary files /dev/null and b/assets/verified-tiles/t_r12_c4.png differ diff --git a/assets/verified-tiles/t_r12_c5.png b/assets/verified-tiles/t_r12_c5.png new file mode 100644 index 0000000..d98f881 Binary files /dev/null and b/assets/verified-tiles/t_r12_c5.png differ diff --git a/assets/verified-tiles/t_r12_c6.png b/assets/verified-tiles/t_r12_c6.png new file mode 100644 index 0000000..974f0c2 Binary files /dev/null and b/assets/verified-tiles/t_r12_c6.png differ diff --git a/assets/verified-tiles/t_r12_c7.png b/assets/verified-tiles/t_r12_c7.png new file mode 100644 index 0000000..7977c57 Binary files /dev/null and b/assets/verified-tiles/t_r12_c7.png differ diff --git a/assets/verified-tiles/t_r12_c8.png b/assets/verified-tiles/t_r12_c8.png new file mode 100644 index 0000000..8e45daf Binary files /dev/null and b/assets/verified-tiles/t_r12_c8.png differ diff --git a/assets/verified-tiles/t_r12_c9.png b/assets/verified-tiles/t_r12_c9.png new file mode 100644 index 0000000..ad66a09 Binary files /dev/null and b/assets/verified-tiles/t_r12_c9.png differ diff --git a/assets/verified-tiles/t_r13_c0.png b/assets/verified-tiles/t_r13_c0.png new file mode 100644 index 0000000..a8188dc Binary files /dev/null and b/assets/verified-tiles/t_r13_c0.png differ diff --git a/assets/verified-tiles/t_r13_c1.png b/assets/verified-tiles/t_r13_c1.png new file mode 100644 index 0000000..fcd4145 Binary files /dev/null and b/assets/verified-tiles/t_r13_c1.png differ diff --git a/assets/verified-tiles/t_r13_c10.png b/assets/verified-tiles/t_r13_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r13_c10.png differ diff --git a/assets/verified-tiles/t_r13_c11.png b/assets/verified-tiles/t_r13_c11.png new file mode 100644 index 0000000..dba934a Binary files /dev/null and b/assets/verified-tiles/t_r13_c11.png differ diff --git a/assets/verified-tiles/t_r13_c12.png b/assets/verified-tiles/t_r13_c12.png new file mode 100644 index 0000000..3b86d72 Binary files /dev/null and b/assets/verified-tiles/t_r13_c12.png differ diff --git a/assets/verified-tiles/t_r13_c13.png b/assets/verified-tiles/t_r13_c13.png new file mode 100644 index 0000000..dc29a04 Binary files /dev/null and b/assets/verified-tiles/t_r13_c13.png differ diff --git a/assets/verified-tiles/t_r13_c14.png b/assets/verified-tiles/t_r13_c14.png new file mode 100644 index 0000000..80e810f Binary files /dev/null and b/assets/verified-tiles/t_r13_c14.png differ diff --git a/assets/verified-tiles/t_r13_c15.png b/assets/verified-tiles/t_r13_c15.png new file mode 100644 index 0000000..3c53ed1 Binary files /dev/null and b/assets/verified-tiles/t_r13_c15.png differ diff --git a/assets/verified-tiles/t_r13_c2.png b/assets/verified-tiles/t_r13_c2.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r13_c2.png differ diff --git a/assets/verified-tiles/t_r13_c3.png b/assets/verified-tiles/t_r13_c3.png new file mode 100644 index 0000000..93a38e9 Binary files /dev/null and b/assets/verified-tiles/t_r13_c3.png differ diff --git a/assets/verified-tiles/t_r13_c4.png b/assets/verified-tiles/t_r13_c4.png new file mode 100644 index 0000000..17c4a6b Binary files /dev/null and b/assets/verified-tiles/t_r13_c4.png differ diff --git a/assets/verified-tiles/t_r13_c5.png b/assets/verified-tiles/t_r13_c5.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r13_c5.png differ diff --git a/assets/verified-tiles/t_r13_c6.png b/assets/verified-tiles/t_r13_c6.png new file mode 100644 index 0000000..43b8c65 Binary files /dev/null and b/assets/verified-tiles/t_r13_c6.png differ diff --git a/assets/verified-tiles/t_r13_c7.png b/assets/verified-tiles/t_r13_c7.png new file mode 100644 index 0000000..d59e04e Binary files /dev/null and b/assets/verified-tiles/t_r13_c7.png differ diff --git a/assets/verified-tiles/t_r13_c8.png b/assets/verified-tiles/t_r13_c8.png new file mode 100644 index 0000000..8b30d1e Binary files /dev/null and b/assets/verified-tiles/t_r13_c8.png differ diff --git a/assets/verified-tiles/t_r13_c9.png b/assets/verified-tiles/t_r13_c9.png new file mode 100644 index 0000000..d301269 Binary files /dev/null and b/assets/verified-tiles/t_r13_c9.png differ diff --git a/assets/verified-tiles/t_r14_c0.png b/assets/verified-tiles/t_r14_c0.png new file mode 100644 index 0000000..1eb338b Binary files /dev/null and b/assets/verified-tiles/t_r14_c0.png differ diff --git a/assets/verified-tiles/t_r14_c1.png b/assets/verified-tiles/t_r14_c1.png new file mode 100644 index 0000000..50e966d Binary files /dev/null and b/assets/verified-tiles/t_r14_c1.png differ diff --git a/assets/verified-tiles/t_r14_c10.png b/assets/verified-tiles/t_r14_c10.png new file mode 100644 index 0000000..7761805 Binary files /dev/null and b/assets/verified-tiles/t_r14_c10.png differ diff --git a/assets/verified-tiles/t_r14_c11.png b/assets/verified-tiles/t_r14_c11.png new file mode 100644 index 0000000..c2a95f1 Binary files /dev/null and b/assets/verified-tiles/t_r14_c11.png differ diff --git a/assets/verified-tiles/t_r14_c12.png b/assets/verified-tiles/t_r14_c12.png new file mode 100644 index 0000000..c03a301 Binary files /dev/null and b/assets/verified-tiles/t_r14_c12.png differ diff --git a/assets/verified-tiles/t_r14_c13.png b/assets/verified-tiles/t_r14_c13.png new file mode 100644 index 0000000..5f94ad9 Binary files /dev/null and b/assets/verified-tiles/t_r14_c13.png differ diff --git a/assets/verified-tiles/t_r14_c14.png b/assets/verified-tiles/t_r14_c14.png new file mode 100644 index 0000000..e0fe81f Binary files /dev/null and b/assets/verified-tiles/t_r14_c14.png differ diff --git a/assets/verified-tiles/t_r14_c15.png b/assets/verified-tiles/t_r14_c15.png new file mode 100644 index 0000000..126c043 Binary files /dev/null and b/assets/verified-tiles/t_r14_c15.png differ diff --git a/assets/verified-tiles/t_r14_c2.png b/assets/verified-tiles/t_r14_c2.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r14_c2.png differ diff --git a/assets/verified-tiles/t_r14_c3.png b/assets/verified-tiles/t_r14_c3.png new file mode 100644 index 0000000..9d0a058 Binary files /dev/null and b/assets/verified-tiles/t_r14_c3.png differ diff --git a/assets/verified-tiles/t_r14_c4.png b/assets/verified-tiles/t_r14_c4.png new file mode 100644 index 0000000..41848ff Binary files /dev/null and b/assets/verified-tiles/t_r14_c4.png differ diff --git a/assets/verified-tiles/t_r14_c5.png b/assets/verified-tiles/t_r14_c5.png new file mode 100644 index 0000000..ab3742e Binary files /dev/null and b/assets/verified-tiles/t_r14_c5.png differ diff --git a/assets/verified-tiles/t_r14_c6.png b/assets/verified-tiles/t_r14_c6.png new file mode 100644 index 0000000..992163f Binary files /dev/null and b/assets/verified-tiles/t_r14_c6.png differ diff --git a/assets/verified-tiles/t_r14_c7.png b/assets/verified-tiles/t_r14_c7.png new file mode 100644 index 0000000..2f1d2ff Binary files /dev/null and b/assets/verified-tiles/t_r14_c7.png differ diff --git a/assets/verified-tiles/t_r14_c8.png b/assets/verified-tiles/t_r14_c8.png new file mode 100644 index 0000000..3b3c456 Binary files /dev/null and b/assets/verified-tiles/t_r14_c8.png differ diff --git a/assets/verified-tiles/t_r14_c9.png b/assets/verified-tiles/t_r14_c9.png new file mode 100644 index 0000000..14ff6d1 Binary files /dev/null and b/assets/verified-tiles/t_r14_c9.png differ diff --git a/assets/verified-tiles/t_r1_c0.png b/assets/verified-tiles/t_r1_c0.png new file mode 100644 index 0000000..b759a0d Binary files /dev/null and b/assets/verified-tiles/t_r1_c0.png differ diff --git a/assets/verified-tiles/t_r1_c1.png b/assets/verified-tiles/t_r1_c1.png new file mode 100644 index 0000000..f218ad7 Binary files /dev/null and b/assets/verified-tiles/t_r1_c1.png differ diff --git a/assets/verified-tiles/t_r1_c10.png b/assets/verified-tiles/t_r1_c10.png new file mode 100644 index 0000000..f811d45 Binary files /dev/null and b/assets/verified-tiles/t_r1_c10.png differ diff --git a/assets/verified-tiles/t_r1_c11.png b/assets/verified-tiles/t_r1_c11.png new file mode 100644 index 0000000..16ac758 Binary files /dev/null and b/assets/verified-tiles/t_r1_c11.png differ diff --git a/assets/verified-tiles/t_r1_c12.png b/assets/verified-tiles/t_r1_c12.png new file mode 100644 index 0000000..917ebb3 Binary files /dev/null and b/assets/verified-tiles/t_r1_c12.png differ diff --git a/assets/verified-tiles/t_r1_c13.png b/assets/verified-tiles/t_r1_c13.png new file mode 100644 index 0000000..1a4fd1c Binary files /dev/null and b/assets/verified-tiles/t_r1_c13.png differ diff --git a/assets/verified-tiles/t_r1_c14.png b/assets/verified-tiles/t_r1_c14.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r1_c14.png differ diff --git a/assets/verified-tiles/t_r1_c15.png b/assets/verified-tiles/t_r1_c15.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r1_c15.png differ diff --git a/assets/verified-tiles/t_r1_c2.png b/assets/verified-tiles/t_r1_c2.png new file mode 100644 index 0000000..32f2a4b Binary files /dev/null and b/assets/verified-tiles/t_r1_c2.png differ diff --git a/assets/verified-tiles/t_r1_c3.png b/assets/verified-tiles/t_r1_c3.png new file mode 100644 index 0000000..913633b Binary files /dev/null and b/assets/verified-tiles/t_r1_c3.png differ diff --git a/assets/verified-tiles/t_r1_c4.png b/assets/verified-tiles/t_r1_c4.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r1_c4.png differ diff --git a/assets/verified-tiles/t_r1_c5.png b/assets/verified-tiles/t_r1_c5.png new file mode 100644 index 0000000..87a4e84 Binary files /dev/null and b/assets/verified-tiles/t_r1_c5.png differ diff --git a/assets/verified-tiles/t_r1_c6.png b/assets/verified-tiles/t_r1_c6.png new file mode 100644 index 0000000..4210948 Binary files /dev/null and b/assets/verified-tiles/t_r1_c6.png differ diff --git a/assets/verified-tiles/t_r1_c7.png b/assets/verified-tiles/t_r1_c7.png new file mode 100644 index 0000000..8920a07 Binary files /dev/null and b/assets/verified-tiles/t_r1_c7.png differ diff --git a/assets/verified-tiles/t_r1_c8.png b/assets/verified-tiles/t_r1_c8.png new file mode 100644 index 0000000..faa9beb Binary files /dev/null and b/assets/verified-tiles/t_r1_c8.png differ diff --git a/assets/verified-tiles/t_r1_c9.png b/assets/verified-tiles/t_r1_c9.png new file mode 100644 index 0000000..62ecaaa Binary files /dev/null and b/assets/verified-tiles/t_r1_c9.png differ diff --git a/assets/verified-tiles/t_r2_c0.png b/assets/verified-tiles/t_r2_c0.png new file mode 100644 index 0000000..6df96e7 Binary files /dev/null and b/assets/verified-tiles/t_r2_c0.png differ diff --git a/assets/verified-tiles/t_r2_c1.png b/assets/verified-tiles/t_r2_c1.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r2_c1.png differ diff --git a/assets/verified-tiles/t_r2_c10.png b/assets/verified-tiles/t_r2_c10.png new file mode 100644 index 0000000..4f2cffa Binary files /dev/null and b/assets/verified-tiles/t_r2_c10.png differ diff --git a/assets/verified-tiles/t_r2_c11.png b/assets/verified-tiles/t_r2_c11.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r2_c11.png differ diff --git a/assets/verified-tiles/t_r2_c12.png b/assets/verified-tiles/t_r2_c12.png new file mode 100644 index 0000000..4e71007 Binary files /dev/null and b/assets/verified-tiles/t_r2_c12.png differ diff --git a/assets/verified-tiles/t_r2_c13.png b/assets/verified-tiles/t_r2_c13.png new file mode 100644 index 0000000..4f2cffa Binary files /dev/null and b/assets/verified-tiles/t_r2_c13.png differ diff --git a/assets/verified-tiles/t_r2_c14.png b/assets/verified-tiles/t_r2_c14.png new file mode 100644 index 0000000..5522e3a Binary files /dev/null and b/assets/verified-tiles/t_r2_c14.png differ diff --git a/assets/verified-tiles/t_r2_c15.png b/assets/verified-tiles/t_r2_c15.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r2_c15.png differ diff --git a/assets/verified-tiles/t_r2_c2.png b/assets/verified-tiles/t_r2_c2.png new file mode 100644 index 0000000..fc14a0e Binary files /dev/null and b/assets/verified-tiles/t_r2_c2.png differ diff --git a/assets/verified-tiles/t_r2_c3.png b/assets/verified-tiles/t_r2_c3.png new file mode 100644 index 0000000..6df96e7 Binary files /dev/null and b/assets/verified-tiles/t_r2_c3.png differ diff --git a/assets/verified-tiles/t_r2_c4.png b/assets/verified-tiles/t_r2_c4.png new file mode 100644 index 0000000..33d776d Binary files /dev/null and b/assets/verified-tiles/t_r2_c4.png differ diff --git a/assets/verified-tiles/t_r2_c5.png b/assets/verified-tiles/t_r2_c5.png new file mode 100644 index 0000000..d14fa35 Binary files /dev/null and b/assets/verified-tiles/t_r2_c5.png differ diff --git a/assets/verified-tiles/t_r2_c6.png b/assets/verified-tiles/t_r2_c6.png new file mode 100644 index 0000000..075ce61 Binary files /dev/null and b/assets/verified-tiles/t_r2_c6.png differ diff --git a/assets/verified-tiles/t_r2_c7.png b/assets/verified-tiles/t_r2_c7.png new file mode 100644 index 0000000..1885340 Binary files /dev/null and b/assets/verified-tiles/t_r2_c7.png differ diff --git a/assets/verified-tiles/t_r2_c8.png b/assets/verified-tiles/t_r2_c8.png new file mode 100644 index 0000000..3883203 Binary files /dev/null and b/assets/verified-tiles/t_r2_c8.png differ diff --git a/assets/verified-tiles/t_r2_c9.png b/assets/verified-tiles/t_r2_c9.png new file mode 100644 index 0000000..cf822e3 Binary files /dev/null and b/assets/verified-tiles/t_r2_c9.png differ diff --git a/assets/verified-tiles/t_r3_c0.png b/assets/verified-tiles/t_r3_c0.png new file mode 100644 index 0000000..71692a0 Binary files /dev/null and b/assets/verified-tiles/t_r3_c0.png differ diff --git a/assets/verified-tiles/t_r3_c1.png b/assets/verified-tiles/t_r3_c1.png new file mode 100644 index 0000000..0c9dc69 Binary files /dev/null and b/assets/verified-tiles/t_r3_c1.png differ diff --git a/assets/verified-tiles/t_r3_c10.png b/assets/verified-tiles/t_r3_c10.png new file mode 100644 index 0000000..81bdc4b Binary files /dev/null and b/assets/verified-tiles/t_r3_c10.png differ diff --git a/assets/verified-tiles/t_r3_c11.png b/assets/verified-tiles/t_r3_c11.png new file mode 100644 index 0000000..05383a5 Binary files /dev/null and b/assets/verified-tiles/t_r3_c11.png differ diff --git a/assets/verified-tiles/t_r3_c12.png b/assets/verified-tiles/t_r3_c12.png new file mode 100644 index 0000000..032de6f Binary files /dev/null and b/assets/verified-tiles/t_r3_c12.png differ diff --git a/assets/verified-tiles/t_r3_c13.png b/assets/verified-tiles/t_r3_c13.png new file mode 100644 index 0000000..afb4d3a Binary files /dev/null and b/assets/verified-tiles/t_r3_c13.png differ diff --git a/assets/verified-tiles/t_r3_c14.png b/assets/verified-tiles/t_r3_c14.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r3_c14.png differ diff --git a/assets/verified-tiles/t_r3_c15.png b/assets/verified-tiles/t_r3_c15.png new file mode 100644 index 0000000..4d63966 Binary files /dev/null and b/assets/verified-tiles/t_r3_c15.png differ diff --git a/assets/verified-tiles/t_r3_c2.png b/assets/verified-tiles/t_r3_c2.png new file mode 100644 index 0000000..0e1268c Binary files /dev/null and b/assets/verified-tiles/t_r3_c2.png differ diff --git a/assets/verified-tiles/t_r3_c3.png b/assets/verified-tiles/t_r3_c3.png new file mode 100644 index 0000000..afb4d3a Binary files /dev/null and b/assets/verified-tiles/t_r3_c3.png differ diff --git a/assets/verified-tiles/t_r3_c4.png b/assets/verified-tiles/t_r3_c4.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r3_c4.png differ diff --git a/assets/verified-tiles/t_r3_c5.png b/assets/verified-tiles/t_r3_c5.png new file mode 100644 index 0000000..87a4e84 Binary files /dev/null and b/assets/verified-tiles/t_r3_c5.png differ diff --git a/assets/verified-tiles/t_r3_c6.png b/assets/verified-tiles/t_r3_c6.png new file mode 100644 index 0000000..e60fdbf Binary files /dev/null and b/assets/verified-tiles/t_r3_c6.png differ diff --git a/assets/verified-tiles/t_r3_c7.png b/assets/verified-tiles/t_r3_c7.png new file mode 100644 index 0000000..988a564 Binary files /dev/null and b/assets/verified-tiles/t_r3_c7.png differ diff --git a/assets/verified-tiles/t_r3_c8.png b/assets/verified-tiles/t_r3_c8.png new file mode 100644 index 0000000..faa9beb Binary files /dev/null and b/assets/verified-tiles/t_r3_c8.png differ diff --git a/assets/verified-tiles/t_r3_c9.png b/assets/verified-tiles/t_r3_c9.png new file mode 100644 index 0000000..1b9ff8e Binary files /dev/null and b/assets/verified-tiles/t_r3_c9.png differ diff --git a/assets/verified-tiles/t_r4_c0.png b/assets/verified-tiles/t_r4_c0.png new file mode 100644 index 0000000..82228a9 Binary files /dev/null and b/assets/verified-tiles/t_r4_c0.png differ diff --git a/assets/verified-tiles/t_r4_c1.png b/assets/verified-tiles/t_r4_c1.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r4_c1.png differ diff --git a/assets/verified-tiles/t_r4_c10.png b/assets/verified-tiles/t_r4_c10.png new file mode 100644 index 0000000..82228a9 Binary files /dev/null and b/assets/verified-tiles/t_r4_c10.png differ diff --git a/assets/verified-tiles/t_r4_c11.png b/assets/verified-tiles/t_r4_c11.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r4_c11.png differ diff --git a/assets/verified-tiles/t_r4_c12.png b/assets/verified-tiles/t_r4_c12.png new file mode 100644 index 0000000..1f2b0da Binary files /dev/null and b/assets/verified-tiles/t_r4_c12.png differ diff --git a/assets/verified-tiles/t_r4_c13.png b/assets/verified-tiles/t_r4_c13.png new file mode 100644 index 0000000..0a33435 Binary files /dev/null and b/assets/verified-tiles/t_r4_c13.png differ diff --git a/assets/verified-tiles/t_r4_c14.png b/assets/verified-tiles/t_r4_c14.png new file mode 100644 index 0000000..ca16f28 Binary files /dev/null and b/assets/verified-tiles/t_r4_c14.png differ diff --git a/assets/verified-tiles/t_r4_c15.png b/assets/verified-tiles/t_r4_c15.png new file mode 100644 index 0000000..79a02c5 Binary files /dev/null and b/assets/verified-tiles/t_r4_c15.png differ diff --git a/assets/verified-tiles/t_r4_c2.png b/assets/verified-tiles/t_r4_c2.png new file mode 100644 index 0000000..1f2b0da Binary files /dev/null and b/assets/verified-tiles/t_r4_c2.png differ diff --git a/assets/verified-tiles/t_r4_c3.png b/assets/verified-tiles/t_r4_c3.png new file mode 100644 index 0000000..0993625 Binary files /dev/null and b/assets/verified-tiles/t_r4_c3.png differ diff --git a/assets/verified-tiles/t_r4_c4.png b/assets/verified-tiles/t_r4_c4.png new file mode 100644 index 0000000..d1122a4 Binary files /dev/null and b/assets/verified-tiles/t_r4_c4.png differ diff --git a/assets/verified-tiles/t_r4_c5.png b/assets/verified-tiles/t_r4_c5.png new file mode 100644 index 0000000..d14fa35 Binary files /dev/null and b/assets/verified-tiles/t_r4_c5.png differ diff --git a/assets/verified-tiles/t_r4_c6.png b/assets/verified-tiles/t_r4_c6.png new file mode 100644 index 0000000..d396513 Binary files /dev/null and b/assets/verified-tiles/t_r4_c6.png differ diff --git a/assets/verified-tiles/t_r4_c7.png b/assets/verified-tiles/t_r4_c7.png new file mode 100644 index 0000000..a36f749 Binary files /dev/null and b/assets/verified-tiles/t_r4_c7.png differ diff --git a/assets/verified-tiles/t_r4_c8.png b/assets/verified-tiles/t_r4_c8.png new file mode 100644 index 0000000..3883203 Binary files /dev/null and b/assets/verified-tiles/t_r4_c8.png differ diff --git a/assets/verified-tiles/t_r4_c9.png b/assets/verified-tiles/t_r4_c9.png new file mode 100644 index 0000000..09c2331 Binary files /dev/null and b/assets/verified-tiles/t_r4_c9.png differ diff --git a/assets/verified-tiles/t_r5_c0.png b/assets/verified-tiles/t_r5_c0.png new file mode 100644 index 0000000..45e7d14 Binary files /dev/null and b/assets/verified-tiles/t_r5_c0.png differ diff --git a/assets/verified-tiles/t_r5_c1.png b/assets/verified-tiles/t_r5_c1.png new file mode 100644 index 0000000..118ea6f Binary files /dev/null and b/assets/verified-tiles/t_r5_c1.png differ diff --git a/assets/verified-tiles/t_r5_c10.png b/assets/verified-tiles/t_r5_c10.png new file mode 100644 index 0000000..b3aa3dc Binary files /dev/null and b/assets/verified-tiles/t_r5_c10.png differ diff --git a/assets/verified-tiles/t_r5_c11.png b/assets/verified-tiles/t_r5_c11.png new file mode 100644 index 0000000..18fc4e6 Binary files /dev/null and b/assets/verified-tiles/t_r5_c11.png differ diff --git a/assets/verified-tiles/t_r5_c12.png b/assets/verified-tiles/t_r5_c12.png new file mode 100644 index 0000000..73fd9ee Binary files /dev/null and b/assets/verified-tiles/t_r5_c12.png differ diff --git a/assets/verified-tiles/t_r5_c13.png b/assets/verified-tiles/t_r5_c13.png new file mode 100644 index 0000000..b411df3 Binary files /dev/null and b/assets/verified-tiles/t_r5_c13.png differ diff --git a/assets/verified-tiles/t_r5_c14.png b/assets/verified-tiles/t_r5_c14.png new file mode 100644 index 0000000..f0f1235 Binary files /dev/null and b/assets/verified-tiles/t_r5_c14.png differ diff --git a/assets/verified-tiles/t_r5_c15.png b/assets/verified-tiles/t_r5_c15.png new file mode 100644 index 0000000..23d7b44 Binary files /dev/null and b/assets/verified-tiles/t_r5_c15.png differ diff --git a/assets/verified-tiles/t_r5_c2.png b/assets/verified-tiles/t_r5_c2.png new file mode 100644 index 0000000..a5625b8 Binary files /dev/null and b/assets/verified-tiles/t_r5_c2.png differ diff --git a/assets/verified-tiles/t_r5_c3.png b/assets/verified-tiles/t_r5_c3.png new file mode 100644 index 0000000..750a3e2 Binary files /dev/null and b/assets/verified-tiles/t_r5_c3.png differ diff --git a/assets/verified-tiles/t_r5_c4.png b/assets/verified-tiles/t_r5_c4.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r5_c4.png differ diff --git a/assets/verified-tiles/t_r5_c5.png b/assets/verified-tiles/t_r5_c5.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r5_c5.png differ diff --git a/assets/verified-tiles/t_r5_c6.png b/assets/verified-tiles/t_r5_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r5_c6.png differ diff --git a/assets/verified-tiles/t_r5_c7.png b/assets/verified-tiles/t_r5_c7.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r5_c7.png differ diff --git a/assets/verified-tiles/t_r5_c8.png b/assets/verified-tiles/t_r5_c8.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r5_c8.png differ diff --git a/assets/verified-tiles/t_r5_c9.png b/assets/verified-tiles/t_r5_c9.png new file mode 100644 index 0000000..7e391a3 Binary files /dev/null and b/assets/verified-tiles/t_r5_c9.png differ diff --git a/assets/verified-tiles/t_r6_c0.png b/assets/verified-tiles/t_r6_c0.png new file mode 100644 index 0000000..a4bbb06 Binary files /dev/null and b/assets/verified-tiles/t_r6_c0.png differ diff --git a/assets/verified-tiles/t_r6_c1.png b/assets/verified-tiles/t_r6_c1.png new file mode 100644 index 0000000..89fe965 Binary files /dev/null and b/assets/verified-tiles/t_r6_c1.png differ diff --git a/assets/verified-tiles/t_r6_c10.png b/assets/verified-tiles/t_r6_c10.png new file mode 100644 index 0000000..4c86eca Binary files /dev/null and b/assets/verified-tiles/t_r6_c10.png differ diff --git a/assets/verified-tiles/t_r6_c11.png b/assets/verified-tiles/t_r6_c11.png new file mode 100644 index 0000000..5c1ddcb Binary files /dev/null and b/assets/verified-tiles/t_r6_c11.png differ diff --git a/assets/verified-tiles/t_r6_c12.png b/assets/verified-tiles/t_r6_c12.png new file mode 100644 index 0000000..a25d44b Binary files /dev/null and b/assets/verified-tiles/t_r6_c12.png differ diff --git a/assets/verified-tiles/t_r6_c13.png b/assets/verified-tiles/t_r6_c13.png new file mode 100644 index 0000000..b26457b Binary files /dev/null and b/assets/verified-tiles/t_r6_c13.png differ diff --git a/assets/verified-tiles/t_r6_c14.png b/assets/verified-tiles/t_r6_c14.png new file mode 100644 index 0000000..c17d0cd Binary files /dev/null and b/assets/verified-tiles/t_r6_c14.png differ diff --git a/assets/verified-tiles/t_r6_c15.png b/assets/verified-tiles/t_r6_c15.png new file mode 100644 index 0000000..9a40363 Binary files /dev/null and b/assets/verified-tiles/t_r6_c15.png differ diff --git a/assets/verified-tiles/t_r6_c2.png b/assets/verified-tiles/t_r6_c2.png new file mode 100644 index 0000000..06e87e1 Binary files /dev/null and b/assets/verified-tiles/t_r6_c2.png differ diff --git a/assets/verified-tiles/t_r6_c3.png b/assets/verified-tiles/t_r6_c3.png new file mode 100644 index 0000000..b80d8b1 Binary files /dev/null and b/assets/verified-tiles/t_r6_c3.png differ diff --git a/assets/verified-tiles/t_r6_c4.png b/assets/verified-tiles/t_r6_c4.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r6_c4.png differ diff --git a/assets/verified-tiles/t_r6_c5.png b/assets/verified-tiles/t_r6_c5.png new file mode 100644 index 0000000..ed17b77 Binary files /dev/null and b/assets/verified-tiles/t_r6_c5.png differ diff --git a/assets/verified-tiles/t_r6_c6.png b/assets/verified-tiles/t_r6_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r6_c6.png differ diff --git a/assets/verified-tiles/t_r6_c7.png b/assets/verified-tiles/t_r6_c7.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r6_c7.png differ diff --git a/assets/verified-tiles/t_r6_c8.png b/assets/verified-tiles/t_r6_c8.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r6_c8.png differ diff --git a/assets/verified-tiles/t_r6_c9.png b/assets/verified-tiles/t_r6_c9.png new file mode 100644 index 0000000..aedd46f Binary files /dev/null and b/assets/verified-tiles/t_r6_c9.png differ diff --git a/assets/verified-tiles/t_r7_c0.png b/assets/verified-tiles/t_r7_c0.png new file mode 100644 index 0000000..82619ec Binary files /dev/null and b/assets/verified-tiles/t_r7_c0.png differ diff --git a/assets/verified-tiles/t_r7_c1.png b/assets/verified-tiles/t_r7_c1.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r7_c1.png differ diff --git a/assets/verified-tiles/t_r7_c10.png b/assets/verified-tiles/t_r7_c10.png new file mode 100644 index 0000000..a26ec5c Binary files /dev/null and b/assets/verified-tiles/t_r7_c10.png differ diff --git a/assets/verified-tiles/t_r7_c11.png b/assets/verified-tiles/t_r7_c11.png new file mode 100644 index 0000000..5dbcd52 Binary files /dev/null and b/assets/verified-tiles/t_r7_c11.png differ diff --git a/assets/verified-tiles/t_r7_c12.png b/assets/verified-tiles/t_r7_c12.png new file mode 100644 index 0000000..f80081d Binary files /dev/null and b/assets/verified-tiles/t_r7_c12.png differ diff --git a/assets/verified-tiles/t_r7_c13.png b/assets/verified-tiles/t_r7_c13.png new file mode 100644 index 0000000..2628dd6 Binary files /dev/null and b/assets/verified-tiles/t_r7_c13.png differ diff --git a/assets/verified-tiles/t_r7_c14.png b/assets/verified-tiles/t_r7_c14.png new file mode 100644 index 0000000..757a7b5 Binary files /dev/null and b/assets/verified-tiles/t_r7_c14.png differ diff --git a/assets/verified-tiles/t_r7_c15.png b/assets/verified-tiles/t_r7_c15.png new file mode 100644 index 0000000..61b241f Binary files /dev/null and b/assets/verified-tiles/t_r7_c15.png differ diff --git a/assets/verified-tiles/t_r7_c2.png b/assets/verified-tiles/t_r7_c2.png new file mode 100644 index 0000000..716ede1 Binary files /dev/null and b/assets/verified-tiles/t_r7_c2.png differ diff --git a/assets/verified-tiles/t_r7_c3.png b/assets/verified-tiles/t_r7_c3.png new file mode 100644 index 0000000..82619ec Binary files /dev/null and b/assets/verified-tiles/t_r7_c3.png differ diff --git a/assets/verified-tiles/t_r7_c4.png b/assets/verified-tiles/t_r7_c4.png new file mode 100644 index 0000000..f109037 Binary files /dev/null and b/assets/verified-tiles/t_r7_c4.png differ diff --git a/assets/verified-tiles/t_r7_c5.png b/assets/verified-tiles/t_r7_c5.png new file mode 100644 index 0000000..b2f6d78 Binary files /dev/null and b/assets/verified-tiles/t_r7_c5.png differ diff --git a/assets/verified-tiles/t_r7_c6.png b/assets/verified-tiles/t_r7_c6.png new file mode 100644 index 0000000..4cf0717 Binary files /dev/null and b/assets/verified-tiles/t_r7_c6.png differ diff --git a/assets/verified-tiles/t_r7_c7.png b/assets/verified-tiles/t_r7_c7.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r7_c7.png differ diff --git a/assets/verified-tiles/t_r7_c8.png b/assets/verified-tiles/t_r7_c8.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r7_c8.png differ diff --git a/assets/verified-tiles/t_r7_c9.png b/assets/verified-tiles/t_r7_c9.png new file mode 100644 index 0000000..08b649f Binary files /dev/null and b/assets/verified-tiles/t_r7_c9.png differ diff --git a/assets/verified-tiles/t_r8_c0.png b/assets/verified-tiles/t_r8_c0.png new file mode 100644 index 0000000..6d3f88a Binary files /dev/null and b/assets/verified-tiles/t_r8_c0.png differ diff --git a/assets/verified-tiles/t_r8_c1.png b/assets/verified-tiles/t_r8_c1.png new file mode 100644 index 0000000..9dbe5da Binary files /dev/null and b/assets/verified-tiles/t_r8_c1.png differ diff --git a/assets/verified-tiles/t_r8_c10.png b/assets/verified-tiles/t_r8_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r8_c10.png differ diff --git a/assets/verified-tiles/t_r8_c11.png b/assets/verified-tiles/t_r8_c11.png new file mode 100644 index 0000000..980aae5 Binary files /dev/null and b/assets/verified-tiles/t_r8_c11.png differ diff --git a/assets/verified-tiles/t_r8_c12.png b/assets/verified-tiles/t_r8_c12.png new file mode 100644 index 0000000..5bb6fb3 Binary files /dev/null and b/assets/verified-tiles/t_r8_c12.png differ diff --git a/assets/verified-tiles/t_r8_c13.png b/assets/verified-tiles/t_r8_c13.png new file mode 100644 index 0000000..ed16131 Binary files /dev/null and b/assets/verified-tiles/t_r8_c13.png differ diff --git a/assets/verified-tiles/t_r8_c14.png b/assets/verified-tiles/t_r8_c14.png new file mode 100644 index 0000000..640d47a Binary files /dev/null and b/assets/verified-tiles/t_r8_c14.png differ diff --git a/assets/verified-tiles/t_r8_c15.png b/assets/verified-tiles/t_r8_c15.png new file mode 100644 index 0000000..2b59799 Binary files /dev/null and b/assets/verified-tiles/t_r8_c15.png differ diff --git a/assets/verified-tiles/t_r8_c2.png b/assets/verified-tiles/t_r8_c2.png new file mode 100644 index 0000000..0d7b43b Binary files /dev/null and b/assets/verified-tiles/t_r8_c2.png differ diff --git a/assets/verified-tiles/t_r8_c3.png b/assets/verified-tiles/t_r8_c3.png new file mode 100644 index 0000000..afb4d3a Binary files /dev/null and b/assets/verified-tiles/t_r8_c3.png differ diff --git a/assets/verified-tiles/t_r8_c4.png b/assets/verified-tiles/t_r8_c4.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r8_c4.png differ diff --git a/assets/verified-tiles/t_r8_c5.png b/assets/verified-tiles/t_r8_c5.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r8_c5.png differ diff --git a/assets/verified-tiles/t_r8_c6.png b/assets/verified-tiles/t_r8_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r8_c6.png differ diff --git a/assets/verified-tiles/t_r8_c7.png b/assets/verified-tiles/t_r8_c7.png new file mode 100644 index 0000000..0f9e474 Binary files /dev/null and b/assets/verified-tiles/t_r8_c7.png differ diff --git a/assets/verified-tiles/t_r8_c8.png b/assets/verified-tiles/t_r8_c8.png new file mode 100644 index 0000000..5731c47 Binary files /dev/null and b/assets/verified-tiles/t_r8_c8.png differ diff --git a/assets/verified-tiles/t_r8_c9.png b/assets/verified-tiles/t_r8_c9.png new file mode 100644 index 0000000..da6cc80 Binary files /dev/null and b/assets/verified-tiles/t_r8_c9.png differ diff --git a/assets/verified-tiles/t_r9_c0.png b/assets/verified-tiles/t_r9_c0.png new file mode 100644 index 0000000..82228a9 Binary files /dev/null and b/assets/verified-tiles/t_r9_c0.png differ diff --git a/assets/verified-tiles/t_r9_c1.png b/assets/verified-tiles/t_r9_c1.png new file mode 100644 index 0000000..6979036 Binary files /dev/null and b/assets/verified-tiles/t_r9_c1.png differ diff --git a/assets/verified-tiles/t_r9_c10.png b/assets/verified-tiles/t_r9_c10.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c10.png differ diff --git a/assets/verified-tiles/t_r9_c11.png b/assets/verified-tiles/t_r9_c11.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c11.png differ diff --git a/assets/verified-tiles/t_r9_c12.png b/assets/verified-tiles/t_r9_c12.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c12.png differ diff --git a/assets/verified-tiles/t_r9_c13.png b/assets/verified-tiles/t_r9_c13.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c13.png differ diff --git a/assets/verified-tiles/t_r9_c14.png b/assets/verified-tiles/t_r9_c14.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c14.png differ diff --git a/assets/verified-tiles/t_r9_c15.png b/assets/verified-tiles/t_r9_c15.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c15.png differ diff --git a/assets/verified-tiles/t_r9_c2.png b/assets/verified-tiles/t_r9_c2.png new file mode 100644 index 0000000..1f2b0da Binary files /dev/null and b/assets/verified-tiles/t_r9_c2.png differ diff --git a/assets/verified-tiles/t_r9_c3.png b/assets/verified-tiles/t_r9_c3.png new file mode 100644 index 0000000..40e30b1 Binary files /dev/null and b/assets/verified-tiles/t_r9_c3.png differ diff --git a/assets/verified-tiles/t_r9_c4.png b/assets/verified-tiles/t_r9_c4.png new file mode 100644 index 0000000..765c9c9 Binary files /dev/null and b/assets/verified-tiles/t_r9_c4.png differ diff --git a/assets/verified-tiles/t_r9_c5.png b/assets/verified-tiles/t_r9_c5.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c5.png differ diff --git a/assets/verified-tiles/t_r9_c6.png b/assets/verified-tiles/t_r9_c6.png new file mode 100644 index 0000000..9d79540 Binary files /dev/null and b/assets/verified-tiles/t_r9_c6.png differ diff --git a/assets/verified-tiles/t_r9_c7.png b/assets/verified-tiles/t_r9_c7.png new file mode 100644 index 0000000..8db3381 Binary files /dev/null and b/assets/verified-tiles/t_r9_c7.png differ diff --git a/assets/verified-tiles/t_r9_c8.png b/assets/verified-tiles/t_r9_c8.png new file mode 100644 index 0000000..dfcf112 Binary files /dev/null and b/assets/verified-tiles/t_r9_c8.png differ diff --git a/assets/verified-tiles/t_r9_c9.png b/assets/verified-tiles/t_r9_c9.png new file mode 100644 index 0000000..98250aa Binary files /dev/null and b/assets/verified-tiles/t_r9_c9.png differ diff --git a/src/frontend/FarmCanvas.jsx b/src/frontend/FarmCanvas.jsx index 9b69670..9ff644b 100644 --- a/src/frontend/FarmCanvas.jsx +++ b/src/frontend/FarmCanvas.jsx @@ -1,543 +1,346 @@ -import React, { useRef, useEffect, useState, useCallback } from 'react'; -import useStore from './store.js'; -import { OFFICE_MAP, WALLS, DOORWAYS, FURNITURE, TILE_SIZE, MAP_COLS, MAP_ROWS } from './officeMap.js'; +// FarmCanvas.jsx — Clean Canvas 2D renderer for the Virtual Office +// Draws rooms with colored floors/walls, simple furniture, and agent sprites. +// No tile-sheet dependencies. Pure Canvas drawing. -const CANVAS_W = MAP_COLS * TILE_SIZE; // 640 -const CANVAS_H = MAP_ROWS * TILE_SIZE; // 480 +import { useEffect, useRef, useCallback } from 'react'; +import { useStore } from './store'; +import { TILE, COLS, ROWS, rooms, agentDesks, hallwayTiles, furniture } from './officeMap'; -const LERP_SPEED = 0.15; +const SCALE = 2.5; // render pixels per tile pixel +const SPRITE_SCALE = 2.5; -// ── Sprite loader ──────────────────────────────────────────────── -function loadSprite(id) { - const img = new Image(); - img.src = `/office/sprites/agent-${id}.png`; - return img; -} +// Agent sprite image cache +const spriteImages = {}; +let spritesLoaded = 0; +let spritesTotal = 0; -const AGENT_IDS = ['cos', 'engineering', 'senior-eng', 'trust', 'market', 'health', 'content', 'presentations', 'vault']; - -// Preload all sprites -const sprites = {}; -AGENT_IDS.forEach(id => { sprites[id] = loadSprite(id); }); - -// ── Tileset loader ──────────────────────────────────────────────── -let tilesetImg = null; -function loadTileset() { - if (!tilesetImg) { - tilesetImg = new Image(); - tilesetImg.src = '/office/tiles/tileset.png'; - } - return tilesetImg; -} - -let roomBuilderImg = null; -function loadRoomBuilder() { - if (!roomBuilderImg) { - roomBuilderImg = new Image(); - roomBuilderImg.src = '/office/tiles/room-builder.png'; - } - return roomBuilderImg; -} - -// ── Particle system for sparkles ───────────────────────────────── -let sparkles = []; - -function spawnSparkle(x, y) { - sparkles.push({ - x, y, - vx: (Math.random() - 0.5) * 2, - vy: -Math.random() * 3 - 1, - life: 1, - decay: 0.02 + Math.random() * 0.03, - color: ['#F0C040', '#FFD700', '#FFEAA7', '#FFFFFF'][Math.floor(Math.random() * 4)], +function loadSprites() { + const agents = ['cos','engineering','senior-eng','trust','market','health','content','presentations','vault']; + spritesTotal = agents.length; + spritesLoaded = 0; + agents.forEach(id => { + const img = new Image(); + img.src = `/office/sprites/agent-${id}.png`; + img.onload = () => { spritesLoaded++; }; + img.onerror = () => { console.warn('Failed to load sprite:', id); spritesLoaded++; }; + spriteImages[id] = img; }); - if (sparkles.length > 60) sparkles.shift(); } -// ── Tile drawing helpers ────────────────────────────────────────── +loadSprites(); -// Draw a single tile from tileset.png (16-wide grid) -function drawTileFromTileset(ctx, tileId, dx, dy) { - if (tileId < 0 || tileId === undefined) return; - const img = loadTileset(); - if (!img || !img.complete) return; - const sx = (tileId % 16) * TILE_SIZE; - const sy = Math.floor(tileId / 16) * TILE_SIZE; - ctx.drawImage(img, sx, sy, TILE_SIZE, TILE_SIZE, dx, dy, TILE_SIZE, TILE_SIZE); -} +// Draw a rounded rect room +function drawRoom(ctx, room, ox, oy) { + const x = room.x * TILE * SCALE + ox; + const y = room.y * TILE * SCALE + oy; + const w = room.w * TILE * SCALE; + const h = room.h * TILE * SCALE; + const r = 6; -// Draw a single tile from room-builder.png (17-wide grid) -function drawTileFromRoomBuilder(ctx, tileId, dx, dy) { - if (tileId < 0 || tileId === undefined) return; - const img = loadRoomBuilder(); - if (!img || !img.complete) return; - const RB_COLS = 17; - const sx = (tileId % RB_COLS) * TILE_SIZE; - const sy = Math.floor(tileId / RB_COLS) * TILE_SIZE; - ctx.drawImage(img, sx, sy, TILE_SIZE, TILE_SIZE, dx, dy, TILE_SIZE, TILE_SIZE); -} - -// ── Layer 1: Background / outdoors ──────────────────────────────── -function drawBackground(ctx) { - // Dark exterior (outside the office) - ctx.fillStyle = '#1a1a2e'; - ctx.fillRect(0, 0, CANVAS_W, CANVAS_H); - - // Grass/texture around building (top strip) - ctx.fillStyle = '#2D5A27'; - ctx.fillRect(0, 0, CANVAS_W, 3 * TILE_SIZE); - - // Add some texture to the grass - for (let i = 0; i < 300; i++) { - const x = Math.random() * CANVAS_W; - const y = Math.random() * 3 * TILE_SIZE; - ctx.fillStyle = `rgb(${40 + Math.random() * 30},${70 + Math.random() * 40},${30 + Math.random() * 20})`; - ctx.fillRect(x, y, 2, 2); - } -} - -// ── Layer 2: Floor tiles ────────────────────────────────────────── -function drawFloorLayer(ctx) { - const img = loadTileset(); - if (!img || !img.complete) { - // Fallback: draw solid colors - const colors = { - 16: '#C4A882', 22: '#8BA87E', 83: '#9B9B9B', 67: '#B8956E', - 38: '#4A5070', 54: '#7A7A85', 70: '#A89B8A', - }; - for (let row = 0; row < MAP_ROWS; row++) { - for (let col = 0; col < MAP_COLS; col++) { - const tileId = OFFICE_MAP[row]?.[col]; - if (tileId && tileId > 0) { - ctx.fillStyle = colors[tileId] || '#555'; - ctx.fillRect(col * TILE_SIZE, row * TILE_SIZE, TILE_SIZE, TILE_SIZE); - } - } - } - return; - } - - for (let row = 0; row < MAP_ROWS; row++) { - for (let col = 0; col < MAP_COLS; col++) { - const tileId = OFFICE_MAP[row]?.[col]; - if (tileId && tileId > 0) { - drawTileFromTileset(ctx, tileId, col * TILE_SIZE, row * TILE_SIZE); - } - } - } -} - -// ── Layer 3: Walls ──────────────────────────────────────────────── -function drawWallLayer(ctx) { - const img = loadTileset(); - const drawn = new Set(); - - for (const wall of WALLS) { - const key = `${wall.row},${wall.col}`; - if (drawn.has(key)) continue; - drawn.add(key); - - const dx = wall.col * TILE_SIZE; - const dy = wall.row * TILE_SIZE; - - if (img && img.complete) { - drawTileFromTileset(ctx, wall.tile, dx, dy); - } else { - // Fallback wall rendering - ctx.fillStyle = '#6B5B4F'; - ctx.fillRect(dx, dy, TILE_SIZE, TILE_SIZE); - ctx.strokeStyle = '#5A4A3E'; - ctx.lineWidth = 1; - ctx.strokeRect(dx + 1, dy + 1, TILE_SIZE - 2, TILE_SIZE - 2); - } - } -} - -// ── Layer 3.5: Doorways ─────────────────────────────────────────── -function drawDoorways(ctx) { - const img = loadTileset(); - for (const door of DOORWAYS) { - const dx = door.col * TILE_SIZE; - const dy = door.row * TILE_SIZE; - if (img && img.complete) { - drawTileFromTileset(ctx, door.tile, dx, dy); - } else { - // Fallback doorway - ctx.fillStyle = '#4A3520'; - ctx.fillRect(dx, dy, TILE_SIZE, TILE_SIZE); - ctx.fillStyle = '#DAA520'; - ctx.fillRect(dx + TILE_SIZE - 5, dy + TILE_SIZE / 2 - 1, 4, 4); - } - } -} - -// ── Layer 4: Furniture ──────────────────────────────────────────── -function drawFurniture(ctx) { - const img = loadTileset(); - for (const furn of FURNITURE) { - const dx = furn.col * TILE_SIZE; - const dy = furn.row * TILE_SIZE; - if (img && img.complete) { - drawTileFromTileset(ctx, furn.tile, dx, dy); - } else { - // Fallback colored furniture - const fColors = { - 528: '#8B6914', 936: '#4A3728', 736: '#6B4226', 584: '#2D8B2D', - 674: '#DAA520', 1012: '#555', 672: '#8B7355', 996: '#222', - 1010: '#444', 889: '#FFD700', 709: '#EEE', - }; - ctx.fillStyle = fColors[furn.tile] || '#666'; - ctx.fillRect(dx + 2, dy + 2, TILE_SIZE - 4, TILE_SIZE - 4); - } - } -} - -// ── Room labels ─────────────────────────────────────────────────── -function drawRoomLabels(ctx) { - const rooms = [ - { label: 'Briefing Room', col: 0, row: 3, w: 6 }, - { label: 'Commons', col: 6, row: 3, w: 8 }, - { label: 'War Room', col: 14, row: 3, w: 6 }, - { label: 'Engineering Bay', col: 0, row: 9, w: 6 }, - { label: 'Quiet Zone', col: 6, row: 9, w: 8 }, - { label: 'Ops Center', col: 14, row: 9, w: 6 }, - ]; - - for (const room of rooms) { - const cx = room.col * TILE_SIZE + (room.w * TILE_SIZE) / 2; - const topY = room.row * TILE_SIZE; - const labelW = ctx.measureText(room.label).width + 10; - const labelH = 12; - - // Semi-transparent pill behind text - ctx.fillStyle = 'rgba(0,0,0,0.5)'; - ctx.beginPath(); - ctx.roundRect(cx - labelW / 2, topY + 2, labelW, labelH, 3); - ctx.fill(); - - ctx.font = 'bold 8px "Courier New", monospace'; - ctx.textAlign = 'center'; - ctx.fillStyle = '#DDD'; - ctx.fillText(room.label, cx, topY + 11); - } - ctx.textAlign = 'start'; - - // Hallway label - const hx = MAP_COLS * TILE_SIZE / 2; - ctx.fillStyle = 'rgba(0,0,0,0.4)'; - const hlW = ctx.measureText('Hallway').width + 10; + // Floor + ctx.fillStyle = room.floor; ctx.beginPath(); - ctx.roundRect(hx - hlW / 2, 7 * TILE_SIZE + 6, hlW, 12, 3); + ctx.roundRect(x, y, w, h, r); ctx.fill(); - ctx.font = 'bold 8px "Courier New", monospace'; - ctx.textAlign = 'center'; - ctx.fillStyle = '#CCC'; - ctx.fillText('Hallway', hx, 7 * TILE_SIZE + 15); - ctx.textAlign = 'start'; -} - -// ── Layer 5: Agents ─────────────────────────────────────────────── -function drawAgent(ctx, agent, time) { - if (!agent || !agent.position) return; - - const img = sprites[agent.id]; - if (!img) return; - - const target = agent.targetPosition || agent.position; - const current = agent._smoothPos || { row: target.row, col: target.col }; - - // Lerp toward target - current.row += (target.row - current.row) * LERP_SPEED; - current.col += (target.col - current.col) * LERP_SPEED; - - // If very close, snap - if (Math.abs(target.row - current.row) < 0.01) current.row = target.row; - if (Math.abs(target.col - current.col) < 0.01) current.col = target.col; - - agent._smoothPos = current; - - const activity = agent.activity || 'idle'; - const px = current.col * TILE_SIZE + TILE_SIZE / 2; - const py = current.row * TILE_SIZE + TILE_SIZE / 2; - - // Vertical bob for idle - let yOffset = 0; - if (activity === 'idle') { - yOffset = Math.sin(time * 0.003 + (agent.id?.charCodeAt(0) || 0)) * 2; - } + // Floor grain pattern (subtle diagonal lines for warmth) ctx.save(); - ctx.globalAlpha = 0.95; - ctx.translate(px, py + yOffset); - - // Activity states - if (activity === 'offline') { - ctx.globalAlpha = 0.5; - ctx.filter = 'grayscale(100%)'; + ctx.beginPath(); + ctx.roundRect(x, y, w, h, r); + ctx.clip(); + ctx.strokeStyle = room.accent + '30'; // 30 = ~19% opacity + ctx.lineWidth = 1; + for (let i = -h; i < w + h; i += 12) { + ctx.beginPath(); + ctx.moveTo(x + i, y); + ctx.lineTo(x + i + h, y + h); + ctx.stroke(); } - - // Draw sprite centered - const sx = img.width > 32 ? 0 : 0; - const spriteW = img.width > 32 ? Math.min(32, img.width) : img.width; - const spriteH = img.height; - ctx.drawImage(img, sx, 0, spriteW, spriteH, -16, -16, 32, 32); - ctx.restore(); - // Blocked: red tint overlay - if (activity === 'blocked') { - ctx.fillStyle = 'rgba(255,50,50,0.3)'; - ctx.fillRect(px - 16, py + yOffset - 16, 32, 32); - ctx.font = 'bold 12px "Courier New", monospace'; - ctx.fillStyle = '#FF4444'; - ctx.textAlign = 'center'; - ctx.fillText('!', px, py + yOffset - 24); + // Wall border + ctx.strokeStyle = room.wall; + ctx.lineWidth = 3; + ctx.beginPath(); + ctx.roundRect(x, y, w, h, r); + ctx.stroke(); + + // Doorways — gaps in the bottom wall + const doorWidth = TILE * SCALE; + ctx.fillStyle = '#8a7a6a'; // doorframe color + // Left door + ctx.fillRect(x + 1 * TILE * SCALE - doorWidth/2, y + h - 3, doorWidth, 6); + // Right door + if (room.w >= 5) { + ctx.fillRect(x + (room.w - 2) * TILE * SCALE - doorWidth/2, y + h - 3, doorWidth, 6); } - // Agent name below (centered with shadow) - ctx.font = '9px "Courier New", monospace'; + // Room name label — small, above room + ctx.fillStyle = room.wall; + ctx.font = `bold ${Math.round(11 * SCALE / 2.5)}px 'EB Garamond', serif`; ctx.textAlign = 'center'; - ctx.fillStyle = '#000'; - ctx.fillText(agent.name || agent.id, px + 1, py + yOffset + 27); - ctx.fillStyle = '#FFF'; - ctx.fillText(agent.name || agent.id, px, py + yOffset + 26); + ctx.textBaseline = 'bottom'; + ctx.fillText(room.name, x + w / 2, y - 4); +} - // Thinking bubble - if (activity === 'thinking') { - ctx.font = 'bold 10px "Courier New", monospace'; - ctx.textAlign = 'center'; - const bubbleW = 24; - const bubbleH = 14; - const bx = px - bubbleW / 2; - const by = py + yOffset - 44; +// Draw simple furniture shapes +function drawFurniture(ctx, room, ox, oy) { + const items = furniture[room.id] || []; + items.forEach(item => { + const x = (room.x + item.rx) * TILE * SCALE + ox; + const y = (room.y + item.ry) * TILE * SCALE + oy; + const w = (item.w || 1) * TILE * SCALE; + const h = (item.h || 1) * TILE * SCALE; - ctx.fillStyle = '#FFF'; - ctx.beginPath(); - ctx.roundRect(bx, by, bubbleW, bubbleH, 3); - ctx.fill(); - ctx.strokeStyle = '#CCC'; - ctx.lineWidth = 1; - ctx.stroke(); - ctx.fillStyle = '#333'; - ctx.fillText('...', px, py + yOffset - 33); - } - - // Sparkles for working - if (activity === 'working') { - if (Math.random() < 0.3) { - spawnSparkle(px + (Math.random() - 0.5) * 24, py + yOffset - 12); + ctx.save(); + switch (item.type) { + case 'table': + ctx.fillStyle = room.accent; + ctx.beginPath(); + ctx.roundRect(x + 2, y + 2, w - 4, h - 4, 3); + ctx.fill(); + ctx.strokeStyle = room.wall + '60'; + ctx.lineWidth = 1; + ctx.stroke(); + break; + case 'desk': + ctx.fillStyle = room.accent; + ctx.fillRect(x + 2, y + 4, w - 4, h - 8); + ctx.strokeStyle = room.wall + '80'; + ctx.lineWidth = 1; + ctx.strokeRect(x + 2, y + 4, w - 4, h - 8); + break; + case 'chair': + ctx.fillStyle = room.wall; + ctx.fillRect(x + 8, y + 8, TILE * SCALE - 16, TILE * SCALE - 16); + break; + case 'monitor': + ctx.fillStyle = '#1a1a2e'; + ctx.fillRect(x + 10, y + 6, TILE * SCALE - 20, TILE * SCALE * 0.5); + ctx.fillStyle = '#4a9eff'; + ctx.fillRect(x + 12, y + 8, TILE * SCALE - 24, TILE * SCALE * 0.5 - 6); + break; + case 'sofa': + ctx.fillStyle = room.accent + 'cc'; + ctx.beginPath(); + ctx.roundRect(x + 2, y + 2, w - 4, h - 4, 4); + ctx.fill(); + ctx.strokeStyle = room.wall; + ctx.lineWidth = 1; + ctx.stroke(); + break; + case 'shelf': + case 'bookcase': + ctx.fillStyle = room.wall; + ctx.fillRect(x + 2, y + 2, w - 4, h - 4); + // Book spines + for (let b = 0; b < Math.min(w / 6, 8); b++) { + ctx.fillStyle = ['#c44','#4a4','#44a','#a4a','#ca4'][b % 5]; + ctx.fillRect(x + 4 + b * 6, y + 4, 4, h - 8); + } + break; + case 'plant': + ctx.fillStyle = '#2a6a2a'; + ctx.beginPath(); + ctx.arc(x + TILE * SCALE / 2, y + TILE * SCALE / 2, TILE * SCALE / 3, 0, Math.PI * 2); + ctx.fill(); + ctx.fillStyle = '#5a3a1a'; + ctx.fillRect(x + TILE * SCALE / 2 - 4, y + TILE * SCALE / 2 + 4, 8, 8); + break; + case 'lamp': + ctx.fillStyle = '#ffd700'; + ctx.beginPath(); + ctx.arc(x + TILE * SCALE / 2, y + TILE * SCALE / 2, 6, 0, Math.PI * 2); + ctx.fill(); + // Glow + const grad = ctx.createRadialGradient( + x + TILE * SCALE / 2, y + TILE * SCALE / 2, 2, + x + TILE * SCALE / 2, y + TILE * SCALE / 2, 20 + ); + grad.addColorStop(0, 'rgba(255,215,0,0.3)'); + grad.addColorStop(1, 'rgba(255,215,0,0)'); + ctx.fillStyle = grad; + ctx.beginPath(); + ctx.arc(x + TILE * SCALE / 2, y + TILE * SCALE / 2, 20, 0, Math.PI * 2); + ctx.fill(); + break; + case 'screen': + ctx.fillStyle = '#2a2a3e'; + ctx.fillRect(x + 2, y + 2, w - 4, h - 4); + ctx.fillStyle = '#3a5aff'; + ctx.fillRect(x + 4, y + 4, w - 8, h - 8); + break; } - } - - ctx.textAlign = 'start'; + ctx.restore(); + }); } -function drawParticles(ctx) { - sparkles = sparkles.filter(s => s.life > 0); - for (const s of sparkles) { - s.x += s.vx; - s.y += s.vy; - s.life -= s.decay; - const alpha = Math.max(0, s.life); - ctx.fillStyle = s.color; - ctx.globalAlpha = alpha; - ctx.fillRect(s.x, s.y, 2, 2); - } - ctx.globalAlpha = 1; +// Draw hallway +function drawHallway(ctx, ox, oy) { + const hw = COLS * TILE * SCALE; + const hh = ROWS * TILE * SCALE; + + // Background + ctx.fillStyle = '#1a1a28'; + ctx.fillRect(ox, oy, hw, hh); + + // Hallway tiles + hallwayTiles.forEach(({ x, y }) => { + const px = x * TILE * SCALE + ox; + const py = y * TILE * SCALE + oy; + ctx.fillStyle = '#2a2a3e'; + ctx.fillRect(px, py, TILE * SCALE, TILE * SCALE); + // Subtle grid + ctx.strokeStyle = '#3a3a4e'; + ctx.lineWidth = 0.5; + ctx.strokeRect(px, py, TILE * SCALE, TILE * SCALE); + }); } -// ── Component ───────────────────────────────────────────────────── -export default function FarmCanvas({ onAgentClick, onAgentHover }) { +// Draw an agent +function drawAgent(ctx, agent, ox, oy) { + const img = spriteImages[agent.id]; + if (!img || !img.complete || img.naturalWidth === 0) return; + + const sx = agent.x * TILE * SCALE + ox; + const sy = agent.y * TILE * SCALE + oy; + const spriteSize = 32 * SPRITE_SCALE; + + // Center sprite on tile + const dx = sx + (TILE * SCALE - spriteSize) / 2; + const dy = sy + (TILE * SCALE - spriteSize) / 2 - 4; // slight lift + + // Shadow + ctx.fillStyle = 'rgba(0,0,0,0.2)'; + ctx.beginPath(); + ctx.ellipse(dx + spriteSize / 2, dy + spriteSize + 2, spriteSize / 3, 4, 0, 0, Math.PI * 2); + ctx.fill(); + + // Sprite + ctx.imageSmoothingEnabled = false; + ctx.drawImage(img, dx, dy, spriteSize, spriteSize); + + // Activity indicator dot + const statusColors = { + active: '#4aff4a', + idle: '#888', + error: '#ff4444', + offline: '#555', + }; + const color = statusColors[agent.status] || statusColors.idle; + ctx.fillStyle = color; + ctx.beginPath(); + ctx.arc(dx + spriteSize - 4, dy + 4, 4, 0, Math.PI * 2); + ctx.fill(); + ctx.strokeStyle = '#000'; + ctx.lineWidth = 1; + ctx.stroke(); +} + +export default function FarmCanvas() { const canvasRef = useRef(null); - const animRef = useRef(null); const agents = useStore(s => s.agents); - const agentList = React.useMemo(() => Object.values(agents), [agents]); + const hoveredAgent = useStore(s => s.hoveredAgent); + const setHoveredAgent = useStore(s => s.setHoveredAgent); + const selectAgent = useStore(s => s.selectAgent); + const containerRef = useRef(null); - // Hover state - const [hoveredAgent, setHoveredAgent] = useState(null); - const hoveredRef = useRef(null); + const canvasWidth = COLS * TILE * SCALE; + const canvasHeight = ROWS * TILE * SCALE; - // Detect agent under mouse - const getAgentAtPoint = useCallback((mx, my) => { - for (const agent of [...agentList].reverse()) { - const pos = agent._smoothPos || agent.position; - if (!pos) continue; - const px = pos.col * TILE_SIZE + TILE_SIZE / 2; - const py = pos.row * TILE_SIZE + TILE_SIZE / 2; - if (Math.abs(mx - px) < 20 && Math.abs(my - py) < 20) { - return agent; + const render = useCallback(() => { + const canvas = canvasRef.current; + if (!canvas) return; + const ctx = canvas.getContext('2d'); + + // Clear + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + // Background + ctx.fillStyle = '#1a1a28'; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + + // Draw hallways + drawHallway(ctx, 0, 0); + + // Draw rooms + rooms.forEach(room => { + drawRoom(ctx, room, 0, 0); + drawFurniture(ctx, room, 0, 0); + }); + + // Draw agents (sorted so hovered agent renders on top) + const sortedAgents = [...agents].sort((a, b) => { + if (a.id === hoveredAgent) return 1; + if (b.id === hoveredAgent) return -1; + return 0; + }); + sortedAgents.forEach(agent => drawAgent(ctx, agent, 0, 0)); + + // Hover highlight + if (hoveredAgent) { + const agent = agents.find(a => a.id === hoveredAgent); + if (agent) { + const hx = agent.x * TILE * SCALE; + const hy = agent.y * TILE * SCALE; + ctx.strokeStyle = '#ffd700'; + ctx.lineWidth = 2; + ctx.beginPath(); + ctx.roundRect(hx + 2, hy + 2, TILE * SCALE - 4, TILE * SCALE - 4, 4); + ctx.stroke(); } } - return null; - }, [agentList]); + }, [agents, hoveredAgent]); - // Mouse move → hover detection + useEffect(() => { + render(); + }, [render]); + + // Handle mouse for hover detection const handleMouseMove = useCallback((e) => { const canvas = canvasRef.current; if (!canvas) return; const rect = canvas.getBoundingClientRect(); - const scaleX = CANVAS_W / rect.width; - const scaleY = CANVAS_H / rect.height; + const scaleX = canvasWidth / rect.width; + const scaleY = canvasHeight / rect.height; const mx = (e.clientX - rect.left) * scaleX; const my = (e.clientY - rect.top) * scaleY; - const agent = getAgentAtPoint(mx, my); - hoveredRef.current = agent; - setHoveredAgent(agent); - if (onAgentHover) onAgentHover(agent); - }, [getAgentAtPoint, onAgentHover]); - // Mouse leave → clear hover - const handleMouseLeave = useCallback(() => { - hoveredRef.current = null; - setHoveredAgent(null); - if (onAgentHover) onAgentHover(null); - }, [onAgentHover]); + const tx = Math.floor(mx / (TILE * SCALE)); + const ty = Math.floor(my / (TILE * SCALE)); - // Canvas click → open detail card for hovered agent - const handleCanvasClick = useCallback((e) => { - const agent = hoveredRef.current; - if (agent) { - onAgentClick(agent); + // Find agent at this tile + const found = agents.find(a => { + const ax = Math.floor(a.x); + const ay = Math.floor(a.y); + return (tx === ax && ty === ay) || (tx === ax && ty === ay - 1); + }); + + setHoveredAgent(found ? found.id : null); + }, [agents, setHoveredAgent]); + + const handleClick = useCallback((e) => { + if (hoveredAgent) { + selectAgent(hoveredAgent); } - }, [onAgentClick]); - - // Animation loop - useEffect(() => { - const canvas = canvasRef.current; - if (!canvas) return; - const ctx = canvas.getContext('2d'); - ctx.imageSmoothingEnabled = false; // pixel-art crisp - - // Pre-load tileset - loadTileset(); - let startTime = Date.now(); - - function loop() { - const time = Date.now() - startTime; - ctx.clearRect(0, 0, CANVAS_W, CANVAS_H); - - // Layer 1: Background (outdoor area around building) - drawBackground(ctx); - - // Layer 2: Floor tiles (from tileset) - drawFloorLayer(ctx); - - // Layer 3: Walls (from tileset, drawn on top of floors) - drawWallLayer(ctx); - - // Layer 3.5: Doorways (openings in walls) - drawDoorways(ctx); - - // Layer 4: Furniture - drawFurniture(ctx); - - // Room labels - drawRoomLabels(ctx); - - // Layer 5: Agents - const currentAgents = useStore.getState().agents; - for (const agent of Object.values(currentAgents)) { - drawAgent(ctx, agent, time); - } - - // Hover tooltip - const hAgent = hoveredRef.current; - if (hAgent) { - const pos = hAgent._smoothPos || hAgent.position; - if (pos) { - const hpx = pos.col * TILE_SIZE + TILE_SIZE / 2; - const hpy = pos.row * TILE_SIZE + TILE_SIZE / 2; - const activity = hAgent.activity || 'idle'; - const name = hAgent.name || hAgent.id; - const task = hAgent.currentTask || hAgent.task || ''; - - const statusColors = { - idle: '#44cc44', working: '#ffcc00', thinking: '#44aaff', - offline: '#888', blocked: '#ff4444', - }; - const statusColor = statusColors[activity] || '#888'; - - ctx.font = '10px "Courier New", monospace'; - const nameW = ctx.measureText(name).width; - ctx.font = '9px "Courier New", monospace'; - const statusW = ctx.measureText(activity).width; - const taskW = task ? Math.min(ctx.measureText(task).width, 180) : 0; - const tooltipW = Math.max(nameW + 28, statusW + taskW + 8) + 16; - const tooltipH = task ? 48 : 36; - - const tx = Math.min(hpx + 10, CANVAS_W - tooltipW - 4); - const ty = Math.max(hpy - tooltipH - 24, 4); - - // Tooltip background - ctx.fillStyle = 'rgba(0,0,0,0.82)'; - ctx.beginPath(); - ctx.roundRect(tx, ty, tooltipW, tooltipH, 6); - ctx.fill(); - ctx.strokeStyle = 'rgba(255,255,255,0.2)'; - ctx.lineWidth = 1; - ctx.stroke(); - - // Name - ctx.font = 'bold 10px "Courier New", monospace'; - ctx.textAlign = 'left'; - ctx.fillStyle = '#FFF'; - ctx.fillText(name, tx + 8, ty + 14); - - // Status badge - ctx.font = '9px "Courier New", monospace'; - ctx.fillStyle = 'rgba(0,0,0,0.5)'; - ctx.beginPath(); - ctx.roundRect(tx + nameW + 12, ty + 5, statusW + 8, 14, 3); - ctx.fill(); - ctx.fillStyle = statusColor; - ctx.fillText(activity, tx + nameW + 16, ty + 15); - - // Task line - if (task) { - ctx.font = '8px "Courier New", monospace'; - ctx.fillStyle = '#aaa'; - const taskText = task.length > 35 ? task.slice(0, 32) + '...' : task; - ctx.fillText(taskText, tx + 8, ty + 34); - } - } - } - - drawParticles(ctx); - - animRef.current = requestAnimationFrame(loop); - } - - loop(); - return () => { - if (animRef.current) cancelAnimationFrame(animRef.current); - }; - }, []); + }, [hoveredAgent, selectAgent]); return ( -