[银河奶牛]强化工具(血压工具)

在线统计强化成功/失败次数

当前为 2024-09-06 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         [MWI]Enhancement Tool
// @name:zh-CN   [银河奶牛]强化工具(血压工具)
// @name:zh-TW   [銀河奶牛]強化工具
// @namespace    http://tampermonkey.net/
// @version      1.05
// @description  Track the number of enhancement successes and failures
// @description:zh-CN 在线统计强化成功/失败次数
// @description:zh-TW 統計強化成功/失敗次數
// @author       Truth_Light
// @license      Truth_Light
// @match        https://www.milkywayidle.com/*
// @match        https://test.milkywayidle.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=milkywayidle.com
// @grant        GM.xmlHttpRequest
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';
    let enhancementLevel;
    let currentEnhancingIndex = 1;
    let enhancementData = {
        [currentEnhancingIndex]: { "强化数据": {}, "其他数据": {} }
    };
    const userLanguage = navigator.language || navigator.userLanguage;
    const isZH = userLanguage.startsWith("zh");

    function hookWS() {
        const dataProperty = Object.getOwnPropertyDescriptor(MessageEvent.prototype, "data");
        const oriGet = dataProperty.get;

        dataProperty.get = hookedGet;
        Object.defineProperty(MessageEvent.prototype, "data", dataProperty);

        function hookedGet() {
            const socket = this.currentTarget;
            if (!(socket instanceof WebSocket)) {
                return oriGet.call(this);
            }
            if (socket.url.indexOf("api.milkywayidle.com/ws") <= -1 && socket.url.indexOf("api-test.milkywayidle.com/ws") <= -1) {
                return oriGet.call(this);
            }

            const message = oriGet.call(this);
            Object.defineProperty(this, "data", { value: message });

            return handleMessage(message);
        }
    }

    function handleMessage(message) {
        try {
            let obj = JSON.parse(message);
            if (obj && obj.type === "action_completed" && obj.endCharacterAction && obj.endCharacterAction.actionHrid === "/actions/enhancing/enhance") {
                const now_enhancementLevel = parseInt(obj.endCharacterAction.upgradeItemHash.match(/::(\d+)$/)[1]);
                const currentCount = obj.endCharacterAction.currentCount;

                if (enhancementLevel !== undefined) {
                    // 开始新的物品的强化
                    if (currentCount < enhancementData[currentEnhancingIndex]["强化次数"]) {
                        currentEnhancingIndex++;
                        enhancementData[currentEnhancingIndex] = { "强化数据": {}, "其他数据": {} };
                        enhancementLevel = undefined;
                        return message
                    }

                    const currentItem = enhancementData[currentEnhancingIndex]["强化数据"];


                    if (!currentItem[enhancementLevel]) {
                        currentItem[enhancementLevel] = { "成功次数": 0, "失败次数": 0, "成功率": 0 };
                    }

                    if (enhancementLevel < now_enhancementLevel) {
                        currentItem[enhancementLevel]["成功次数"]++;
                    } else {
                        currentItem[enhancementLevel]["失败次数"]++;
                    }

                    const success = currentItem[enhancementLevel]["成功次数"];
                    const failure = currentItem[enhancementLevel]["失败次数"];
                    currentItem[enhancementLevel]["成功率"] = success / (success + failure);

                    // 计算强化状态
                    const highestSuccessLevel = Math.max(...Object.keys(currentItem).filter(level => currentItem[level]["成功次数"] > 0));
                    const enhancementState = (highestSuccessLevel + 1 >= enhancementData[currentEnhancingIndex]["其他数据"]["目标强化等级"]) ? "强化成功" : "强化失败";
                    enhancementData[currentEnhancingIndex]["强化状态"] = enhancementState;
                    enhancementLevel = now_enhancementLevel;
                } else {
                    // 初始化数据
                    enhancementLevel = now_enhancementLevel;
                    const itemName = formatItemName(obj.endCharacterAction.upgradeItemHash);
                    enhancementData[currentEnhancingIndex]["其他数据"] = {
                        "物品名称": itemName,
                        "目标强化等级": obj.endCharacterAction.enhancingMaxLevel
                    };
                }

                enhancementData[currentEnhancingIndex]["强化次数"] = currentCount;
                updateDisplay();
            } else {
                return message;
            }
        } catch (error) {
            console.error("Error processing message:", error);
        }
        return message;
    }

    function updateDisplay() {
        const targetElement = document.querySelector(".SkillActionDetail_enhancingComponent__17bOx");
        if (!targetElement) return;

        let enhancementStatsContainer = document.querySelector("#enhancementStatsContainer");

        if (!enhancementStatsContainer) {
            enhancementStatsContainer = document.createElement("div");
            enhancementStatsContainer.id = "enhancementStatsContainer";
            enhancementStatsContainer.style.display = "grid";
            enhancementStatsContainer.style.gridTemplateColumns = "repeat(4, 1fr)";
            enhancementStatsContainer.style.gap = "10px";
            enhancementStatsContainer.style.textAlign = "center";
            enhancementStatsContainer.style.marginTop = "10px";

            // 添加下拉框
            const dropdown = document.createElement("select");
            dropdown.id = "enhancementDropdown";
            dropdown.style.marginBottom = "10px";
            dropdown.addEventListener("change", function () {
                renderStats(this.value);
            });
            targetElement.appendChild(dropdown);
            targetElement.appendChild(enhancementStatsContainer);
        }

        // 获取当前选中的选项
        const dropdown = document.querySelector("#enhancementDropdown");
        const previousSelectedValue = dropdown.value;

        dropdown.innerHTML = "";

        Object.keys(enhancementData).forEach(key => {
            const item = enhancementData[key];
            const option = document.createElement("option");
            const itemName = item["其他数据"]["物品名称"];
            const targetLevel = item["其他数据"]["目标强化等级"];
            const currentLevel = Math.max(...Object.keys(item["强化数据"]));
            const enhancementState = item["强化状态"];

            option.text = `${itemName} (目标: ${targetLevel})`;
            option.value = key;

            option.style.color = enhancementState === "强化成功" ? "green" : (currentLevel < targetLevel && Object.keys(enhancementData).indexOf(key) === Object.keys(enhancementData).length - 1) ? "Orange" : "red";
            dropdown.appendChild(option);
        });

        if (Object.keys(enhancementData).length > 0) {
            dropdown.value = previousSelectedValue || Object.keys(enhancementData)[0];
            renderStats(dropdown.value);
        }
    }

    function formatItemName(upgradeItemHash) {
        const namePartMatch = upgradeItemHash.match(/\/([^\/]+?)::[^:]+$/);
        if (namePartMatch && namePartMatch[1]) {
            const namePart = namePartMatch[1];
            const formattedName = namePart.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
            return formattedName;
        }
        return "Unknown Item";
    }


    function renderStats(selectedKey) {
        const enhancementStatsContainer = document.querySelector("#enhancementStatsContainer");
        enhancementStatsContainer.innerHTML = "";

        const item = enhancementData[selectedKey];

        // 表头
        const headers = ["等级", "成功次数", "失败次数", "成功率"];
        headers.forEach(headerText => {
            const headerDiv = document.createElement("div");
            headerDiv.style.fontWeight = "bold";
            headerDiv.textContent = isZH ? headerText : (headerText === "等级" ? "Level" : headerText === "成功次数" ? "Success" : headerText === "失败次数" ? "Failure" : "Success Rate");
            enhancementStatsContainer.appendChild(headerDiv);
        });

        // 总计信息
        const totalSuccess = Object.values(item["强化数据"]).reduce((acc, val) => acc + val["成功次数"], 0);
        const totalFailure = Object.values(item["强化数据"]).reduce((acc, val) => acc + val["失败次数"], 0);
        const totalCount = totalSuccess + totalFailure;
        const totalRate = totalCount > 0 ? (totalSuccess / totalCount * 100).toFixed(2) : "0.00";

        ["总计", totalSuccess, totalFailure, `${totalRate}%`].forEach((totalText, index) => {
            const totalDiv = document.createElement("div");
            totalDiv.textContent = isZH ? totalText : index === 0 ? "Total" : totalText;
            enhancementStatsContainer.appendChild(totalDiv);
        });

        Object.keys(item["强化数据"]).sort((a, b) => b - a).forEach(level => {
            [level, item["强化数据"][level]["成功次数"], item["强化数据"][level]["失败次数"], `${(item["强化数据"][level]["成功率"] * 100).toFixed(2)}%`].forEach(data => {
                const dataDiv = document.createElement("div");
                dataDiv.textContent = data;
                enhancementStatsContainer.appendChild(dataDiv);
            });
        });
    }




    hookWS();
})();