const jimp = require("jimp"); const fs = require("fs"); let config = JSON.parse(fs.readFileSync("./config.jsonc")); const photoInterval = config.photoInterval; const targetColor = config.targetColor; const tolerance = config.tolerance; setInterval(eatDrywall, photoInterval*1000); async function eatDrywall() { let monitors = ss.Monitor.all(); monitors.forEach((i) => { var im = i; if (im.isPrimary){ let image = im.captureImageSync(); let img = image.toRawSync(); clickRandomPixelOfColor(im.width, im.height, img); } }); } function clickRandomPixelOfColor(width, height, image) { var hits = []; for (let i = 0; i < width*height; i++) { if (compareColors(targetColor,getPixel(i, image))) { hits.push(i); } } let click = Math.floor(Math.random() * hits.length); //get index of random viable pixel let target = deRasterize(hits[click], width);//get coordinates of random pixel console.log("Clicking: " + target); proc.execSync("python click.py " + target.x + " " + target.y); } function rasterize(x, y, width){ //scale to image return (x + y * width); } function deRasterize(i, width){ return ({ y: Math.floor(i/width), x: i % width }); } function compareColors(c1,c2){ //compare two rgba color structs //general basic distance nothing too special let sum1 = c1.r + c1.g + c1.b + c1.a; let sum2 = c2.r + c2.g + c2.b + c2.a; if (Math.abs(sum1-sum2) < (tolerance*4)) { return true; } else return false; } //gets color of a pixel at given coordinate function getPixel(pos,img) { //pixel origin let o = pos * 4; let p = { r: img[o], g: img[o+1], b: img[o+2], a: img[o+3] }; return p; }