I have got a brick and now I want to add some lightning to it!
Bricks
Here is a brick wall from yesterday
Lets pass a vector from mouse to the brick center and calculate the dot product. Dot product of two vectors V1 (x1, y1) ยท V2 (x2, y2) = x1x2 + y1y2
var brickPoints = [
    new Point(-brick.width/2, -brick.height/2), // top-left
    new Point(brick.width/2, -brick.height/2), // top-right
    new Point(brick.width/2, brick.height/2), // bottom-right
    new Point(-brick.width/2, brick.height/2) // bottom-left
];
var brickSides = brickPoints.map((p, n)=>{
    var p2 = brickPoints[(n+1)%brickPoints.length];
    return new Point(p.x + p2.x, p.y + p2.y).div(2);
});
var drawBrick = function(x, y, w, h, deltaRat){
    rect(x, y, w, h, function(localX, localY){
        var dot = deltaRat.x*(-w/2+localX) + deltaRat.y*(-h/2+localY);
        var isLight = dot > 25; 
        return dot;
    });
}
update = function(){
    for( var y = 0; y < h; y += brick.height ) {
        for( var x = -y / brick.height * brick.width / 3 | 0; x < w; x += brick.width ) {
            var pos = new Point(x+brick.width/2,y+brick.height/2)
            drawBrick( x, y, brick.width, brick.height, pos.sub(mouse) );
        }
    }
    stop();
};
move = function(){}Shade the border
var drawBrick = function(x, y, w, h, deltaRat){
    rect(x, y, w, h, brickColors[3]);
    rect(x+1, y+1, w-1, h-1, function(localX, localY){
        var dot = deltaRat.x*(-w/2+localX) + deltaRat.y*(-h/2+localY);
        var isLight = dot > 25;
        // side      
        if(localX === 0 || localY === 0 || localX === w-2 || localY === h-2)
            return isLight ? brickColors[2] : brickColors[0];
        
        return brickColors[1];
    });
}Shade the inner part of the brick
const bound = n => (n<0?0:n>1?1:n);
var drawBrick = function(x, y, w, h, deltaRat){
    rect(x, y, w, h, brickColors[3]);
    rect(x+1, y+1, w-1, h-1, function(localX, localY){
        var dot = deltaRat.x*(-w/2+localX) + deltaRat.y*(-h/2+localY);
        var isDark= dot > 25;
            // side      
        if(localX === 0 || localY === 0 || localX === w-2 || localY === h-2) 
            return isDark ? brickColors[2] : brickColors[0];
        if(dot < 85)
            return 0x009955
        return isDark ? 
          dither(bound(1/(dot-64)*36), brickColors[1], brickColors[2])
          : 0x009955;
    });
}And the light part
const bound = n => (n<0?0:n>1?1:n);
var drawBrick = function( x, y, w, h, deltaRat ) {
  rect( x, y, w, h, brickColors[ 3 ] );
  rect( x + 1, y + 1, w - 1, h - 1, function( localX, localY ) {
    var dot = deltaRat.x * ( -w / 2 + localX ) + deltaRat.y * ( -h / 2 + localY );
    var isDark = dot > 25;
    // side      
    if( localX === 0 || localY === 0 || localX === w - 2 || localY === h - 2 )
      return isDark ? brickColors[ 2 ] : brickColors[ 0 ];
    if( dot < 65 ) {
      var coeff = 1;
      var dot2 = deltaRat.x *coeff* ( -w / 2 + localX ) + deltaRat.y *coeff* ( -h / 2 + localY );
      return dither( bound(  ((deltaRat.x**2 + deltaRat.y**2)/1500) )**2, brickColors[ 1 ], brickColors[ 0 ] )
    }
    return isDark ?
      dither( bound( 1 / ( dot - 64 ) * 36 ), brickColors[ 1 ], brickColors[ 2 ] )
      : 0x009955;
  } );
};Try it on the bigger wall. I do not like the result too much, would try do something better later.