support sizes other than 9

This commit is contained in:
Eric Mertens 2022-12-06 13:39:30 -08:00
parent b396d85eae
commit 2912fb9488
19 changed files with 346 additions and 771 deletions

View File

@ -34,7 +34,7 @@ parseBlocks (x:xs) =
case words x of case words x of
["block", [name], color, boring] -> ["block", [name], color, boring] ->
do color_ <- parseColor color do color_ <- parseColor color
let (xs1,xs2) = splitAt 9 xs let (xs1,xs2) = splitWalls xs
let locs = findLocs name xs1 let locs = findLocs name xs1
let b = Box undefined (Original (walls xs1)) color_ (boring == "boring") let b = Box undefined (Original (walls xs1)) color_ (boring == "boring")
bs <- parseBlocks xs2 bs <- parseBlocks xs2
@ -49,13 +49,17 @@ parseBlocks (x:xs) =
pure ((name, Box undefined (Infinity target) color_ True,[]):bs) pure ((name, Box undefined (Infinity target) color_ True,[]):bs)
["epsilon", [name], [target], color] -> ["epsilon", [name], [target], color] ->
do color_ <- parseColor color do color_ <- parseColor color
let (xs1,xs2) = splitAt 9 xs let (xs1,xs2) = splitWalls xs
let locs = findLocs name xs1 let locs = findLocs name xs1
let b = Box undefined (Epsilon target (walls xs1)) color_ False let b = Box undefined (Epsilon target (walls xs1)) color_ False
bs <- parseBlocks xs2 bs <- parseBlocks xs2
pure ((name, b, locs):bs) pure ((name, b, locs):bs)
_ -> Left "bad block" _ -> Left "bad block"
splitWalls (x:xs) =
case splitAt (length x - 1) xs of
(a,b) -> (x:a, b)
parseColor :: String -> Either String Attr parseColor :: String -> Either String Attr
parseColor "white" = Right (withForeColor defAttr white) parseColor "white" = Right (withForeColor defAttr white)
parseColor "cyan" = Right (withForeColor defAttr cyan) parseColor "cyan" = Right (withForeColor defAttr cyan)
@ -68,11 +72,23 @@ parseColor "green" = Right (withForeColor defAttr green)
parseColor x = Left ("bad color " ++ x) parseColor x = Left ("bad color " ++ x)
walls :: [String] -> Array Coord Bool walls :: [String] -> Array Coord Bool
walls rows = listArray ((-4,-4),(4,4)) (map ('▓'==) (concat rows)) walls rows = listArray ((ylo,xlo),(yhi,xhi)) (map ('▓'==) (concat rows))
where
width = length (head rows)
height = length rows
ylo = - ((height - 1) `div` 2)
yhi = height `div` 2
xlo = - ((width - 1) `div` 2)
xhi = width `div` 2
mkRange :: Int -> (Int, Int)
mkRange n = (-(n-1)`div`2, n`div`2)
findLocs :: Char -> [[Char]] -> [(Char, Location)] findLocs :: Char -> [[Char]] -> [(Char, Location)]
findLocs name xs = findLocs name xs =
[ (c, Location name y x) [ (c, Location name y x)
| (y, row) <- zip [-4..] xs | let (ylo, yhi) = mkRange (length xs)
, (x, c ) <- zip [-4..] row , (y, row) <- zip [ylo .. yhi] xs
, let (xlo,xhi) = mkRange (length row)
, (x, c ) <- zip [xlo..xhi] row
] ]

View File

