// ==UserScript==
// @name [银河奶牛]中文单位转换
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 智能转换k/M单位:10k→1万,100k→10万,1M→1百万
// @license MIT
// @author sangshiCHI
// @match https://www.milkywayidle.com/*
// @match https://test.milkywayidle.com/*
// @match https://luyh7.github.io/milkonomy/*
// @match https://amvoidguy.github.io/MWICombatSimulatorTest/*
// @match https://shykai.github.io/mwisim.github.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=milkywayidle.com
// @grant GM.xmlHttpRequest
// @grant GM_registerMenuCommand
// ==/UserScript==
/*转换规则说明:
1k-9999k范围:
1k → 1000
9.9k → 9900
1万-99.9万范围:
10k → 1万
99.9k → 9.99万
10万-99.9万范围:
100k → 10万
999k → 99.9万
100万及以上:
1000k → 1百万
10000k → 1千万
*/
//↓↓↓↓此段引用自stella‘Milky way idle汉化插件’脚本:https://gf.qytechs.cn/zh-CN/scripts/494308-milky-way-idle%E6%B1%89%E5%8C%96%E6%8F%92%E4%BB%B6/code ↓↓↓↓
//1.排除非翻译部分
const excludeRegs = [
// 一个字母都不包含
/^[^a-zA-Z]*$/,
// 排除时间
/^(\d+h )?(\d+m )?(\d+s)*$/,
// 等级
/^Lv.\d+$/,
];
const excludeSelectors = [
// 排除人名相关
'[class^="CharacterName"]',
// 排除排行榜人名
'[class^="CharacterName_name__1amXp"] span',
// 排除共享链接
'[class^="SocialPanel_referralLink"]',
// 排除工会介绍
'[class^="GuildPanel_message"]',
// 排除工会名字
'[class^="GuildPanel_guildName"]',
// 排除排行榜工会名字
'[class^="LeaderboardPanel_guildName"]',
// 排除个人信息工会名字
'[class^="CharacterName_characterName__2FqyZ CharacterName_xlarge__1K-fn"]',
// 排除战斗中的玩家名
'[class^="BattlePanel_playersArea"] [class^="CombatUnit_name"]',
// 排除消息内容
'[class^="ChatMessage_chatMessage"] span',
// 社区buff贡献者名字
'[class^="CommunityBuff_contributors"] div',
// 选择队伍中的队伍名
'[class^="FindParty_partyName"]',
// 队伍中的队伍名
'[class^="Party_partyName"]',
];
//↑↑↑↑此段引用自stella‘Milky way idle汉化插件’脚本:https://gf.qytechs.cn/zh-CN/scripts/494308-milky-way-idle%E6%B1%89%E5%8C%96%E6%8F%92%E4%BB%B6/code↑↑↑↑
(function() {
'use strict';
// 🔧 调试模式 (true开启日志)
const DEBUG = true;
const log = DEBUG ? console.log.bind(console, '[单位转换]') : () => {};
// 🎯 配置核心参数(主要修改点1:移除千单位规则)
const CONFIG = {
SCAN_INTERVAL: 500,
MIN_NUMBER: 10000, // 主要修改点2:仅处理1万以上数值
UNIT_RULES: [
{ value: 1e8, symbol: '亿', decimals: 1 },
{ value: 1e4, symbol: '万', decimals: 1 }
],
EXCLUDE_TAGS: ['SCRIPT', 'STYLE', 'TEXTAREA']
};
// 🔄 单位转换核心(主要修改点3:调整返回逻辑)
function convertValue(input) {
try {
const match = input.match(/([\d,]+\.?\d*)([kKmM]?)/);
if (!match) return input;
let num = parseFloat(match[1].replace(/,/g, ''));
const unit = match[2].toUpperCase();
switch(unit) {
case 'K': num *= 1e3; break;
case 'M': num *= 1e6; break;
}
// 主要修改点4:千位以内直接返回格式化数值
if (num < 10000) {
return num.toLocaleString(); // 如2741 → 2,741
}
for (const rule of CONFIG.UNIT_RULES) {
if (num >= rule.value) {
const value = num / rule.value;
let result = value.toFixed(rule.decimals)
.replace(/\.?0+$/, '')
.replace(/\.$/, '');
// 处理大数值进位问题(如5500万)
if (rule.symbol === '万' && num >= 1e7) {
return `${(num/1e4).toFixed(0)}万`;
}
return `${result}${rule.symbol}`;
}
}
// 万级以下数值保留原格式(主要修改点5)
return num.toLocaleString();
} catch(e) {
log('转换异常:', input, e);
return input;
}
}
/* 其余代码保持不变(DOM处理器/扫描器/监听系统等) */
// ...(保持原有DOM处理逻辑不变)...
// 🖥️ DOM处理器
function processTextNode(node) {
if (CONFIG.EXCLUDE_TAGS.includes(node.parentNode.tagName)) return;
const newText = node.textContent.replace(/(\d[\d,.kKmM]*)/g, (match) => {
if (/^\d+$/.test(match)) return match;
return convertValue(match);
});
if (newText !== node.textContent) {
node.textContent = newText;
log('已转换:', node.textContent, '→', newText);
}
}
// 🔍 安全扫描器
function safeScan(root = document) {
try {
const walker = document.createTreeWalker(
root,
NodeFilter.SHOW_TEXT,
{ acceptNode: node =>
node.textContent.match(/\d/) ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_REJECT
}
);
let node;
while ((node = walker.nextNode())) {
processTextNode(node);
}
} catch(e) {
log('扫描异常:', e);
}
}
// 🚀 动态内容监听系统
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === Node.ELEMENT_NODE) {
setTimeout(() => safeScan(node), 100);
}
});
});
});
// 📡 初始化系统
function init() {
safeScan(document.body);
observer.observe(document, {
childList: true,
subtree: true
});
setInterval(() => safeScan(document.body), CONFIG.SCAN_INTERVAL);
log('系统启动成功');
}
// ⏳ 延迟启动防止遗漏
if (document.readyState === 'complete') {
setTimeout(init, 1000);
} else {
window.addEventListener('load', () => setTimeout(init, 1000));
}
})();