// ==UserScript==
// @name PPT
// @description Pixel Place Tools
// @version 1.6
// @author 0vC4
// @namespace https://gf.qytechs.cn/users/670183
// @match https://pixelplace.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=pixelplace.io
// @license MIT
// @grant none
// @run-at document-start
// ==/UserScript==
const PPT = (() => {
if (window.PPT) return window.PPT;
const PPT = {
zero: 0xCCCCCC,
default: new Uint32Array([
0xFFFFFF,
0xC4C4C4,
0x888888,
0x555555,
0x222222,
0x000000,
0x006600,
0x22B14C,
0x02BE01,
0x51E119,
0x94E044,
0xFBFF5B,
0xE5D900,
0xE6BE0C,
0xE59500,
0xA06A42,
0x99530D,
0x633C1F,
0x6B0000,
0x9F0000,
0xE50000,
0xFF3904,
0xBB4F00,
0xFF755F,
0xFFC49F,
0xFFDFCC,
0xFFA7D1,
0xCF6EE4,
0xEC08EC,
0x820080,
0x5100FF,
0x020763,
0x0000EA,
0x044BFF,
0x6583CF,
0x36BAFF,
0x0083C7,
0x00D3DD,
0x45FFC8
]),
exclude: new Uint32Array([
0x51E119,
0xFF3904,
0x5100FF,
0x45FFC8
]),
get palette() {
return this.default.map(color => this.exclude.includes(color) ? this.zero : color);
},
_wheelID: 0,
get wheel() {
let pixel = this._wheelID+1;
while (this.palette[pixel] == this.zero)
if (this.palette[++pixel] == null)
pixel = 0;
this._wheelID = pixel;
return this._wheelID;
},
RGB2P(r, g, b) {
const closest = [...this.palette]
.filter(n => n != this.zero)
.map(clr =>
[
((r - ((clr>>16)&0xFF))*.299)**2 +
((g - ((clr>>8)&0xFF))*.587)**2 +
((b - (clr&0xFF))*.114)**2,
clr
]
)
.sort((a,b) => a[0]-b[0])
[0][1];
return this.palette.indexOf(closest);
},
CLR2P(color) {
return this.RGB2P((color>>16)&0xFF, (color>>8)&0xFF, color&0xFF);
},
timer: window,
map: {get(x,y){return 254;}},
pixel: 0,
size: 1,
speed: 100,
square(x,y,callback) {
const {pixel, timer, speed} = this;
const half = (this.size>>1);
let xi = -half;
let yi = -half;
let t = timer.setInterval(() => {
let i = 0;
for (; yi < half+1;) {
for (; xi < half+1;) {
callback(x+xi, y+yi, pixel);
xi++;
i++;
if (i > speed) return;
continue;
}
yi++;
xi = -half;
}
timer.clearInterval(t);
});
return t;
},
image(pixels, x,y,w,h, callback) {
const {timer, map, speed} = this;
let xi = 0;
let yi = 0;
let t = timer.setInterval(() => {
let i = 0;
for (; yi < h;) {
for (; xi < w;) {
const pixel = pixels[xi+yi*w];
const pixel2 = map.get(x+xi, y+yi);
if (pixel === 255 || pixel === pixel2) {
xi++;
continue;
}
callback(x+xi, y+yi, pixel);
xi++;
i++;
if (i > speed) return;
continue;
}
yi++;
xi = 0;
}
timer.clearInterval(t);
});
return t;
}
};
window.PPT = PPT;
return PPT;
})();
// 0vC4#7152