diff --git a/torn-trans-zhcn.user.js b/torn-trans-zhcn.user.js index 8b20929..5ee48ad 100644 --- a/torn-trans-zhcn.user.js +++ b/torn-trans-zhcn.user.js @@ -1,8 +1,8 @@ // ==UserScript== -// @lastmodified 202112241544 +// @lastmodified 202112241711 // @name Torn翻译 // @namespace WOOH -// @version 0.1.1224a +// @version 0.1.1224b // @description Torn UI翻译 // @author Woohoo-[2687093] sabrina_devil[2696209] // @match https://www.torn.com/* @@ -23,6 +23,11 @@ todo: true, cont: `baza npc商店 imarket及imarket搜索结果`, }, + { + ver: '0.1.1224b', + date: '20211224', + cont: `小镇提示逻辑改写`, + }, { ver: '0.1.1224a', date: '20211224', @@ -5485,24 +5490,11 @@ margin: 0 0 3px; ? JSON.parse(localStorage.getItem('wh-loot-setting')) : {blink: 'y', sound: 'y', chest: 'y'}; let $ct_wrap; + let soundLoopFlag = false; const getDOMOb = new MutationObserver(() => { $ct_wrap = $root.querySelector('#ct-wrap'); if ($ct_wrap) { getDOMOb.disconnect(); - ob.observe($ct_wrap, {childList: true, subtree: true}); - } - }); - const ob = new MutationObserver(() => { - // if ($ct_wrap) { - const $ct_title = $ct_wrap.querySelector('.status-title'); - const $pos = $ct_wrap.querySelector('.map-title span[class^="position___"]') || $ct_wrap.querySelector('.status-title span[class^="position___"]'); - if (!$pos) return; - const $pos_spl = $pos.innerText.trim().split(','); - const player_position = {}; - player_position.x = parseInt($pos_spl[0]); - player_position.y = parseInt($pos_spl[1]); - let $wh_loot_container = $root.querySelector('#wh-loot-container'); - if (!$wh_loot_container) { const insert_html = `
附近物品
@@ -5554,29 +5546,76 @@ margin: 0 0 3px; } `; $($ct_wrap).before(insert_html); - $wh_loot_container = $root.querySelector('#wh-loot-container'); + const $wh_loot_container = $root.querySelector('#wh-loot-container'); + const $btn = $wh_loot_container.querySelector('#wh-loot-btn button'); + const $clear_btn = $wh_loot_container.querySelector('#wh-hist-clear button'); + const $ex = $wh_loot_container.querySelector('#wh-loot-container-ex'); + const $tbody = $wh_loot_container.querySelector('tbody'); + const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink'); + const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound'); + const $chest = $wh_loot_container.querySelector('#wh-loot-setting-chest'); + const $audio = $wh_loot_container.querySelector('audio'); + $btn.onclick = e => { + e.target.innerText = e.target.innerText === '设置' ? '收起' : '设置'; + $($ex).toggleClass('wh-hide'); + e.target.blur(); + }; + $clear_btn.onclick = e => { + dropHist = {}; + $tbody.innerHTML = ''; + e.target.blur(); + }; + $blink.onchange = e => { + if (e.target.checked) { + alertSettings.blink = 'y'; + if ($wh_loot_container.querySelector('#wh-loot-item-count').innerText !== '(0)') { + $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite'; + } + } else { + alertSettings.blink = 'n'; + $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = ''; + } + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + $sound.onchange = e => { + if (e.target.checked) { + alertSettings.sound = 'y'; + if ($wh_loot_container.querySelector('#wh-loot-item-count').innerText !== '(0)') { + soundLoopFlag = true; + } + } else { + alertSettings.sound = 'n'; + soundLoopFlag = false; + } + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + $chest.onchange = e => { + alertSettings.chest = e.target.checked ? 'y' : 'n'; + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + const soundIntervalID = window.setInterval(() => { + if (soundLoopFlag) $audio.play().then(); + }, 1200); + ob.observe($ct_wrap, {childList: true, subtree: true}); + } + }); + const ob = new MutationObserver(() => { + const $ct_title = $ct_wrap.querySelector('.status-title'); + const $pos = $ct_wrap.querySelector('.map-title span[class^="position___"]') || $ct_wrap.querySelector('.status-title span[class^="position___"]'); + if (!$pos) return; + const $pos_spl = $pos.innerText.trim().split(','); + const player_position = {}; + player_position.x = parseInt($pos_spl[0]); + player_position.y = parseInt($pos_spl[1]); + const $wh_loot_container = $root.querySelector('#wh-loot-container'); + if (!$wh_loot_container) { + console.error('掉落助手未找到DOM容器'); + return; } - const $audio = $wh_loot_container.querySelector('audio'); const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink'); - alertSettings.blink = $blink.checked ? 'y' : 'n'; const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound'); - alertSettings.sound = $sound.checked ? 'y' : 'n'; const $chest = $wh_loot_container.querySelector('#wh-loot-setting-chest'); - alertSettings.chest = $chest.checked ? 'y' : 'n'; - const $ex = $wh_loot_container.querySelector('#wh-loot-container-ex'); - const $btn = $wh_loot_container.querySelector('#wh-loot-btn button'); - const $clear_btn = $wh_loot_container.querySelector('#wh-hist-clear button'); const $tbody = $wh_loot_container.querySelector('tbody'); - if ($btn.onclick === null) $btn.onclick = (e) => { - e.target.innerText = e.target.innerText === '设置' ? '收起' : '设置'; - $($ex).toggleClass('wh-hide'); - e.target.blur(); - }; - if ($clear_btn.onclick === null) $clear_btn.onclick = (e) => { - dropHist = {}; - $tbody.innerHTML = ''; - e.target.blur(); - }; const nearby_arr = []; const items = $root.querySelectorAll('div.grid-layer div.items-layer div.ct-item'); // 附近的所有物品 @@ -5605,11 +5644,9 @@ margin: 0 0 3px; else if (nearby_item.x > player_position.x && nearby_item.y === player_position.y) path = '→'; else if (nearby_item.x > player_position.x && nearby_item.y < player_position.y) path = '↘'; else if (nearby_item.x === player_position.x && nearby_item.y < player_position.y) path = '↓'; - let isChest = false; let item_name; if (nearby_item.name === 'chests') { chest_count++; - isChest = true; item_name = chestTypeDict[nearby_item.type] + lootTypeDict[nearby_item.name]; $wh_loot_container_chests.innerHTML += `${path}[${nearby_item.x},${nearby_item.y}] ${item_name}` } else { @@ -5626,8 +5663,7 @@ margin: 0 0 3px; el.isPassed = true; } } else { - // (() => { - if (!(isChest && $chest.checked)) { + if (!(nearby_item.name === 'chests' && $chest.checked)) { const now = new Date(); dropHist[hist_key] = { pos: `[${nearby_item.x},${nearby_item.y}]`, @@ -5637,35 +5673,29 @@ margin: 0 0 3px; id: Object.keys(dropHist).length, }; } - // else { - // return; - // } - // })(); } } }); $wh_loot_container.querySelector('#wh-loot-item-count').innerText = `(${item_count})`; if (item_count === 0) { - $wh_loot_container_items.innerText = `暂无`; + $wh_loot_container_items.innerText = '暂无'; $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = ''; + soundLoopFlag = false; } else { if ($blink.checked) $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite'; - if ($sound.checked) $audio.play().then(); + if ($sound.checked) soundLoopFlag = true; } $wh_loot_container.querySelector('#wh-loot-chest-count').innerText = `(${chest_count})`; - if (chest_count === 0) $wh_loot_container_chests.innerText = `暂无`; - + if (chest_count === 0) $wh_loot_container_chests.innerText = '暂无'; const history = Object.keys(dropHist).map(key => dropHist[key]).sort((a, b) => a.id - b.id); let table_html = ''; history.forEach(e => { table_html += `${e.pos}${e.map}${e.name}${e.last}${e.isPassed ? '已取得' : '不确定'}`; }); $tbody.innerHTML = table_html; - localStorage.setItem('wh-loot-store', JSON.stringify(dropHist)); - localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); }); - getDOMOb.observe($root, {childList: true, subtree: true}) + getDOMOb.observe($root, {childList: true, subtree: true}); return; } diff --git a/torn-wh-show-loot-pos.user.js b/torn-wh-show-loot-pos.user.js index 896c507..220aa49 100644 --- a/torn-wh-show-loot-pos.user.js +++ b/torn-wh-show-loot-pos.user.js @@ -23,18 +23,19 @@ const chestTypeColorDict = {'1': 'gold', '2': 'silver', '3': 'sandybrown',}; const lootTypeDict = {'chests': '钥匙箱', 'gifts': '礼物', 'combinationChest': '密码箱', 'keys': '钥匙',}; const keyTypeDict = {'b': '铜', 's': '银', 'g': '金',}; - const intervalID = window.setInterval(() => { - const $city_wrapper = $root.querySelector('#ct-wrap'); - if ($city_wrapper) { - const $pos = $city_wrapper.querySelector('.map-title span[class^="position___"]') || $city_wrapper.querySelector('.status-title span[class^="position___"]'); - if (!$pos) return; - const $pos_spl = $pos.innerText.trim().split(','); - const player_position = {}; - player_position.x = parseInt($pos_spl[0]); - player_position.y = parseInt($pos_spl[1]); - let $wh_loot_container = $root.querySelector('#wh-loot-container'); - if (!$wh_loot_container) { - const insert_html = `
+ let dropHist = localStorage.getItem('wh-loot-store') + ? JSON.parse(localStorage.getItem('wh-loot-store')) + : {}; + const alertSettings = localStorage.getItem('wh-loot-setting') + ? JSON.parse(localStorage.getItem('wh-loot-setting')) + : {blink: 'y', sound: 'y', chest: 'y'}; + let $ct_wrap; + let soundLoopFlag = false; + const getDOMOb = new MutationObserver(() => { + $ct_wrap = $root.querySelector('#ct-wrap'); + if ($ct_wrap) { + getDOMOb.disconnect(); + const insert_html = `
附近物品
@@ -43,70 +44,198 @@ 箱子
+
+
+
+
+
+
+

- 如果长时间不清空数据会有奇怪的bug

+
+
历史记录
坐标地图类型发现获取
+
+
+
`; - $($city_wrapper).before(insert_html); - $wh_loot_container = $root.querySelector('#wh-loot-container'); - } + $($ct_wrap).before(insert_html); + const $wh_loot_container = $root.querySelector('#wh-loot-container'); + const $btn = $wh_loot_container.querySelector('#wh-loot-btn button'); + const $clear_btn = $wh_loot_container.querySelector('#wh-hist-clear button'); + const $ex = $wh_loot_container.querySelector('#wh-loot-container-ex'); + const $tbody = $wh_loot_container.querySelector('tbody'); + const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink'); + const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound'); + const $chest = $wh_loot_container.querySelector('#wh-loot-setting-chest'); const $audio = $wh_loot_container.querySelector('audio'); - const nearby_arr = []; - const items = $root.querySelectorAll('div.grid-layer div.items-layer div.ct-item'); - // 附近的所有物品 - items.forEach(el => { - const item_props = {x: 0, y: 0, name: '', type: '', url: '',}; - item_props.x = parseInt(el.style.left.replaceAll('px', '')) / 30; - item_props.y = -parseInt(el.style.top.replaceAll('px', '')) / 30; - item_props.url = el.firstElementChild.src; - const srcSpl = item_props.url.trim().split('/'); - item_props.name = srcSpl[6]; - item_props.type = srcSpl[8].slice(0, 1); - nearby_arr.push(item_props); - }); - const $wh_loot_container_items = $wh_loot_container.querySelector('#wh-loot-container-items'); - const $wh_loot_container_chests = $wh_loot_container.querySelector('#wh-loot-container-chests'); - let item_count = 0, chest_count = 0; - $wh_loot_container_items.innerHTML = ``; - $wh_loot_container_chests.innerHTML = ``; - nearby_arr.forEach(nearby_item => { - let path = '='; - if (nearby_item.x < player_position.x && nearby_item.y < player_position.y) path = '↙'; - else if (nearby_item.x < player_position.x && nearby_item.y === player_position.y) path = '←'; - else if (nearby_item.x < player_position.x && nearby_item.y > player_position.y) path = '↖'; - else if (nearby_item.x === player_position.x && nearby_item.y > player_position.y) path = '↑'; - else if (nearby_item.x > player_position.x && nearby_item.y > player_position.y) path = '↗'; - else if (nearby_item.x > player_position.x && nearby_item.y === player_position.y) path = '→'; - else if (nearby_item.x > player_position.x && nearby_item.y < player_position.y) path = '↘'; - else if (nearby_item.x === player_position.x && nearby_item.y < player_position.y) path = '↓'; - if (nearby_item.name === 'chests') { - chest_count++; - $wh_loot_container_chests.innerHTML += `${path}[${nearby_item.x},${nearby_item.y}] ${chestTypeDict[nearby_item.type]}${lootTypeDict[nearby_item.name]}` + $btn.onclick = e => { + e.target.innerText = e.target.innerText === '设置' ? '收起' : '设置'; + $($ex).toggleClass('wh-hide'); + e.target.blur(); + }; + $clear_btn.onclick = e => { + dropHist = {}; + $tbody.innerHTML = ''; + e.target.blur(); + }; + $blink.onchange = e => { + if (e.target.checked) { + alertSettings.blink = 'y'; + if ($wh_loot_container.querySelector('#wh-loot-item-count').innerText !== '(0)') { + $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite'; + } } else { - item_count++; - $wh_loot_container_items.innerHTML += `${path}[${nearby_item.x},${nearby_item.y}] ${nearby_item.name === 'keys' ? keyTypeDict[nearby_item.type] || '' : ''}${lootTypeDict[nearby_item.name] || nearby_item.name}` + alertSettings.blink = 'n'; + $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = ''; } - }); - $wh_loot_container.querySelector('#wh-loot-item-count').innerText = `(${item_count})`; - if (item_count === 0) { - $wh_loot_container_items.innerText = `暂无`; - $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = ''; - } else { - $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite'; - $audio.play().then(); - } - $wh_loot_container.querySelector('#wh-loot-chest-count').innerText = `(${chest_count})`; - if (chest_count === 0) $wh_loot_container_chests.innerText = `暂无`; + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + $sound.onchange = e => { + if (e.target.checked) { + alertSettings.sound = 'y'; + if ($wh_loot_container.querySelector('#wh-loot-item-count').innerText !== '(0)') { + soundLoopFlag = true; + } + } else { + alertSettings.sound = 'n'; + soundLoopFlag = false; + } + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + $chest.onchange = e => { + alertSettings.chest = e.target.checked ? 'y' : 'n'; + localStorage.setItem('wh-loot-setting', JSON.stringify(alertSettings)); + }; + const soundIntervalID = window.setInterval(() => { + if (soundLoopFlag) $audio.play().then(); + }, 1200); + ob.observe($ct_wrap, {childList: true, subtree: true}); } - }, 1200); + }); + const ob = new MutationObserver(() => { + const $ct_title = $ct_wrap.querySelector('.status-title'); + const $pos = $ct_wrap.querySelector('.map-title span[class^="position___"]') || $ct_wrap.querySelector('.status-title span[class^="position___"]'); + if (!$pos) return; + const $pos_spl = $pos.innerText.trim().split(','); + const player_position = {}; + player_position.x = parseInt($pos_spl[0]); + player_position.y = parseInt($pos_spl[1]); + const $wh_loot_container = $root.querySelector('#wh-loot-container'); + if (!$wh_loot_container) { + console.error('掉落助手未找到DOM容器'); + return; + } + const $blink = $wh_loot_container.querySelector('#wh-loot-setting-blink'); + const $sound = $wh_loot_container.querySelector('#wh-loot-setting-sound'); + const $chest = $wh_loot_container.querySelector('#wh-loot-setting-chest'); + const $tbody = $wh_loot_container.querySelector('tbody'); + const nearby_arr = []; + const items = $root.querySelectorAll('div.grid-layer div.items-layer div.ct-item'); + // 附近的所有物品 + items.forEach(el => { + const item_props = {x: 0, y: 0, name: '', type: '', url: '',}; + item_props.x = parseInt(el.style.left.replaceAll('px', '')) / 30; + item_props.y = -parseInt(el.style.top.replaceAll('px', '')) / 30; + item_props.url = el.firstElementChild.src; + const srcSpl = item_props.url.trim().split('/'); + item_props.name = srcSpl[6]; + item_props.type = srcSpl[8].slice(0, 1); + nearby_arr.push(item_props); + }); + const $wh_loot_container_items = $wh_loot_container.querySelector('#wh-loot-container-items'); + const $wh_loot_container_chests = $wh_loot_container.querySelector('#wh-loot-container-chests'); + let item_count = 0, chest_count = 0; + $wh_loot_container_items.innerHTML = ''; + $wh_loot_container_chests.innerHTML = ''; + nearby_arr.forEach(nearby_item => { + let path = '='; + if (nearby_item.x < player_position.x && nearby_item.y < player_position.y) path = '↙'; + else if (nearby_item.x < player_position.x && nearby_item.y === player_position.y) path = '←'; + else if (nearby_item.x < player_position.x && nearby_item.y > player_position.y) path = '↖'; + else if (nearby_item.x === player_position.x && nearby_item.y > player_position.y) path = '↑'; + else if (nearby_item.x > player_position.x && nearby_item.y > player_position.y) path = '↗'; + else if (nearby_item.x > player_position.x && nearby_item.y === player_position.y) path = '→'; + else if (nearby_item.x > player_position.x && nearby_item.y < player_position.y) path = '↘'; + else if (nearby_item.x === player_position.x && nearby_item.y < player_position.y) path = '↓'; + let item_name; + if (nearby_item.name === 'chests') { + chest_count++; + item_name = chestTypeDict[nearby_item.type] + lootTypeDict[nearby_item.name]; + $wh_loot_container_chests.innerHTML += `${path}[${nearby_item.x},${nearby_item.y}] ${item_name}` + } else { + item_count++; + item_name = (nearby_item.name === 'keys' ? keyTypeDict[nearby_item.type] || '' : '') + lootTypeDict[nearby_item.name] || nearby_item.name; + $wh_loot_container_items.innerHTML += `${path}[${nearby_item.x},${nearby_item.y}] ${item_name}` + } + // 确认地图坐标存在 + if ($ct_title) { + const hist_key = `[${nearby_item.x},${nearby_item.y}]"${$ct_title.firstChild.nodeValue.trim()}"${item_name}`; + const el = dropHist[hist_key]; + if (el) { + if (path === '=' && (nearby_item.name === 'keys' || nearby_item.name === 'gifts')) { + el.isPassed = true; + } + } else { + if (!(nearby_item.name === 'chests' && $chest.checked)) { + const now = new Date(); + dropHist[hist_key] = { + pos: `[${nearby_item.x},${nearby_item.y}]`, + map: $ct_title.firstChild.nodeValue.trim(), + last: `${now.getFullYear()}-${now.getMonth()}-${now.getDay()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`, + name: item_name, + id: Object.keys(dropHist).length, + }; + } + } + } + }); + $wh_loot_container.querySelector('#wh-loot-item-count').innerText = `(${item_count})`; + if (item_count === 0) { + $wh_loot_container_items.innerText = '暂无'; + $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = ''; + soundLoopFlag = false; + } else { + if ($blink.checked) $wh_loot_container.querySelector('#wh-loot-container-main').style.animation = 'lootFoundAlert 2s infinite'; + if ($sound.checked) soundLoopFlag = true; + } + $wh_loot_container.querySelector('#wh-loot-chest-count').innerText = `(${chest_count})`; + if (chest_count === 0) $wh_loot_container_chests.innerText = '暂无'; + const history = Object.keys(dropHist).map(key => dropHist[key]).sort((a, b) => a.id - b.id); + let table_html = ''; + history.forEach(e => { + table_html += `${e.pos}${e.map}${e.name}${e.last}${e.isPassed ? '已取得' : '不确定'}`; + }); + $tbody.innerHTML = table_html; + localStorage.setItem('wh-loot-store', JSON.stringify(dropHist)); + }); + getDOMOb.observe($root, {childList: true, subtree: true}); } }());