> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.OW$p5jpsiWt/rev.6181
 * 
 * authors: 
 *   Justin Hall
 *   justin
 *   

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



// Pressing Control-R will render this sketch.

board player;
cursor p;
int s, ls, fCount;
game lv1;

    color c0, c1, c2, c3, c4, c5;
    color c0l, c1l, c2l, c3l, c4l, c5l;
    
    
void setup()
{
    background(255);
    size(300, 300); 
    smooth();
    frameRate(30);
    strokeWeight(1);
    game lv1 = new game();
    player = new board(120, 240, 0, 0);
    p = new cursor(player, 3, 8);
    s = second();
    ls=-1;
    
    c0 = color(255, 255, 255);
    c0l = color(255, 255, 255);
    c1 = color(255, 23, 249);
    c1l = color(84, 0, 174);
    c2 = color(5, 255, 0);
    c2l = color(0, 122, 0);
    c3 = color(232, 8, 0);
    c3l = color(153, 0, 0);
    c4 = color(240, 239, 24);
    c4l = color(98, 84, 0);
    c5 = color(29, 230, 237);
    c5l = color(2, 117, 138);
    player.display();
} 

void draw()
{
    background();
    s=second();
    stroke(color(0));
    fill(color(0));
    if(s%2==0 && s!=ls)
    {    
        ls=s;
        player.bRow(
        (int)random(1,6),(int)random(1,6),(int)random(1,6),
        (int)random(1,6),(int)random(1,6),(int)random(1,6));
    }
    image(player.visual,0,0);
    p.display();
    
    stroke(color(0));
    fill(color(255));

}

class game
{
    game(){}
    
}

class board
{
    PGraphics visual;
    int[][]  field = new int[6][12];
    int w, h;
    int xLoc, yLoc;
    var explodes = [];
    
    
    board(int iw, int ih, int ixl, int iyl)
    {
        w=iw;
        h=ih;
        xLoc=ixl;
        yLoc=iyl;
        for(int i=0;i<6;i++)
            for(int j=0;j<12;j++)
            {
                field[i][j]=0;
            }
        visual=createGraphics(w+1, h+1, JAVA2D);
    }
    
    void bRow(int i1, int i2, int i3, int i4, int i5, int i6)
    {
        if(upShift()==false)
            lose();
        
        field[0][11]=i1;
        field[1][11]=i2;
        field[2][11]=i3;
        field[3][11]=i4;
        field[4][11]=i5;
        field[5][11]=i6;
        check();
    }
    
    void display()
    {
        stroke(0);
        for(int i=0;i<6;i++)
            for(int j=0;j<12;j++)
            {
                blockShow(xLoc+(w/6)*i, yLoc+(h/12)*j, w/6, h/12, field[i][j]);
            }
     
    }

    
    void blockShow(int x, int y, int iw, int ih, int c)
    {
       visual.beginDraw();
        if(c==0)
        {
            visual.fill(c0);
            visual.stroke(c0l);
        }
        else if(c==1)
        {
            visual.fill(c1);
            visual.stroke(c1l);
        }
        else if(c==2)
        {
            visual.fill(c2);
            visual.stroke(c2l);
        }
        else if(c==3)
        {
            visual.fill(c3);
            visual.stroke(c3l);
        }
        else if(c==4)
        {
            visual.fill(c4);
            visual.stroke(c4l);
        }
        else if(c==5)
        {
            visual.fill(c5);
            visual.stroke(c5l);
        }
        visual.strokeJoin(ROUND);
        visual.smooth();
        visual.rect(x, y, iw, ih);
        visual.rect(x+3,y+3,iw-6,ih-6);
        visual.endDraw();
    }
    
    boolean upShift()
    {
        if(
            field[0][0]!=0 ||
            field[1][0]!=0 ||
            field[2][0]!=0 ||
            field[3][0]!=0 ||
            field[4][0]!=0 ||
            field[5][0]!=0 )
            return false;
            
        for(int i=0;i<11;i++)
            for(int j=0;j<6;j++)
            {
                field[j][i]=field[j][i+1];
            }
        fall();
        return true;
    }
    
    void swap(int ix, int iy)
    {
        int t=field[ix][iy];
        field[ix][iy]=field[ix+1][iy];
        field[ix+1][iy]=t;
        fall();
    }
    
    void lose()
    {
    }

    void check()
    {
        
        for(int i=0;i<4;i++)
            for(int j=0;j<12;j++)
            {
                if(
                    field[i][j]==field[i+1][j] && field[i][j]!=0 &&
                    field[i][j]==field[i+2][j]
                    )
                    {
                        k=i;
                        while(field[i][j]==field[k][j] && k<5)
                        {
                               
                                explodes.push(new PVector(k,j));
                                //console.log(k,j," yeppp", explodes.length());
                                k++;
                                
                        }
                        
                    }
            }
            
        for(int i=0;i<6;i++)
            for(int j=0;j<10;j++)
                if(
                    field[i][j]==field[i][j+1] && field[i][j]!=0 &&
                    field[i][j]==field[i][j+2]
                    )
                    {
                        k=j;
                        while(field[i][j]==field[i][k] && k<12)
                        {
                                 //console.log(i,k," yep");
                                explodes.push(new PVector(i,k));
                                k++;
                               
                        }
                       
                    }
            if(explodes.length()>0)
                boom();

            
    }
    
