// ==UserScript==
// @name 装备管理
// @namespace http://tampermonkey.net/
// @version 2026-03-11
// @description 别问这是什么
// @author 生猛的程序
// @match https://aring.cc/awakening-of-war-soul-ol/
// @icon https://www.google.com/s2/favicons?sz=64&domain=aliyuncs.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
let jsPath=''
let isStart=true
let fitterCD=65
const htmlStr={
divstr:`
`,
lcukHtml:``
}
//🔒
let btnstksp,btncrt,btnheat
let labstksp,labcrt,labheat
let btnlock,lockviews
let isAutoLock=false
let baseData=[] //---装备数据--原始
let baseListData=[] //---装备数据--筛选
let special=[] //--筛选词条
let quality=[] //--装备等级
let equiptype=[] //--装备类型
let lastTime = 0;
const wait =200;
let buttons;
let clickfillertype=-1 //--排序条件
let countText;
let darkGoldBtn;
function fullView(){
const viewparent=document.querySelector('.item-page')
if(viewparent){
const childParent=viewparent.querySelector('.action');
if(childParent){
countText=childParent.querySelector('span').querySelector('span');
const pageview=childParent.querySelector('.item-filter-wrap');
if(pageview){
const oldbuttons = pageview.querySelectorAll('button');
oldbuttons.forEach(button=>{
// 创建MutationObserver监听样式变化
if(button.innerText==='重置'){
if(!isStart){
return
}
// 添加点击事件(可选)
button.addEventListener('click', () => {
clickfillertype=-1;
special=[];
quality=[] //--装备等级
equiptype=[] //--装备类型
//baseListData=baseData;
// 方式2:更易读的多行写法
if (btnstksp) {
btnstksp.style='margin-top: 10px;';
labstksp.classList.remove('unique');
}
if (btncrt) {
btncrt.style='margin-top: 10px;';
labcrt.classList.remove('unique');
}
if (btnheat) {
btnheat.style='margin-top: 10px;';
labheat.classList.remove('unique');
}
buttons.forEach(button => {
if(button.id){
const labBtn=document.getElementById(`lab${button.id}`)
button.style='margin-top: 10px;'
labBtn && labBtn.classList.remove('legend')
}
});
setTimeout(sortItemsByAtksp, 100);
console.log('重置按钮被点击');
});
}
if(button.innerText==='暗金'){
darkGoldBtn=button
}
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
const currentStyle = button.getAttribute('style') || '';
const hasRedBorder = currentStyle.includes('border-color: red');
// 触发自定义事件
const event = new CustomEvent('borderColorChange', {
detail: {
hasRedBorder: hasRedBorder,
element: button
}
});
button.dispatchEvent(event);
}
});
});
// 开始观察
observer.observe(button, {
attributes: true,
attributeFilter: ['style']
});
// 添加事件监听器
button.addEventListener('borderColorChange', (e) => {
//--先确认ID是否为排序相关
const now = Date.now();
console.log('颜色变化事件');
if (now - lastTime >= wait) {
if (e.detail.hasRedBorder) {
console.log('按钮边框变为红色:', e.detail.element.id);
// 在这里添加边框变红时的处理逻辑
} else {
console.log('按钮边框红色消失:', e.detail.element.id);
// 在这里添加边框红色消失时的处理逻辑
}
lastTime = now;
//baseListData=[];
filterType(e.detail.element)
//setTimeout(, 100);
}
});
});
// 创建新元素
const newElement = document.createElement(`div`);
//newElement.className = 'common-btn-wrap';
newElement.setAttribute(childParent.attributes[0].name, '');
// newElement.setAttribute(`style`,"grid-column: span 3;width:100%;")
newElement.innerHTML = htmlStr.divstr;
// 添加点击事件(可选)
//pageview.appendChild(8,newElement);
pageview.insertBefore(newElement, pageview.children[9]);
// 为所有子元素设置属性
const allChildren = newElement.querySelectorAll('*');
allChildren.forEach(child => {
child.setAttribute(childParent.attributes[0].name, '');
});
// 监听button元素的样式变化
buttons = newElement.querySelectorAll('button');
buttons.forEach(button => {
const btnID=button.id
let clicktype=-1;
switch(btnID){
case 'btnstksp':
!btnstksp && (btnstksp=button,labstksp=document.getElementById('labstksp'))
clicktype=0
break
case 'btncrt':
!btncrt && (btncrt=button,labcrt=document.getElementById('labcrt'))
clicktype=1
break
case 'btnheat':
!btnheat && (btnheat=button,labheat=document.getElementById('labheat'))
clicktype=2
break
}
// if(clicktype>=0){
button.addEventListener('click', (e) => {
if(clicktype==-1){
//const btn = e.target; // 获取被点击的按钮
//const bID=btn.id;
const labBtn=document.getElementById(`lab${btnID}`)
const isHave=special.find(item=>item===btnID)
if(isHave){
special = special.filter(item => item !== btnID);
button.style='margin-top: 10px;'
labBtn.classList.remove('legend')
}else{
special.push(btnID)
button.style="margin-top: 10px;border-color: red;"
labBtn.classList.add('legend')
}
if(special&&special.length>0&&!checkBtnClick(darkGoldBtn)){
//---有自定义筛选内容,且没有选择暗金类型,手动点击暗金
darkGoldBtn.click()
}
}else{
( btnstksp && (btnstksp.style='margin-top: 10px;',labstksp.classList.remove('unique')),
btncrt && (btncrt.style='margin-top: 10px;',labcrt.classList.remove('unique')),
btnheat && (btnheat.style='margin-top: 10px;',labheat.classList.remove('unique')))
switch(btnID){
case 'btnstksp':
clickfillertype=0
// btnstksp.+="border-color: red;"
btnstksp.style="margin-top: 10px;border-color: red;"
labstksp.classList.add('unique')
//!btnstksp && (btnstksp=e.detail.element)
// clicktype=0
break
case 'btncrt':
clickfillertype=1
labcrt.classList.add('unique')
btncrt.style="margin-top: 10px;border-color: red;"
// !btncrt && (btncrt=e.detail.element)
// clicktype=1
break
case 'btnheat':
clickfillertype=2
labheat.classList.add('unique')
btnheat.style="margin-top: 10px;border-color: red;"
// !btnheat && (btnheat=e.detail.element)
// clicktype=2
break
}
}
sortItemsByAtksp()
});
// }
});
}
// 创建新元素
const newElement = document.createElement(`span`);
/*
newElement.setAttribute('aria-disabled', 'true');
newElement.setAttribute('type', 'button');
newElement.setAttribute('class', 'el-button el-button--success el-button--small is-plain normal');
newElement.setAttribute(childParent.attributes[0].name, '');
*/
newElement.setAttribute(`style`,"margin-left: 12px;")
newElement.setAttribute('class', 'equip-lock');
newElement.innerHTML = htmlStr.lcukHtml;
btnlock=newElement.querySelector('button');
lockviews=newElement.querySelectorAll('.el-icon')
// 添加点击事件(可选)
newElement.addEventListener('click', () => {
// console.log('新按钮被点击',T);
if(isAutoLock){
//---解锁
btnlock.classList.remove('el-button--success');
btnlock.classList.add('el-button--info');
lockviews[0].style='font-size: 15px;'
lockviews[1].style='font-size: 15px; display: none;'
}else{
//---加锁
btnlock.classList.add('el-button--success');
btnlock.classList.remove('el-button--info');
lockviews[1].style='font-size: 15px;'
lockviews[0].style='font-size: 15px; display: none;'
setTimeout(LockItemsByAtksp, 2000);
}
isAutoLock=!isAutoLock
});
//pageview.appendChild(8,newElement);// 正确用法
childParent.insertBefore(newElement, childParent.children[childParent.children.length - 1]);
}
}
const htmlconet=document.create
}
function checkBtnClick(button){
const currentStyle = button.getAttribute('style') || '';
const hasRedBorder = currentStyle.includes('border-color: red');
return hasRedBorder
}
setTimeout(fullView, 2000);
//---查找挂载JS
function findIndexJS(){
const scripts = document.querySelectorAll('script[src]');
scripts.forEach(script => {
const src = script.src;
if (src.includes('assets') && src.includes('index') && src.endsWith('.js')) {
jsPath=src;
loadData()
return
// console.log('找到目标文件:', src);
}
});
console.log('文件筛选完毕:');
}
setTimeout(findIndexJS, 2000);
const On = {
normal: "普通",
race: "稀有",
epic: "史诗",
unique: "独特",
legend: "传说",
antiquity: "远古",
peerless: "绝世",
darkGold: "暗金",
myth: "神话暗金"
}
function matchKeyByText(text) {
return Object.keys(On).find(key => On[key] === text) ||null;
}
function filterType(btnV){
const cn=btnV.innerText;
if(cn){
const isHaveNT= matchKeyByText(cn)
if(isHaveNT){
const isHave=quality.find(item=>item===isHaveNT)
if(isHave){
quality = quality.filter(item => item !== isHaveNT);
}else{
quality.push(isHaveNT)
}
}else {
let ztype=''
switch(cn){
case '🔪':
ztype='weapon'
break
case '🧢':
ztype='helmet'
break
case '🥋':
ztype='armor'
break
case '🥾':
ztype='shoes'
break
case '💍':
ztype='jewelry'
break
}
const isHave=equiptype.find(item=>item===ztype)
if(isHave){
equiptype = equiptype.filter(item => item !== ztype);
}else{
equiptype.push(ztype)
}
}
sortItemsByAtksp()
}
}
let UserData
let UserRE
function loadData(isOrivade){
if(!jsPath){
return;
}
if(!UserData||isOrivade){
const getModuleExports = async () => {
try {
const module = await import(jsPath); // 替换为实际路径
const data={};
data.userD=module.u;
data.userB=module.b;
return data;
} catch (e) {
console.error('模块加载失败:', e);
}
}
getModuleExports().then(tool => {
tool && (UserData=tool.userD,UserRE=tool.userB,initData(),checkRE());
});
}
}
function checkRE(){
if(UserRE&&Object.keys(te(UserRE)).length > 0){
return;
}
console.log('装备数据详情');
setTimeout(()=>{
loadData(true)}, 2000);
}
function d(t) {
return !!(t && t.__v_isRef === !0)
}
function te(t) {
return d(t) ? t.value : t
}
function checkLogin(){
// 获取目标元素
const element = document.querySelector('.start-page');
let isVisible = false
if (element) {
// 判断显示状态的三种方法(任选其一)
isVisible =
// 方法1:通过计算样式检查
window.getComputedStyle(element).display !== 'none' ||
// 方法2:通过偏移量检查(更全面)
(element.offsetWidth > 0 || element.offsetHeight > 0) ||
// 方法3:通过可见性检查
element.getClientRects().length > 0;
console.log('元素显示状态:', isVisible);
} else {
isVisible=true;
console.error('未找到 class="start-page" 的元素');
}
return isVisible
}
function initData(){
if(UserData){
const r=UserData()
/*
console.log('当前背包装备数量(可能含装备栏):'+r.itemList.length);
*/
//--初始化装备类型
r.itemList.forEach(item=>{
item.quality=item.quality.replace('custom','');
});
//const jsonstr=JSON.stringify(r.itemList)
baseListData=r.itemList;
}
}
function deepCopyArray(arr) {
return arr.map(item => {
if (Array.isArray(item)) {
return deepCopyArray(item);
} else if (typeof item === 'object' && item !== null) {
return { ...item };
} else {
return item;
}
});
}
function sortItemsByAtksp() {
if(UserData){
const r=UserData();
initData();
/*
const listItem1=[],listItem2=[];
if(isStart){
//---筛选类型 UserRE
listItem1 =baseListData.filter(item=>{
return equiptype.length>0?equiptype.find(it=>te(UserRE)[item.equipId].type===it):true;
})
//---筛选阶级
listItem2=listItem1.filter(item=>{
return quality.length>0?quality.find(it=>item.quality===it):true;
})
}else{
listItem2=baseListData
}
*/
const equippedList=[]
//console.log(`当前装备套路:${r.equippedRoutineList.find(eq=>eq.id==r.equippedRoutineId).name} `);
for (const [key, value] of Object.entries(r.equippedList)) {
//console.log(`装备类型: ${key}, ID: ${value}`);
equippedList.push(value);
}
//---找到不满足条件的
let filterData =[];
if(special.length>0){
filterData= baseListData.filter(item=>{
if(checkEquipped(equippedList,item.id)){
console.log('你应该要进来5次');
return false
}
try{
//--先筛选装备类型,后筛选装备词条 并且他们是同时满足
return !((checkEquippedType(item) && special.find(kv=>kv===item.darkGoldAttrs.special[0].key || kv===item.engraveAttr.special[0].key ) )|| !isStart);
}catch(e){
return true
}
});
}
filterData.forEach(item=>{
item.quality=item.quality+'custom';
});
const newList=clickfillertype>=0 ? baseListData.sort((a, b) => {
const atkspA = getAtksp(a,clickfillertype) || 0;
const atkspB = getAtksp(b,clickfillertype) || 0;
return atkspB - atkspA; // 降序排序
}):baseListData;
r.itemList=newList
let count=r.itemList.length-5-filterData.length
countText && (countText.innerText=count+'')
console.log('筛选后的装备条目数:',count );
}else{
loadData()
}
}
function checkEquipped(equippedList,equipid){
let isHave=false;
equippedList.forEach(ql=>
{
if(ql===equipid){
isHave = true;
}
});
return isHave;
}
function checkEquippedType(item){
//---再筛选下类型
return equiptype.length>0?equiptype.find(it=>te(UserRE)[item.equipId].type===it):true;
}
let tl={
"thump": {
"multiplier": 1.2
},
"harvest": {
"multiplier": 1.75
},
"assault": {
"multiplier": 1.75
},
"chasing": {
"value": 1.6
},
"heavyInjury": {
"value": 2.4
},
"break": {
"multiplier": 0.5
},
"crushBone": {
"value": 3,
"multiplier": 1.3
},
"burst": {
"rate": 0.75
},
"nothingness": {
"multiplier": 0.6
},
"split": {
"rate": 1.5
},
"cruel": {
"value": 2.4,
"multiplier": 1
},
"shadowBlade": {
"value": 0.95,
"multiplier": 0.25
},
"swiftness": {
"value": 0.02
},
"precise": {
"multiplier": 1.4
},
"rout": {
"value": 0.75,
"multiplier": 1.5
},
"tearInjury": {
"value": 1.45
},
"impact": {
"value": 5,
"multiplier": 2.3
},
"windUp": {
"value": 5,
"multiplier": 2.3
}
}
function getAtksp(item,typec) {
let findstr='atksp'
switch(typec){
case 0:
findstr='atksp';
break
case 1:
findstr='crt';
break
case 2:
findstr='heat';
break
}
const darkGoldAttrs = item.darkGoldAttrs || {};
const basicAttrs = darkGoldAttrs.basic || [];
if(typec>=0){
const crtdEntry = basicAttrs.find(attr => attr[0] === findstr);
return sumAttributes(basicAttrs,findstr)
}else{
//----加锁--暗金属性满分
const crtdValue = basicAttrs.find(attr => attr[1] === 10);
(crtdValue||hasSpecialValueGreaterThan5(item)) && (item.isLock =true);
}
}
function sumAttributes(basicAttrs, findstr) {
return basicAttrs.reduce((sum, attr) => {
if (attr[0] === findstr) {
return sum + attr[1];
}
return sum;
}, 0);
}
//暗金词条纯度高于50
function hasSpecialValueGreaterThan5(item) {
const special = item.darkGoldAttrs?.special || [];
return special.find(attr=>{
const {
key: c,
data: _
} = attr,w = Object.keys(tl[c]), m = (_[w[0]] || _[w[1]]) * 10;
return m>=fitterCD
});
/*
for (const attr of special) {
const data = attr.data || {};
for (const key in data) {
if (typeof data[key] === 'number' && data[key] > 5) {
return true;
}
}
}
return false;*/
}
//----加锁
function LockItemsByAtksp() {
if(UserData){
const r=UserData();
r.itemList.map(item=>getAtksp(item,-1));
}else{
loadData()
}
isAutoLock&&(setTimeout(LockItemsByAtksp, 2000));
}
})();