@ -4,52 +4,55 @@ import Data.Array
import Data.Map (Map) import Data.Map (Map)
import Data.Map qualified as Map import Data.Map qualified as Map
import Data.Set qualified as Set import Data.Set qualified as Set
import Data.List (intersperse) import Data.List (intersperse, group)
import Graphics.Vty import Graphics.Vty
import Model import Model
border :: Int border :: Int
border = 20 border = 20
unit :: Attr -> Int -> Char -> Image unit :: Attr -> Int -> Int -> Char -> Image
unit a scale x = unit a h w c =
vertCat (replicate scale (string a (replicate (2*scale) x))) vertCat (replicate h (string a (replicate w c)))
drawBox :: Attr -> Int {- ^ width -} -> Int {- ^ height -} -> Image drawBox :: Attr -> Int {- ^ width -} -> Int {- ^ height -} -> Image
drawBox a _ 1 = string a "[]" drawBox a 2 1 = string a "[]"
drawBox a w 1 = string a ("[" ++ replicate (w-2) '-' ++ "]")
drawBox a w h = vertCat $ drawBox a w h = vertCat $
string a ('┌' : replicate (w-2) '─' ++ "") : string a ('┌' : replicate (w-2) '─' ++ "") :
replicate (h-2) (string a ('│' : replicate (w-2) ' ' ++ "")) ++ replicate (h-2) (string a ('│' : replicate (w-2) ' ' ++ "")) ++
[string a ('└' : replicate (w-2) '─' ++ "")] [string a ('└' : replicate (w-2) '─' ++ "")]
button :: Attr -> Int -> Image button :: Attr -> Int -> Int -> Image
button a 1 = string a "[]" button a 1 2 = string a "[]"
button a n = vertCat $ button a 1 n = string a ("[" ++ replicate (n-2) '-' ++ "]")
string a ('┌' : replicate (2*n-2) '─' ++ "") : button a h w = vertCat $
replicate (n-2) (string a ('│' : replicate (2*n-2) '░' ++ "")) ++ string a ('┌' : replicate (w-2) '─' ++ "") :
[string a ('└' : replicate (2*n-2) '─' ++ "")] replicate (h-2) (string a ('│' : replicate (w-2) '░' ++ "")) ++
[string a ('└' : replicate (w-2) '─' ++ "")]
home :: Attr -> Int -> Image home :: Attr -> Int -> Int -> Image
home a 1 = string a "<>" home a 1 2 = string a "<>"
home a n = vertCat $ home a 1 w = string a ("<" ++ replicate (w-2) '=' ++ ">")
string a ('╔' : replicate (2*n-2) '═' ++ "") : home a h w = vertCat $
replicate (n-2) (string a ('║' : replicate (2*n-2) '░' ++ "")) ++ string a ('╔' : replicate (w-2) '═' ++ "") :
[string a ('╚' : replicate (2*n-2) '═' ++ "")] replicate (h-2) (string a ('║' : replicate (w-2) '░' ++ "")) ++
[string a ('╚' : replicate (w-2) '═' ++ "")]
renderCell :: World -> Map Location Char -> Char -> Box -> Int -> Int -> Int -> Image renderCell :: World -> Map Location Char -> Char -> Box -> Int -> Int -> Int -> Int -> Image
renderCell world locMap name box y x scale = renderCell world locMap name box y x h w =
if boxWalls world box ! (y,x) then unit (boxColor box) scale wallChar if boxWalls world box ! (y,x) then unit (boxColor box) h w wallChar
else case Map.lookup (Location name' y x) locMap of else case Map.lookup (Location name' y x) locMap of
Just n -> Just n ->
if scale < 9 let box' = worldBoxes world Map.! n
then unit (boxColor (worldBoxes world Map.! n)) scale n in if h < boxSize world box'
else renderBox world locMap (worldBoxes world Map.! n) n then unit (boxColor box') h w n
(scale `div` boxSize world box) else renderBox world locMap box' n
h w
Nothing Nothing
| Set.member loc (worldButtons world) -> button (boxColor box) scale | Set.member loc (worldButtons world) -> button (boxColor box) h w
| loc == worldHome world -> home (boxColor box) scale | loc == worldHome world -> home (boxColor box) h w
| otherwise -> unit (boxColor box) scale floorChar | otherwise -> unit (boxColor box) h w floorChar
where where
loc = Location name' y x loc = Location name' y x
name' = contentName world name box name' = contentName world name box
@ -74,16 +77,19 @@ contentName world name box =
Infinity c -> contentName world c (worldBoxes world Map.! c) Infinity c -> contentName world c (worldBoxes world Map.! c)
Epsilon{} -> name Epsilon{} -> name
renderBox :: World -> Map Location Char -> Box -> Char -> Int -> Image renderBox :: World -> Map Location Char -> Box -> Char -> Int -> Int -> Image
renderBox world locMap box name scale = renderBox world locMap box name h w =
vertCat [ vertCat [
horizCat [ horizCat [
renderCell world locMap name box y x scale renderCell world locMap name box y x h w
| x <- [xlo .. xhi] | (x,w) <- zip [xlo .. xhi] (divisions boxWidth w)
] ]
| let ((ylo,xlo),(yhi,xhi)) = bounds (boxWalls world box) | (y,h) <- zip [ylo .. yhi] (divisions boxHeight h)
, y <- [ylo .. yhi]
] ]
where
((ylo,xlo),(yhi,xhi)) = bounds (boxWalls world box)
boxWidth = xhi - xlo + 1
boxHeight = yhi - ylo + 1
render :: render ::
Bool {- ^ show flat overlay -} -> Bool {- ^ show flat overlay -} ->
@ -115,7 +121,7 @@ renderFlat locMap world =
pad 2 1 2 1 $ pad 2 1 2 1 $
horizCat $ horizCat $
intersperse (char borderAttr ' ') intersperse (char borderAttr ' ')
[renderBox world locMap b n 2 [renderBox world locMap b n 18 36
| (n,b) <- Map.assocs (worldBoxes world) | (n,b) <- Map.assocs (worldBoxes world)
, not (boxBoring b)] , not (boxBoring b)]
@ -133,10 +139,10 @@ drawNestedWorld locMap world =
intersperse (char defAttr ' ') intersperse (char defAttr ' ')
[ [
case stackedLoc world locMap (Location name1 y_ x_) of case stackedLoc world locMap (Location name1 y_ x_) of
Nothing -> unit (withForeColor defAttr black) 81 '?' Nothing -> unit (withForeColor defAttr black) 81 162 '?'
Just (Location n y x) -> Just (Location n y x) ->
let box = worldBoxes world Map.! n in let box = worldBoxes world Map.! n in
renderCell world locMap n box y x 81 renderCell world locMap n box y x 81 (81*2)
| x_ <- [x1-1 .. x1+1] | x_ <- [x1-1 .. x1+1]
] ]
| y_ <- [y1-1 .. y1+1] | y_ <- [y1-1 .. y1+1]
@ -193,3 +199,15 @@ fixup1 _ _ 0 i = i
fixup1 _ hi (-1) _ = hi fixup1 _ hi (-1) _ = hi
fixup1 lo _ 1 _ = lo fixup1 lo _ 1 _ = lo
fixup1 _ _ _ _ = error "fixup1: bad delta" fixup1 _ _ _ _ = error "fixup1: bad delta"
divisions :: Int -> Int -> [Int]
divisions divs size =
map length $ group
[ round (
(fromIntegral i + 1 / 2)
/ fromIntegral size
* fromIntegral divs
- 1/2
)
| i <- [0 ..size-1]
]

View File

@ -1,14 +1,10 @@
player p player p
block t cyan boring block t cyan boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓a▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓a▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block a cyan interesting block a cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓ p =▓ ▓ p =▓
@ -21,31 +17,13 @@ block a cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block g green interesting block g green interesting
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
block x yellow boring block x yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -20,32 +20,16 @@ block a white interesting
▓▓▓▓- =▓▓ ▓▓▓▓- =▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block g green interesting block g green interesting
x ▓▓ x ▓
▓▓▓▓▓ ▓▓▓
block x yellow boring block x yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -11,52 +11,18 @@ block g green interesting
▓ ▓ ▓ ▓ ▓ ▓
link G g green link G g green
block c yellow interesting block c yellow interesting
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓ ▓▓▓
▓▓ = ▓=
▓▓▓ ▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 1 red boring block 1 red boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 2 red boring block 2 red boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 3 red boring block 3 red boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t red boring block t red boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓r▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓r▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block r red interesting block r red interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
@ -20,42 +16,22 @@ block r red interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block b blue interesting block b blue interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓
▓▓
▓▓ ▓▓▓▓▓
▓▓
▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block g green interesting block g green interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓-▓▓
▓▓▓▓▓▓▓▓▓ ▓▓ ▓▓
▓▓▓▓-▓▓▓▓ ▓▓-▓▓
▓▓▓▓ ▓▓▓▓
▓▓▓▓ ▓▓▓▓
▓▓▓▓ ▓▓▓▓
▓▓▓▓-▓▓▓▓
block y yellow boring block y yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t white boring block t white boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓a▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓a▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block a white interesting block a white interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓ ▓▓ ▓▓ ▓▓
@ -20,32 +16,16 @@ block a white interesting
▓▓▓▓ ▓ ▓▓▓▓ ▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block c yellow interesting block c yellow interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓
▓▓▓▓▓▓▓▓▓
▓▓▓ ▓▓▓ ▓ ▓
▓▓▓ ▓▓▓▓▓
▓▓▓ ▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block b blue boring block b blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t white boring block t white boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓t▓▓▓w▓▓ ▓t▓w▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block w white interesting block w white interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓ ▓▓ ▓▓ ▓▓
@ -23,71 +19,27 @@ link G g green
link H g green link H g green
block g green interesting block g green interesting
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
▓▓▓▓▓▓▓
epsilon ε g green epsilon ε g green
4 4
1 --- 3 1 --- 3
▓H ▓H
▓▓ 2 ▓▓ 2
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 1 blue boring block 1 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 2 blue boring block 2 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 3 blue boring block 3 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 4 blue boring block 4 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -12,15 +12,9 @@ block g green interesting
infinity ∞ g green infinity ∞ g green
link G g green link G g green
epsilon ε g green epsilon ε g green
▓▓▓▓ ▓▓▓▓ ▓ ▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓ ▓▓▓ ▓ ▓
▓▓▓ ▓▓▓▓▓
▓▓▓ ▓▓▓
▓▓▓ ▓▓▓▓▓
▓▓▓▓ ▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓ ▓▓▓▓
block y yellow interesting block y yellow interesting
▓▓▓▓ ▓ ▓▓ ▓▓▓▓ ▓ ▓▓
▓▓▓▓ ▓ ▓▓ ▓▓▓▓ ▓ ▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t white boring block t white boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓w▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓w▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block w white interesting block w white interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓ g G ▓▓ ▓▓ g G ▓▓
@ -23,10 +19,6 @@ block g green interesting
infinity ∞ g green infinity ∞ g green
@ -35,19 +27,9 @@ epsilon ε g green
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -42,52 +42,12 @@ epsilon ε r red
block 1 blue boring block 1 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 2 blue boring block 2 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 3 blue boring block 3 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 4 blue boring block 4 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 5 blue boring block 5 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -10,32 +10,20 @@ block a cyan interesting
▓▓ ▓ ▓▓ ▓
▓▓ ▓ ▓▓ ▓
block g green interesting block g green interesting
▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓
▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓
▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓
▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓
▓▓▓▓ ▓▓▓▓ ▓▓ ▓▓
▓▓▓▓ ▓▓▓▓ block y yellow interesting
▓▓▓▓ ▓▓▓▓ ▓▓▓ ▓
▓▓▓▓ ▓▓▓▓ ▓▓▓=▓
▓▓▓▓ ▓▓▓▓ ▓▓▓▓▓
block y yellow boring ▓▓▓▓▓
▓▓▓▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓=▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t cyan boring block t cyan boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓t▓▓▓a▓▓ ▓t▓a▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block a cyan interesting block a cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓ 1▓▓ ▓▓ 1▓▓
@ -22,22 +18,10 @@ block a cyan interesting
link p c magenta link p c magenta
link C c magenta link C c magenta
block 1 blue boring block 1 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block c magenta interesting block c magenta interesting
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player A player A
block t cyan boring block t cyan boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓a▓t▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓a▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓t▓
▓▓▓▓▓▓▓▓▓
block a red interesting block a red interesting
@ -31,12 +27,4 @@ block b yellow interesting
block 1 blue boring block 1 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t white boring block t white boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓w▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓w▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block w white interesting block w white interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
@ -20,112 +16,16 @@ block w white interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block c red interesting block c red interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓
▓▓▓▓▓▓▓▓▓ -▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓
▓▓▓▓▓▓▓▓▓
-▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p red interesting block p red interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓
▓▓ ▓▓▓ ▓▓
▓▓▓▓▓▓▓▓▓
3456789 ▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 1 blue boring block 1 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ block 2 yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ block 3 black boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 2 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 3 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 4 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 5 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 6 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 7 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 8 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 9 blue boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -10,32 +10,18 @@ block b blue interesting
▓ ▓ ▓ ▓
▓▓▓▓ ▓▓▓▓ ▓▓▓▓ ▓▓▓▓
block g green interesting block g green interesting
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
-▓▓▓
▓▓▓▓ -▓▓
▓▓▓▓= -▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block y yellow interesting
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ -▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓ -▓
▓▓▓▓▓▓▓▓▓ ▓▓▓= -▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓
block y yellow interesting
block p magenta boring
▓▓▓▓▓
▓ ▓ ▓
▓▓▓▓▓
▓▓▓▓▓
▓▓▓▓▓

View File

@ -1,6 +1,5 @@
player p player p
block a cyan interesting block a cyan interesting
▓▓ ▓▓
▓ ▓ ▓ ▓
g g
@ -8,34 +7,24 @@ block a cyan interesting
p a p a
▓ ▓ ▓ ▓
▓▓ ▓▓
block g green interesting block g green interesting
▓▓▓ ▓▓▓
▓=▓ ▓=▓
- -
▓▓ ▓▓▓ ▓▓
▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓
y ▓ ▓
▓ ▓ ▓ ▓ ▓ ▓
y
block y yellow interesting block y yellow interesting
▓▓ ▓▓ ▓ ▓
▓ ▓ ▓ ▓
▓ ▓ ▓ ▓
▓ ▓ ▓ ▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,14 +1,10 @@
player p player p
block t blue boring block t blue boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓a▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓a▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block a blue interesting block a blue interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
@ -20,62 +16,34 @@ block a blue interesting
▓ ▓ ▓ ▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▓
block x yellow boring block x yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 1 cyan interesting block 1 cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓ ▓▓
▓▓ ▓▓
▓▓ ▓▓ ▓▓▓▓▓
▓▓ ▓▓
▓▓▓▓▓▓ ▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 2 cyan interesting block 2 cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓ ▓
▓▓▓ ▓
▓▓▓ ▓ ▓▓▓▓▓
▓▓ ▓▓
▓▓▓▓▓▓ ▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block 3 cyan interesting block 3 cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓ ▓▓▓▓▓▓
▓▓ ▓▓
▓ ▓▓ ▓▓▓▓▓
▓▓ ▓▓
▓ ▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block T green interesting block T green interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓ = ▓▓▓ ▓ = ▓
▓▓▓ ▓▓▓ ▓ ▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓▓ ▓▓▓ ▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓

View File

@ -1,71 +1,37 @@
player p player p
block t cyan boring block t cyan boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓t▓a▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓t▓a▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block a cyan interesting block a cyan interesting
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓▓
▓▓ ▓▓▓ ▓ xb ▓▓
▓▓ xb ▓▓▓ ▓ g▓
▓▓ g▓▓ ▓ py ▓▓
▓▓ py ▓▓▓ ▓ ▓▓
▓▓ ▓▓▓ ▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block g green interesting block g green interesting
▓▓▓
▓ ▓ ▓ = ▓
▓▓ = ▓▓
▓ ▓
▓▓▓
block b blue interesting block b blue interesting
▓▓▓
▓▓ ▓▓
▓ ▓
▓▓ ▓▓
▓▓▓
block x yellow boring block x yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block y yellow boring block y yellow boring
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
block p magenta boring block p magenta boring
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓ ▓ ▓
▓ ▓▓▓ ▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓ ▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