    void boom()
    {
        //console.log("running boom");
        while(explodes.length()>0)
        {
            //console.log(explodes[explodes.length()-1].x,explodes[explodes.length()-1].y);
            field[explodes[explodes.length()-1].x][explodes[explodes.length()-1].y]=0;
            burstAnim(explodes.pop());
            
        }
        fall();
        
    }
    
    void fall()
    {
        //console.log("running fall");
        boolean fell=false;
        for(int i=0;i<11;i++)
            for(int j=0;j<6;j++)
            { //console.log("if ", j,i , "="  and ", j,i+1, " doesn't");
                if(field[j][i+1]==0 && field[j][i]!=0)
                {//console.log("MOVING DOWN");
                    field[j][i+1]=field[j][i];
                    field[j][i]=0;
                    fell=true;
                    blockFall(j, i);
                }
            }
        if(fell==true)
            check();
        display();
    }
    
    void blockFall(int x, int y)
    {
        int f = frameCount;
        int x = second();
        while(second()<x+1)
            rect(x*w/6+xLoc, y*h/12+yLoc+frameCount-f, w/6, h/12);
    }
    
    void burstAnim(PVector v)
    {
        /*
        fCount = frameCount;
        while(frameCount<fCount+5)
            console.log(frameCount);
        */
    }
}

class cursor
{
    board b;
    int x, y;
    color cStroke = color(0, 0, 0);
    color cFill = color(0, 0, 0);
    
    cursor(board ib, int ix, int iy){b=ib;x=ix;y=iy;}
    
    void display()
    {
        cursorImage();
    }
    
    void mLeft()
    {
        x--;
    }
    
    void mRight()
    {
        x++;
    }
    
    void mUp()
    {
        y--;
    }
    
    void mDown()
    {
        y++;
    }
    
    void cursorImage()
    {
        int blockSize=b.w/6;
        stroke(cStroke);
        fill(cFill);
        
        rect(b.xLoc+x*blockSize-1,   
        b.yLoc+y*blockSize-1,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+x*blockSize-1,
        b.yLoc+y*blockSize+blockSize*2/3,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+x*blockSize+blockSize-3,
        b.yLoc+y*blockSize+blockSize*2/3,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+x*blockSize+blockSize-3,
        b.yLoc+y*blockSize-1,
        4,
        (blockSize+2)/3+1);     
        
        rect(b.xLoc+x*blockSize-1,
        b.yLoc+y*blockSize-1,
        (blockSize+2)/3+1,
        4);
        
        rect(b.xLoc+x*blockSize-1,
        b.yLoc+y*blockSize+blockSize-3,
        (blockSize+2)/3+1,
        4);
        
        rect(b.xLoc+x*blockSize+blockSize*2/3,
        b.yLoc+y*blockSize+blockSize-3,
        (blockSize+2)/3+1,
        4);
        
        rect(b.xLoc+x*blockSize+blockSize*2/3,
        b.yLoc+y*blockSize-1,
        (blockSize+2)/3+1,
        4);
        rect(b.xLoc+(x+1)*blockSize-1,   
        b.yLoc+y*blockSize-1,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+(x+1)*blockSize-1,
        b.yLoc+y*blockSize+blockSize*2/3,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+(x+1)*blockSize+blockSize-3,
        b.yLoc+y*blockSize+blockSize*2/3,
        4,
        (blockSize+2)/3+1);
        
        rect(b.xLoc+(x+1)*blockSize+blockSize-3,
        b.yLoc+y*blockSize-1,
        4,
        (blockSize+2)/3+1);
        
        
        
        rect(b.xLoc+(x+1)*blockSize-1,
        b.yLoc+y*blockSize-1,
        (blockSize+2)/3+1,
        4);
        
        rect(b.xLoc+(x+1)*blockSize-1,
        b.yLoc+y*blockSize+blockSize-3,
        (blockSize+2)/3+1,
        4);
        rect(b.xLoc+(x+1)*blockSize+blockSize*2/3,
        b.yLoc+y*blockSize+blockSize-3,
        (blockSize+2)/3+1,
        4);
            
        rect(b.xLoc+(x+1)*blockSize+blockSize*2/3,
        b.yLoc+y*blockSize-1,
        (blockSize+2)/3+1,
        4);
        
    }
}

void keyPressed() {

    if(key == 'a' || key == 'A')
    {
      p.mLeft();
    }
    else if(key == 'd' || key == 'D')
    {
      p.mRight();
    } 
    else if(key == 'w' || key == 'W')
    {
      p.mUp();
    }
    else if((key == 's' || key == 'S') && p.y+1<12)
    {
      p.mDown();
    }
    else if(key == ' ' && (player.field[p.x][p.y]!=0 || player.field[p.x+1][p.y]!=0))
    {
        player.swap(p.x, p.y)
    }

}