KNS Studio

Инструментарий творца

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         KNS Studio
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Инструментарий творца
// @match        http*://*.catwar.su/cw3/kns
// @match        http*://*.catwar.net/cw3/kns
// @license      MIT
// @iconURL      https://raw.githubusercontent.com/iramorktum/pictures/refs/heads/main/103456.png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const furColors = [
        "#f5e5ce", "#ffffff", "#e6e6e6", "#d1d1d1", "#9e9e9e", "#5c5c5c",
        "#242424", "#141414", "#1d212c", "#2b1d1c", "#3d1c0b", "#6b3c28",
        "#9a715f", "#bd6d32", "#cb4402", "#e15c0f", "#ed9b2d", "#e5bd7f",
        "#d7ae98", "#b19798", "#a6b4b7", "#697a8a", "#465165", "#323d51"
    ];
    const skinColors = [
        "#f5e5ce", "#ffffff", "#9e9e9e", "#242424", "#3d1c0b", "#6b3c28",
        "#9a715f", "#bd6d32", "#e15c0f", "#cc8370", "#b19798", "#465165"
    ];
    const whiskersColors = ["#ffffff", "#5c5c5c", "#242424"];
    const eyeColors = [
        "#9C7941", "#362121", "#612322", "#D6700B", "#FCB10D", "#FCDF00",
        "#B3B059", "#A8AB0C", "#2FA12D", "#7DC210", "#0ECC90", "#87C3D4",
        "#148CCC", "#192580", "#7D8996", "#734563", "#B90000"
    ];
    let selectedColorCell = null;
    let mainPaletteContainer = null;
    let originalCode = "";
    let colorReplacements = {
        mainColors: {},
        skinColors: {},
        whiskersColor: {},
        eyeColors: {}
    };
    let updateButton = null;
    function createStyle() {
        let style = document.createElement("style");
        style.innerHTML = `.row-color-mode{margin:10px 0;page-break-after:always;display:flex;flex-wrap:wrap;}
        .row-color-mode div{height:30px;width:30px;border-radius:40%;box-sizing:border-box;}
        .all-palettes-container{margin-bottom:30px; margin-top:25px;}
        .palette-container{margin-bottom:10px}
        .main-palette-container{padding-top:20px;}
        #mode .btn-kns{margin:20px 0 0 0;}
        .update-code-btn{margin:30px 0 30px 0 !important;}
        #mode{margin-bottom:30px;}`;
        document.head.appendChild(style);
    }
    function createContainer() {
        let container = document.createElement("div");
        container.id = "mode";
        let header = document.querySelector("h2");
        if (header) {
            header.after(container);
        }
        return container;
    }
    function createButton(container) {
        let button = document.createElement("button");
        button.innerHTML = "Обработать код окраса";
        button.className = "btn-kns";
        button.onclick = () => parseCode();
        container.appendChild(button);
        return button;
    }
    function getColorArray(type) {
        switch(type) {
            case "mainColors": return furColors;
            case "skinColors": return skinColors;
            case "whiskersColor": return whiskersColors;
            case "eyeColors": return eyeColors;
            default: return [];
        }
    }
    function getTypeName(type) {
        switch(type) {
            case "mainColors": return "Основные цвета";
            case "skinColors": return "Уши внутри и нос";
            case "whiskersColor": return "Усы";
            case "eyeColors": return "Цвет глаз";
            default: return type;
        }
    }
    function createMainPalette() {
        if (mainPaletteContainer && mainPaletteContainer.parentNode) {
            mainPaletteContainer.remove();
        }
        mainPaletteContainer = document.createElement("div");
        mainPaletteContainer.className = "main-palette-container";
        let header = document.createElement("h3");
        header.innerHTML = "Выберите цвет из палитры";
        mainPaletteContainer.appendChild(header);
        let paletteRow = document.createElement("div");
        paletteRow.className = "row-color-mode";
        mainPaletteContainer.appendChild(paletteRow);
        return mainPaletteContainer;
    }
    function populateMainPalette(colorsArray) {
        let paletteRow = mainPaletteContainer.querySelector(".row-color-mode");
        paletteRow.innerHTML = "";
        colorsArray.forEach((color, index) => {
            let colorCell = document.createElement("div");
            colorCell.classList.add("colour");
            colorCell.style.backgroundColor = color;
            colorCell.dataset.colorIndex = index;
            colorCell.onclick = () => {
                if (selectedColorCell) {
                    let type = selectedColorCell.classList.contains("mainColors") ? "mainColors" :
                    selectedColorCell.classList.contains("skinColors") ? "skinColors" :
                    selectedColorCell.classList.contains("whiskersColor") ? "whiskersColor" : "eyeColors";
                    let colorsArray = getColorArray(type);
                    let newColorIndex = index;
                    let originalIndex = selectedColorCell.dataset.originalIndex || selectedColorCell.dataset.colorIndex;
                    selectedColorCell.dataset.originalIndex = originalIndex;
                    colorReplacements[type][originalIndex] = newColorIndex;
                    selectedColorCell.style.backgroundColor = colorsArray[newColorIndex];
                    selectedColorCell.dataset.colorIndex = newColorIndex;
                    if (updateButton) {
                        updateButton.style.display = "block";
                    }
                    selectedColorCell.classList.remove("selected_colour");
                    selectedColorCell = null;
                    mainPaletteContainer.style.display = "none";
                }
            };
            paletteRow.appendChild(colorCell);
        });
    }
    function createColorChangePalette(colorCell) {
        let originalIndex = colorCell.dataset.originalIndex || colorCell.dataset.colorIndex;
        colorCell.dataset.originalIndex = originalIndex;
        selectedColorCell = colorCell;
        let type = colorCell.classList.contains("mainColors") ? "mainColors" :
        colorCell.classList.contains("skinColors") ? "skinColors" :
        colorCell.classList.contains("whiskersColor") ? "whiskersColor" : "eyeColors";
        let colorsArray = getColorArray(type);
        if (!mainPaletteContainer) {
            let allPalettesContainer = document.querySelector(".all-palettes-container");
            if (allPalettesContainer) {
                let mainPalette = createMainPalette();
                allPalettesContainer.appendChild(mainPalette);
            }
        } else {
            mainPaletteContainer.style.display = "block";
        }
        populateMainPalette(colorsArray);
    }
    function createPaletteColors(type, values, container) {
        let palette = document.createElement("div");
        palette.className = "row-color-mode";
        container.appendChild(palette);
        let colorsArray = getColorArray(type);
        values.forEach(value => {
            let colorCell = document.createElement("div");
            colorCell.classList.add("colour", type);
            colorCell.style.backgroundColor = colorsArray[value];
            colorCell.dataset.colorIndex = value;
            colorCell.dataset.originalIndex = value;
            colorCell.onclick = () => {
                document.querySelectorAll(".selected_colour").forEach(el => {
                    el.classList.remove("selected_colour");
                });
                colorCell.classList.add("selected_colour");
                createColorChangePalette(colorCell);
            };
            palette.appendChild(colorCell);
        });
    }
    function createColorPalette(colors) {
        let existingContainer = document.querySelector(".all-palettes-container");
        if (existingContainer) {
            existingContainer.remove();
        }
        if (mainPaletteContainer) {
            mainPaletteContainer.remove();
            mainPaletteContainer = null;
        }
        let allPalettesContainer = document.createElement("div");
        allPalettesContainer.className = "all-palettes-container";
        if (button) {
            button.after(allPalettesContainer);
        }
        Object.keys(colors).forEach(type => {
            if (colors[type].length > 0) {
                let paletteContainer = document.createElement("div");
                paletteContainer.className = "palette-container";
                allPalettesContainer.appendChild(paletteContainer);
                let header = document.createElement("h3");
                header.innerHTML = getTypeName(type);
                paletteContainer.appendChild(header);
                createPaletteColors(type, colors[type], paletteContainer);
            }
        });
        if (!updateButton) {
            updateButton = document.createElement("button");
            updateButton.innerHTML = "Сгенерировать обновленный код";
            updateButton.className = "btn-kns update-code-btn";
            updateButton.style.display = "none";
            updateButton.onclick = generateUpdatedCode;
            let parent = document.querySelector(".all-palettes-container");
            parent.after(updateButton);
        } else {
            updateButton.style.display = "none";
            parent.after(updateButton);
        }
    }
    function parseCode() {
        let input = document.querySelector("#code");
        if (!input) return;
        originalCode = input.value.trim();
        colorReplacements = {mainColors:{}, skinColors:{}, whiskersColor:{}, eyeColors:{}};
        if (updateButton) {
            updateButton.style.display = "none";
        }
        let parts = input.value.split(' ');
        let secondLastIndex = parts.length - 2;
        let lastIndex = parts.length - 1;
        let mainColors = new Set();
        let skinColorsSet = new Set();
        let whiskersColorSet = new Set();
        let eyeColorsSet = new Set();
        parts.forEach((part, groupIndex) => {
            let isEyeGroup = (groupIndex === 1 || groupIndex === 19);
            let isSecondLastGroup = (groupIndex === secondLastIndex);
            let isLastGroup = (groupIndex === lastIndex);
            let is8th9thGroup = (groupIndex === 7 || groupIndex === 8);
            let is22ndElement = (groupIndex === 21);
            let elements = part.includes('-') ? part.split('-') : [part];
            elements.forEach((element, elementIndex) => {
                if (isEyeGroup) {
                    let eyeMatch = element.match(/^(\d+)(?:\|(\d+))?$/);
                    if (eyeMatch) {
                        let eyeColorIndex = parseInt(eyeMatch[1], 10) - 1;
                        if (!isNaN(eyeColorIndex) && eyeColorIndex >= 0 && eyeColorIndex < eyeColors.length) {
                            eyeColorsSet.add(eyeColorIndex);
                        }
                    }
                } else {
                    let match = element.match(/(\d+)\/(\d+)(?:\|(\d+))?/);
                    if (match) {
                        let beforeSlash = parseInt(match[1], 10);
                        let afterSlash = parseInt(match[2], 10) - 1;
                        if (isSecondLastGroup) {
                            whiskersColorSet.add(afterSlash);
                        } else if (isLastGroup) {
                            skinColorsSet.add(afterSlash);
                        } else if (is8th9thGroup && beforeSlash === 4) {
                            skinColorsSet.add(afterSlash);
                        } else if (is22ndElement) {
                            whiskersColorSet.add(afterSlash);
                        } else {
                            mainColors.add(afterSlash);
                        }
                    }
                }
            });
        });
        let colors = {
            mainColors: Array.from(mainColors).sort((a, b) => a - b),
            skinColors: Array.from(skinColorsSet).sort((a, b) => a - b),
            whiskersColor: Array.from(whiskersColorSet).sort((a, b) => a - b),
            eyeColors: Array.from(eyeColorsSet).sort((a, b) => a - b)
        };
        createColorPalette(colors);
    }
    function generateUpdatedCode() {
        if (!originalCode) return;
        let parts = originalCode.split(' ');
        let updatedParts = [];
        parts.forEach((part, groupIndex) => {
            let isEyeGroup = (groupIndex === 1 || groupIndex === 19);
            let isSecondLastGroup = (groupIndex === parts.length - 2);
            let isLastGroup = (groupIndex === parts.length - 1);
            let is8th9thGroup = (groupIndex === 7 || groupIndex === 8);
            let is22ndElement = (groupIndex === 21);
            if (isEyeGroup) {
                let elements = part.includes('-') ? part.split('-') : [part];
                let updatedElements = elements.map((element, elementIndex) => {
                    let eyeMatch = element.match(/^(\d+)(?:\|(\d+))?$/);
                    if (eyeMatch) {
                        let eyeColorIndex = parseInt(eyeMatch[1], 10) - 1;
                        let transparency = eyeMatch[2] || '';
                        if (!isNaN(eyeColorIndex) && eyeColorIndex >= 0) {
                            let originalIndex = eyeColorIndex;
                            if (colorReplacements.eyeColors[originalIndex] !== undefined) {
                                eyeColorIndex = colorReplacements.eyeColors[originalIndex];
                            }
                            let result = (eyeColorIndex + 1).toString();
                            if (transparency) {
                                result += '|' + transparency;
                            }
                            return result;
                        }
                    }
                    return element;
                });
                updatedParts.push(updatedElements.join('-'));
            } else if (part.includes('-')) {
                let elements = part.split('-');
                let updatedElements = elements.map(element => {
                    let match = element.match(/^(\d+)\/(\d+)(?:\|(\d+))?$/);
                    if (match) {
                        let beforeSlash = match[1];
                        let afterSlash = parseInt(match[2], 10) - 1;
                        let transparency = match[3] || '';
                        let colorType = 'mainColors';
                        if (isSecondLastGroup) {
                            colorType = 'whiskersColor';
                        } else if (isLastGroup) {
                            colorType = 'skinColors';
                        } else if (is22ndElement) {
                            colorType = 'whiskersColor';
                        } else if (is8th9thGroup) {
                            if (beforeSlash === '4') {
                                colorType = 'skinColors';
                            }
                        }
                        if (colorReplacements[colorType] && colorReplacements[colorType][afterSlash] !== undefined) {
                            afterSlash = colorReplacements[colorType][afterSlash];
                        }
                        let result = `${beforeSlash}/${afterSlash + 1}`;
                        if (transparency) {
                            result += '|' + transparency;
                        }
                        return result;
                    }
                    return element;
                });
                updatedParts.push(updatedElements.join('-'));
            } else {
                let match = part.match(/^(\d+)\/(\d+)(?:\|(\d+))?$/);
                if (match) {
                    let beforeSlash = match[1];
                    let afterSlash = parseInt(match[2], 10) - 1;
                    let transparency = match[3] || '';
                    let colorType = 'mainColors';
                    if (isSecondLastGroup) {
                        colorType = 'whiskersColor';
                    } else if (isLastGroup) {
                        colorType = 'skinColors';
                    } else if (is22ndElement) {
                        colorType = 'whiskersColor';
                    } else if (is8th9thGroup) {
                        if (beforeSlash === '4') {
                            colorType = 'skinColors';
                        }
                    }
                    if (colorReplacements[colorType] && colorReplacements[colorType][afterSlash] !== undefined) {
                        afterSlash = colorReplacements[colorType][afterSlash];
                    }
                    let result = `${beforeSlash}/${afterSlash + 1}`;
                    if (transparency) {
                        result += '|' + transparency;
                    }
                    updatedParts.push(result);
                } else {
                    updatedParts.push(part);
                }
            }
        });
        let updatedCode = updatedParts.join(' ');
        let resultDiv = document.querySelector(".code-result");
        if (resultDiv) {
            resultDiv.remove();
        }
        let newResultDiv = document.createElement("div");
        newResultDiv.className = "code-result";
        newResultDiv.innerHTML = `<h3>Обновленный код:</h3><textarea id="mode-code" style="width:100%;height:100px;margin-bottom:10px;font-family:monospace;background-color:#111111;color:white;border-radius:0.25rem;border:1px solid black;">${updatedCode}</textarea><button style="margin-bottom:30px;" class = "btn-kns" onclick="this.parentElement.querySelector('#mode-code').select();document.execCommand('copy');alert('Код скопирован!')">Копировать код</button>`;
        let allPalettesContainer = document.querySelector(".all-palettes-container");
        if (allPalettesContainer) {
            container.appendChild(newResultDiv);
        }
    }
    createStyle();
    const container = createContainer();
    const button = createButton(container);
})();