PPT

Pixel Place Tools

目前为 2022-04-24 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/443807/1043526/PPT.js

// ==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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址