// ==UserScript==
// @name 额外工具
// @namespace ewgn
// @version 24.3.16
// @date 16/2/2024
// @modified 16/2/2024
// @description 武神传说 MUD
// @author Bob.cn, 初心, 白三三,HS
// @match http://*.wsmud.com/*
// @match http://*.wamud.com/*
// @run-at document-end
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @license MIT
// @grant unsafeWindow
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_listValues
// @grant GM_setClipboard
// ==/UserScript==
(function () {
"use strict";
//***********************************************************************************\
console.log(unsafeWindow.websocket);
var WG = undefined;
//***********************************************************************************\
function AddContent(element) {
$(".content-message pre").append(element);
AutoScroll(".content-message");
return false;
}
function AutoScroll(name) {
if (name) {
let scrollTop = $(name)[0].scrollTop;
let scrollHeight = $(name)[0].scrollHeight;
let height = Math.ceil($(name).height());
if (scrollTop < scrollHeight - height) {
let add = scrollHeight - height < 120 ? 1 : Math.ceil((scrollHeight - height) / 120);
$(name)[0].scrollTop = scrollTop + add;
setTimeout(function () {
AutoScroll(name);
}, 1000 / 120);
}
}
} //滚动
function SendCommand(command) {
if (command instanceof Array) {
if (command.length === 0) return;
let cmd1 = command[0];
let cmd2 = command.slice(1);
if (typeof cmd1 === "number") {
setTimeout(() => SendCommand(cmd2), cmd1);
} else if (cmd1) {
SendCommand(cmd1);
SendCommand(cmd2);
}
} else if (typeof command === "string") {
if (WG == null) {
WG = unsafeWindow.WG;
}
WG.Send(command);
}
} //发送
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
} //延时
//***********************************************************************************\
async function tongji() {
let map = new Map(); //背包数据
let wenben = ""; //输出文本
let 残页回收 = "";
//对比数据
let 秘籍 = new Map();
let 绿色秘籍 = ["太祖长拳", "唐诗剑法", "五虎断门刀", "云龙鞭法", "意形步法", "神龙剑", "华山剑法", "混元一气", "飞檐走壁", "伏虎拳", "绝门棍", "猴拳", "云龙身法", "云龙心法", "秋风拂尘", "密宗心法", "密宗大手印", "冷月神功", "金雁功"];
let 蓝色秘籍 = ["神龙心法", "云龙剑", "神形百变", "蛇岛奇功", "化骨绵掌", "胡家刀法", "四象步法", "金蛇锥法", "八卦拳", "八卦棍", "五毒神功", "恒山身法", "踏歌行", "穿云纵", "流云掌", "泰山拳法", "碧波神功", "蟾蜍步法", "摘星功", "飞星术", "青蝠身法", "绝情掌", "神剑诀", "鹰爪功", "圣火令法", "天南步", "身空行", "蒙古心法", "无常杖"];
let 黄色秘籍 = ["金蛇剑法", "金蛇游身掌", "金蛇游身步", "五毒烟萝步", "五毒钩法", "千蛛万毒手", "白云心法", "恒山剑法", "天长掌法", "狂风快刀", "摧心掌", "松风剑法", "镇岳诀", "衡山五神剑", "泰山剑法", "磐石神功", "大嵩阳神掌", "嵩山剑法", "暗影浮香", "落英神剑", "三阴蜈蚣爪", "七伤拳", "移风剑法", "天羽奇剑", "圣火神功", "段家剑", "玉女心经", "银索金铃", "全真剑法", "中平枪法", "蒙古骑枪"];
let 紫色秘籍 = ["寒冰真气", "弹指神通", "空明拳", "灵蛇杖法", "蛤蟆功", "化功大法", "移花接木", "明玉功", "参合指", "枯木神功", "神照经", "血海魔功", "一阳指", "玄虚步", "伏魔棍", "彼岸剑法", "圆月弯刀", "先天功"];
let 橙色秘籍 = ["斗转星移", "辟邪剑法", "葵花神功", "不老长春功", "九阳神功", "乾坤大挪移", "六脉神剑", "血刀", "黯然销魂掌", "玄铁剑法", "九阴神功", "太玄功", "无念禅功", "伏魔杖", "如来神掌", "真言手印", "灵犀步", "天地交征阴阳大悲赋", "龙象般若功"];
let 红色秘籍 = ["长生诀", "慈航剑典", "阴阳九转", "战神图录", "覆雨剑法", "天魔策", "逆天道"];
let 进阶秘籍 = ["太极拳进阶", "梯云纵进阶", "先天太极进阶", "太极剑法进阶", "混元天罡进阶", "逍遥游进阶", "打狗棒进阶", "降龙十八掌进阶", "劈石破玉拳进阶", "紫霞神功进阶", "狂风快剑进阶", "独孤九剑进阶", "九阴白骨爪进阶", "诸天化身步进阶", "临济十二庄进阶", "倚天剑法进阶", "一指禅进阶", "一苇渡江进阶", "燃木刀法进阶", "金刚不坏体进阶", "北冥神功进阶", "天山六阳掌进阶", "凌波微步进阶", "小无相功进阶", "穿心掌进阶", "杀生决进阶", "踏雪寻梅进阶", "漫天花雨进阶"];
秘籍.set("绿色秘籍", 绿色秘籍).set("蓝色秘籍", 蓝色秘籍).set("黄色秘籍", 黄色秘籍).set("紫色秘籍", 紫色秘籍).set("橙色秘籍", 橙色秘籍).set("红色秘籍", 红色秘籍).set("进阶秘籍", 进阶秘籍);
function mergeArrays(maps, DOMdatas) {
for (const DOMdata of DOMdatas) {
if (DOMdata.innerHTML == "") continue;
let key = DOMdata.innerHTML.match(/<.*?>(.*?)</)[1];
let value = +(DOMdata.innerHTML.match(/<span class="obj-value">(\d*).*?</)[1] || "1");
maps.has(key) ? maps.set(key, maps.get(key) + value) : maps.set(key, value);
}
}
SendCommand(YZC["打开仓库"]);
let ck;
do {
ck = document.querySelector(".dialog-title").innerHTML.indexOf("你的仓库中");
await sleep(200);
} while (ck == -1);
let bagdatas = document.querySelectorAll(".obj-item");
mergeArrays(map, bagdatas);
SendCommand(YZC["打开书架"]);
let sj;
do {
sj = document.querySelector(".dialog-title").innerHTML.indexOf("你的书架上");
await sleep(200);
} while (sj == -1);
let shujia = document.querySelectorAll(".obj-list:first-child>.obj-item");
mergeArrays(map, shujia);
let changdu = [];
for (let amount of 秘籍.values()) {
amount.forEach((item) => {
changdu.push(item.length);
});
}
let changmax = Math.max(...changdu) + 2;
function jiakg(str, alength = changmax, kongge = "ㅤ") {
let newstr = str;
if (str.length < alength) {
for (let i = 0; i < +alength - +str.length; i++) {
newstr = kongge + newstr;
}
}
return newstr;
}
秘籍.forEach((value, key) => {
let keycd = changmax * 2 + 12;
let keywb1 = key.padStart(keycd / 2, "——");
let keywb2 = keywb1.padEnd(keycd, "——");
wenben += "<p>" + keywb2 + "</p>";
value.forEach((item) => {
const miji = item + "秘籍";
const mjsl = ((map.get(miji) || " ") + "").padStart(3, " ");
const canye = item + "残页";
const cysl = ((map.get(canye) || " ") + "").padStart(3, " ");
if ((map.get(miji) || 0) > 0 && key != "红色秘籍" && key != "进阶秘籍") {
残页回收 += canye + ",";
}
wenben += `<p>${jiakg(miji)} ${mjsl}||${jiakg(canye)} ${cysl}</p>`;
});
});
let html = `
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<style>
*{
white-space: pre;
font-family: monospace;
padding: 0;
margin: 0;
font-size: 16px;
}
</style>
</head>
<body>
${wenben}
<hr>
<p>${残页回收}</p>
</body>
</html>`;
let blob = new Blob([html], { type: "text/html" });
let url = URL.createObjectURL(blob);
window.open(url, "_blank");
残页回收 = "";
map.clear();
} //统计功能
function 仓库排序() {
let 稀有度 = [
["<wht>", "</wht>"],
["<hig>", "</hig>"],
["<hic>", "</hic>"],
["<hiy>", "</hiy>"],
["<hiz>", "</hiz>"],
["<hio>", "</hio>"],
["<ord>", "</ord>"],
];
let 宝石排序 = ["碎裂的红宝石", "红宝石", "精致的红宝石", "完美的红宝石", "攻击之石", "朱雀之魂", "碎裂的黄宝石", "黄宝石", "精致的黄宝石", "完美的黄宝石", "气血之石", "玄武之魂", "碎裂的蓝宝石", "蓝宝石", "精致的蓝宝石", "完美的蓝宝石", "躲闪之石", "青龙之魂", "碎裂的绿宝石", "绿宝石", "精致的绿宝石", "完美的绿宝石", "命中之石", "白虎之魂", "碎裂的紫薇", "紫薇", "碎裂的破军", "破军", "碎裂的七杀", "七杀", "碎裂的贪狼", "贪狼"];
let 鱼排序 = ["鱼饵","鲤鱼","鲢鱼","草鱼","鲂鱼","鳊鱼","鲮鱼","黄金鳉","黄颡鱼","太湖银鱼","虹鳟","反天刀","孔雀鱼","罗汉鱼","黑龙鱼","银龙鱼","七星刀鱼","巨骨舌鱼","帝王老虎魟"];
let 药材排序 = ["芦荟","当归","山楂叶","柴胡","石楠叶","金银花","沉香","茯苓","熟地黄","九香虫","络石藤","冬虫夏草","人参","何首乌","凌霄花","灵芝","盘龙参","天仙藤","沉天叶","凤鸣花","龙鳞草","轮回蛊","神血藤"];
let 丹药排序 = ["冰心丹","玄灵丹","突破丹","大还丹","大力丸","凝神丹","归心散","石龟丹","风行散","风雷丹","赤火丹","赤血丹","玄武丹","破军丹","风神丹","生机丸","玄冰丹","归元散","风行丹","造化丹","无常丹","清心丹","蕴象丹","顿悟丹","金创药","引气丹","聚气丹"];
let 其他排序 =["玄晶","师门令牌","喜宴:碧螺春卷","喜宴:蝴蝶暇卷","喜宴:佛手金卷","喜宴:金丝酥雀","喜宴:山珍刺龙芽","鳄鱼皮","火龙筋"];
let 物品排序 = [].concat(宝石排序,鱼排序,药材排序,丹药排序,其他排序)
let 物品排序加颜色 = [];
物品排序.forEach((item) => {
稀有度.forEach((item1) => {
物品排序加颜色.push(item1[0] + item + item1[1]);
});
});
let bagDatas = document.querySelectorAll(".obj-item");
console.log(bagDatas);
let bag = document.querySelector(".obj-list");
console.log(bag);
物品排序加颜色.forEach((item) => {
for (let a of bagDatas) {
if (a.innerHTML != "") {
let 文本1 = a.innerHTML.match(/([^ ]*?<\/.*?>)/)[1];
if (item == 文本1) {
let 文本2 = 文本1.padStart(23, "一");
a.innerHTML = a.innerHTML.replace(文本1, 文本2);
console.log(a.innerHTML);
bag.append(a);
}
}
}
});
}
//***********************************************************************************\
$(document).ready(function () {
WG = unsafeWindow.WG;
$(".right-bar").before($("<div></div>").append($(`<span class="span-btn"></span>`).append("功能").click(togn)));
});
let togn = function () {
AddContent(
$("<div></div>").append(
$(`<span class="span-btn"></span>`)
.append("统计残页秘籍数量")
.click(() => tongji()),
$(`<span class="span-btn"></span>`)
.append("仓库排序")
.click(() => 停止()),
$(`<br>`)
)
);
};
function 停止(){
WG.Send("stopstate")
}
//***********************************************************************************\
let YZC = {
打开仓库: ["stopstate", "jh fam 0 start", "go west", "go west", "go north", "go enter", "go north", "store"],
打开书架: ["stopstate", "jh fam 0 start", "go west", "go west", "go north", "go enter", "go north", "select ltvxd096a69", "sj"],
};
})();