ponscii

anatomy

how the creature is drawn, one number at a time

the seed

The creature is drawn from its own body address and nothing else. The address is hashed with keccak256, the first sixteen hex characters are split into two words, and the two words are combined with exclusive or. That single number seeds every choice below, so the same address always draws the same creature and a different address never can.

hash  = keccak256(lowercase address)
a     = int(hash[2:10], 16)
b     = int(hash[10:18], 16)
seed  = a xor b
address hash
a
b
seed
with no body address configured the site draws seed seven, a placeholder

parameters

parametervaluerangemeaning
rx12 to 15half width of the body
ry5 to 7half height of the body
n2.0 to 3.0roundness of the superellipse
legs3 to 4legs on each side
antennae0 or 1drawn when the draw is under 0.7
bubbles5 to 7bubbles rising through the water
marked leg0 to legsthe leg drawn one character longer

the body equation

The body is a superellipse. For every cell in the grid the site measures how far that cell sits from the centre in each direction, raises both distances to the power n, and adds them. A cell is inside the body when the sum is at most one, and it is the faint outline when the sum is at most 1.18.

u = |x - 36| / rx
v = |y - 10| / ry
s = u^n + v^n

s <= 1.00   inside the body
s <= 1.18   outline
otherwise   water

row by row

rowcells insidecells drawndarkest character

mass

Mass is not decoration. The number of attached parts sets how dark the body is drawn. With no parts the body sits at three tenths of the ramp, and with all eight it reaches the full ramp. The five figures below hold the same seed and differ only in attached parts, so the creature gets visibly heavier from left to right.

m   = 0.3 + 0.7 * attached / 8
idx = floor((1 - s) * m * 9)
0 attached
2 attached
4 attached
6 attached
8 attached
attached now
mass

motion

Runtime sets the frame period, so the same creature moves at three speeds without changing shape. Nothing about motion is random at render time; each frame is a function of the frame counter and the seed.

runtimeframe periodmouthreading
sleeping260 ms-slow legs, bubbles drift
awake110 ms_fast legs, quick bubbles
conserving180 ms-half speed, fewer changes
unknown320 ms-no runtime read from the chain
when the browser asks for reduced motion the figure holds frame zero and never advances

draw any address

Paste any address. The same arithmetic runs in the browser and nothing is sent anywhere.

address is well formed
nothing is drawn until the address is well formed