0x57ca1267…d46csent to0xf28f163e…abec·#23,955,437·view on Etherscan
ipfs://bafkreihftlgwc2miemmkrxulvsel2w7ccwnn53on5p2hikh6c2kvwgqgaulet digits=[];
let groundDigits=[];
let moonDigits=[];
let canvasSize=0;
let moonX=0;
let moonY=0;
let moonRadius=0;
let digitsPerFrame=144;
let walkCycle=0;
let walkSpeed=0.05;
let groundOffset=0;
let groundSpeed=3;
let bodyParts={head:{x:0,y:0,radius:0},torso:{x:0,y:0,width:0,height:0},frontArm:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},backArm:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},frontLeg:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},backLeg:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},hips:{x:0,y:0,width:0}};
function setup(){
canvasSize=min(windowWidth,windowHeight);
createCanvas(canvasSize,canvasSize);
background(0);
textAlign(CENTER,CENTER);
moonX=width*0.12;
moonY=height*0.1;
moonRadius=canvasSize*0.05;
initGround();
initMoon();
}
function initMoon(){
let sc=canvasSize/600;
let tiltAngle=radians(-15);
let innerRadius=moonRadius*0.95;
let offsetDist=moonRadius*0.3;
for(let i=0;i<375;i++){
let angle=random(TWO_PI);
let r=sqrt(random())*moonRadius;
let x=moonX+cos(angle)*r;
let y=moonY+sin(angle)*r;
let innerCircleX=moonX+cos(tiltAngle)*offsetDist;
let innerCircleY=moonY+sin(tiltAngle)*offsetDist;
let distFromInner=dist(x,y,innerCircleX,innerCircleY);
if(distFromInner>innerRadius){
moonDigits.push({x:x,y:y,size:random(3,6)*sc,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
}
function getGroundY(x){
return lerp(height*0.5,height,x/width);
}
function initGround(){
let sc=canvasSize/600;
for(let i=0;i<80;i++){
let x=random(width);
let baseY=getGroundY(x);
let groundDepth=lerp(height*0.5,0,x/width);
let yOffset=random()*random()*groundDepth;
if(baseY+yOffset<=height){
groundDigits.push({x:x,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
}
function updateBodyParts(){
let sc=canvasSize/600;
let ms=sc*0.6;
let centerX=width*0.7;
let baseY=getGroundY(centerX);
let legPhase=sin(walkCycle);
let armPhase=sin(walkCycle+PI);
let bodyBob=abs(sin(walkCycle*2))*6*ms;
let leanAngle=radians(10);
let hipY=baseY-210*ms-bodyBob*0.5;
bodyParts.hips={x:centerX,y:hipY,width:20*ms};
let torsoLength=110*ms;
let headOffset=150*ms;
let shoulderX=centerX-sin(leanAngle)*torsoLength;
let shoulderY=hipY-cos(leanAngle)*torsoLength-bodyBob;
bodyParts.torso={x:centerX-sin(leanAngle)*(torsoLength*0.5),y:hipY-cos(leanAngle)*(torsoLength*0.5)-bodyBob,width:25*ms,height:70*ms,shoulderY:shoulderY};
bodyParts.head={x:centerX-sin(leanAngle)*headOffset,y:hipY-cos(leanAngle)*headOffset-bodyBob,radius:20*ms};
let frontLegSwing=legPhase;
let frontKneeX=centerX-frontLegSwing*60*ms;
let frontKneeY=hipY+100*ms;
if(frontLegSwing>0)frontKneeY=hipY+90*ms;
let frontFootX=frontKneeX-max(0,frontLegSwing)*30*ms;
let frontFootGroundY=getGroundY(frontFootX);
let frontFootY=frontFootGroundY;
if(frontLegSwing>0.3)frontFootY=frontFootGroundY-(frontLegSwing-0.3)*40*ms;
bodyParts.frontLeg={x1:centerX,y1:hipY,x2:frontKneeX,y2:frontKneeY,x3:frontFootX,y3:frontFootY,thickness:7*ms};
let backLegSwing=-legPhase;
let backKneeX=centerX-backLegSwing*60*ms;
let backKneeY=hipY+100*ms;
if(backLegSwing>0)backKneeY=hipY+90*ms;
let backFootX=backKneeX-max(0,backLegSwing)*30*ms;
let backFootGroundY=getGroundY(backFootX);
let backFootY=backFootGroundY;
if(backLegSwing>0.3)backFootY=backFootGroundY-(backLegSwing-0.3)*40*ms;
bodyParts.backLeg={x1:centerX,y1:hipY,x2:backKneeX,y2:backKneeY,x3:backFootX,y3:backFootY,thickness:6*ms};
let upperArmLength=75*ms;
let forearmLength=68*ms;
let leftRotation=map(armPhase,-1,1,HALF_PI*0.9,-HALF_PI*0.9);
let leftUpperAngle=HALF_PI+leftRotation;
let leftForearmAngle=PI+leftRotation;
let leftElbowX=centerX+cos(leftUpperAngle)*upperArmLength;
let leftElbowY=shoulderY+sin(leftUpperAngle)*upperArmLength;
let leftHandX=leftElbowX+cos(leftForearmAngle)*forearmLength;
let leftHandY=leftElbowY+sin(leftForearmAngle)*forearmLength;
let rightRotation=map(-armPhase,-1,1,HALF_PI*0.9,-HALF_PI*0.9);
let rightUpperAngle=HALF_PI+rightRotation;
let rightForearmAngle=PI+rightRotation;
let rightElbowX=centerX+cos(rightUpperAngle)*upperArmLength;
let rightElbowY=shoulderY+sin(rightUpperAngle)*upperArmLength;
let rightHandX=rightElbowX+cos(rightForearmAngle)*forearmLength;
let rightHandY=rightElbowY+sin(rightForearmAngle)*forearmLength;
if(leftElbowX<rightElbowX){
bodyParts.frontArm={x1:centerX,y1:shoulderY,x2:leftElbowX,y2:leftElbowY,x3:leftHandX,y3:leftHandY,thickness:6*ms,fistSize:5*ms};
bodyParts.backArm={x1:centerX,y1:shoulderY,x2:rightElbowX,y2:rightElbowY,x3:rightHandX,y3:rightHandY,thickness:5*ms,fistSize:4*ms};
}else{
bodyParts.frontArm={x1:centerX,y1:shoulderY,x2:rightElbowX,y2:rightElbowY,x3:rightHandX,y3:rightHandY,thickness:6*ms,fistSize:5*ms};
bodyParts.backArm={x1:centerX,y1:shoulderY,x2:leftElbowX,y2:leftElbowY,x3:leftHandX,y3:leftHandY,thickness:5*ms,fistSize:4*ms};
}
}
function isInsideBody(px,py){
let sc=canvasSize/600;
let head=bodyParts.head;
if(dist(px,py,head.x,head.y)<head.radius)return true;
let torso=bodyParts.torso;
let dx=(px-torso.x)/torso.width;
let dy=(py-torso.y)/torso.height;
if(dx*dx+dy*dy<1)return true;
let hips=bodyParts.hips;
if(dist(px,py,hips.x,hips.y)<hips.width*0.8)return true;
if(isNearLimb(px,py,bodyParts.backArm))return true;
if(isNearLimb(px,py,bodyParts.backLeg))return true;
if(isNearLimb(px,py,bodyParts.frontArm))return true;
if(isNearLimb(px,py,bodyParts.frontLeg))return true;
let neckX=bodyParts.head.x;
let neckY=bodyParts.head.y+head.radius*0.8;
if(dist(px,py,neckX,neckY)<10*sc)return true;
return false;
}
function isNearLimb(px,py,limb){
let d1=distToSegment(px,py,limb.x1,limb.y1,limb.x2,limb.y2);
let d2=distToSegment(px,py,limb.x2,limb.y2,limb.x3,limb.y3);
let t=limb.thickness;
let inLimb=d1<t||d2<t*0.8;
if(limb.fistSize){
let dFist=dist(px,py,limb.x3,limb.y3);
if(dFist<limb.fistSize)return true;
}
return inLimb;
}
function distToSegment(px,py,x1,y1,x2,y2){
let dx=x2-x1;
let dy=y2-y1;
let len2=dx*dx+dy*dy;
if(len2===0)return dist(px,py,x1,y1);
let t=max(0,min(1,((px-x1)*dx+(py-y1)*dy)/len2));
return dist(px,py,x1+t*dx,y1+t*dy);
}
function draw(){
background(0);
let sc=canvasSize/600;
walkCycle+=walkSpeed;
groundOffset+=groundSpeed;
updateBodyParts();
let slopeRatio=(height*0.5)/width;
let keepGround=[];
for(let i=0;i<groundDigits.length;i++){
let d=groundDigits[i];
d.x+=groundSpeed;
d.y+=groundSpeed*slopeRatio;
if(random()>=0.02&&d.x<=width+20&&d.y<=height+20)keepGround.push(d);
}
groundDigits=keepGround;
let maxGround=800;
if(groundDigits.length>maxGround)groundDigits=groundDigits.slice(-maxGround);
let groundDepthAtLeft=height*0.5;
if(groundDigits.length<maxGround){
for(let g=0;g<4;g++){
if(random()<0.8){
let baseY=getGroundY(0);
let yOffset=random()*random()*groundDepthAtLeft;
groundDigits.push({x:0,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
for(let g=0;g<4;g++){
if(random()<0.3){
let x=random(width);
let baseY=getGroundY(x);
let groundDepth=lerp(height*0.5,0,x/width);
if(groundDepth>10){
let yOffset=random()*random()*groundDepth;
groundDigits.push({x:x,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
}
}
moonDigits=moonDigits.filter(()=>random()>=0.02);
let tiltAngle=radians(-15);
let innerRadius=moonRadius*0.95;
let offsetDist=moonRadius*0.3;
while(moonDigits.length<32){
let angle=random(TWO_PI);
let r=sqrt(random())*moonRadius;
let x=moonX+cos(angle)*r;
let y=moonY+sin(angle)*r;
let innerCircleX=moonX+cos(tiltAngle)*offsetDist;
let innerCircleY=moonY+sin(tiltAngle)*offsetDist;
let distFromInner=dist(x,y,innerCircleX,innerCircleY);
if(distFromInner>innerRadius){
moonDigits.push({x:x,y:y,size:random(3,6)*sc,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
digits=digits.filter(()=>random()>=0.05);
let ms=sc*0.6;
let manCenterX=width*0.7;
let manCenterY=getGroundY(manCenterX)-180*ms;
for(let i=0;i<digitsPerFrame;i++){
let px=manCenterX+random(-120*ms,120*ms);
let py=manCenterY+random(-220*ms,220*ms);
if(isInsideBody(px,py)){
digits.push({x:px,y:py,size:random(2,6)*ms,digit:floor(random(10)),rotation:random(TWO_PI)});
}
}
if(digits.length>4000)digits=digits.slice(-4000);
noStroke();
fill(255);
for(let d of moonDigits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();}
for(let d of groundDigits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();}
for(let d of digits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();}
}
function windowResized(){
canvasSize=min(windowWidth,windowHeight);
resizeCanvas(canvasSize,canvasSize);
moonX=width*0.12;
moonY=height*0.1;
moonRadius=canvasSize*0.05;
digits=[];
groundDigits=[];
moonDigits=[];
initGround();
initMoon();
background(0);
}