在线统计强化成功/失败次数
当前为
// ==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();
})();