599 | ${items
600 | .map(
601 | (item) => `
602 |
606 |
631 |
${(item.count && `总需` + item.count) || `已满`}
636 |
639 |
641 |
进度:${item.has || 0
642 | }
643 |
644 | `,
645 | )
646 | .join('')}
647 |
648 | `;
649 | return html;
650 | }
651 | function boundLocatStrong(items) {
652 | for (const item of items) {
653 | try {
654 | const p = ~~new RegExp('"equipment_id":' + item.id + ',"count":([^,]+),')
655 | .exec(localStorage.itemList)[1]
656 | .replace(/^\"|\"$/g, '');
657 | item.information = `有` + p + ' 缺' + item.count;
658 | item.has = p;
659 | } catch (e) {
660 | item.count = 0;
661 | }
662 | }
663 | return items;
664 | }
665 | const changeItemCount = (e) => {
666 | // 快速完成
667 | const singleItem = () => {
668 | const $this = $(e.target);
669 | const count = $this[0].dataset.itemCount;
670 | if (!count) return;
671 | const ID = $this[0].dataset.item_id;
672 | const name = $this[0].dataset.item_name;
673 | if (confirm(`${name}的数量达到了${count}。页面刷新后自动计算`)) {
674 | itemCountChage(ID, count);
675 | GM.setValue(`mount`, `(()=>{ setTimeout(handleClickCalcBtn,2000) })()`);
676 | location.reload();
677 | }
678 | };
679 | const multiItem = () => {
680 | e.target.classList.toggle(
681 | `multiSelect-yes`,
682 | !(e.target.classList[e.target.classList.length - 1] == `multiSelect-yes`),
683 | );
684 | const cls = document.querySelector('.switch-multiSelectBtnState').classList;
685 | cls.toggle(
686 | `selected-completedBtn`,
687 | document.querySelectorAll('.multiSelect-yes').length != 0,
688 | );
689 | };
690 | (e.target.classList[e.target.classList.length - 1] == `helper--show-deleted-btn` &&
691 | !singleItem()) ||
692 | multiItem();
693 | };
694 | const multiItemChange = () => {
695 | const cell = document.querySelectorAll('.multiSelect-yes');
696 | if (
697 | cell.length &&
698 | confirm(`你目前选了${cell.length}个装备,开始修改,点击确定刷新页面自动计算`)
699 | ) {
700 | for (const dom of [...cell]) {
701 | itemCountChage(dom.dataset.itemId, dom.dataset.itemCount);
702 | }
703 | GM.setValue(`mount`, `(()=>{ setTimeout(handleClickCalcBtn,2000) })()`);
704 | location.reload();
705 | }
706 | };
707 | function itemCountChage(equipment_id, count) {
708 | const p = new RegExp('"equipment_id":' + equipment_id + ',"count":([^,]+)', 'g');
709 | const t = new RegExp(`\\d+`, 'g');
710 | localStorage.setItem(
711 | `itemList`,
712 | localStorage.itemList.replace(p, (match, p1) => {
713 | return match.substr(0, 30) + p1.replace(t, count); // match[match.length-1]match.length-3
714 | }),
715 | );
716 | }
717 | function uniqueItem(mapData) {
718 | const itmes = [];
719 | for (let i = 0; i < mapData.length; i++) {
720 | itmes.push(...mapData[i].items);
721 | }
722 | for (const t of itmes) {
723 | itmes[t.name] = (itmes[t.name] && itmes[t.name] + 1) || 1;
724 | }
725 | for (let i = 0; i < mapData.length; i++) {
726 | for (const item of mapData[i].items) {
727 | if (item.count > 0 && itmes[item.name] < 2) {
728 | mapData[i].IsuniqueItem = true;
729 | item.Unique = true;
730 | }
731 | }
732 | }
733 | }
734 | function sortColumn(e) {
735 | // -1>a,b 1>b,a//greedy
736 | const trList = [...e.target.closest('table').querySelectorAll(`tbody>tr`)];
737 | const greedy = () => {
738 | trList
739 | .sort((a) => {
740 | return (~~a.dataset.isUniqueItem && -1) || (~~a.dataset.isUniqueItem && 1) || 0;
741 | })
742 | .sort((a, b) => {
743 | return (
744 | (~~a.dataset.isUniqueItem &&
745 | ~~b.dataset.isUniqueItem &&
746 | ~~b.children[2].dataset.dropEffective - ~~a.children[2].dataset.dropEffective) ||
747 | 0
748 | );
749 | });
750 | return 1;
751 | };
752 | const dropEffective = () => {
753 | trList.sort((a, b) => {
754 | return ~~b.children[2].dataset.dropEffective - ~~a.children[2].dataset.dropEffective || 0;
755 | });
756 | return 0;
757 | };
758 | e.target.dataset.sortType = (!~~e.target.dataset.sortType && greedy()) || dropEffective(); // 切换状态保存
759 | const tbody = e.target.closest('table').querySelector('tbody');
760 | tbody.innerHTML = '';
761 | for (const t of trList) {
762 | tbody.appendChild(t);
763 | }
764 | }
765 | async function txtToClipboard() {
766 | const 数据条目 = '20'; // (条)
767 | const trList = [
768 | ...document.querySelectorAll(
769 | `table.table.table-bordered.mapDrop-table.helper>tbody tr:nth-child(-n+${数据条目})`,
770 | ),
771 | ];
772 | const howMuchSpace = (sum = 12, a = []) => {
773 | return sum < 1 && (sum = 0), (a.length = sum), a.fill(space, 0, sum).join(``);
774 | };
775 | const surroundedByaBar = (text, Rows = 6, horizontal = text.length + 8) => {
776 | Rows = (Rows & 1 && Rows) || Rows + 1; // only odd
777 | let str = enter;
778 | const blank = (horizontal - text.length) / 2;
779 | const half = Math.ceil(Rows / 2);
780 | for (let i = 1; i <= Rows; i++) {
781 | str += '|';
782 | for (let k = 0; k < horizontal; k++) {
783 | ((Rows === i || 1 === i) && (str += '-')) || i === half || (str += ' ');
784 | // 中间行k已到居中文本位置
785 | i === half &&
786 | ((blank <= k &&
787 | k < blank + text.length - 2 &&
788 | ((k = text.length + blank - 1), (str += text))) ||
789 | (str += ' '));
790 | }
791 | str += '|' + enter;
792 | }
793 | str.substr(0, str.length - 2);
794 | return str;
795 | };
796 | const space = ' ';
797 | const enter = '\r\n';
798 | let text = `\u200E ${howMuchSpace(3)}章节${howMuchSpace(6)}效率${howMuchSpace(
799 | 6,
800 | )}各效率${enter}`;
801 | for (const t of trList) {
802 | text += howMuchSpace(5);
803 | for (let b = 1; b < 9; b += 2) {
804 | const lent = t.childNodes[b].innerText.length;
805 | text += t.childNodes[b].innerText + howMuchSpace(10 - lent);
806 | }
807 | text = text.trim();
808 | text += enter;
809 | }
810 | // 设置dom移除监听 负责在生成链接后设置粘贴板
811 |
812 | vue.isLoading = true;
813 |
814 |
815 | const toClip=async () => {
816 | GM.setClipboard(
817 | `7天内打开链接,装备、角色数据完整保留,但将于${((d) => `${d.getMonth() + 1}月${d.getDate()}号`)(
818 | new Date(new Date().getTime() + 7 * 86400000),
819 | )}失效!${enter}请尽快打开链接:${surroundedByaBar(
820 | vue.exportNotice || 'network error,copy Text below',
821 | )}${enter}${howMuchSpace(4)}${enter}${howMuchSpace(
822 | 4,
823 | )}并点击储存队伍${enter}${enter}${enter}${howMuchSpace(
824 | 4,
825 | )}如果链接失效,可复制""(不含引号)内的字符"到文字汇入队伍的输入框${enter}"${vue.zipMyTeam()}"`,
826 | );
827 | tips('备份成功', '复制完成,请尽快拷贝到其他地方保存');
828 | };
829 | backupTream(toClip);
830 | }
831 | function backupTream(callback) {
832 | const uuid = vue.uuid();
833 | const armory = _.concat([vue.teamList], [vue.itemList]);
834 | let teamList = JSON.stringify(armory);
835 | teamList = vue.b64EncodeUnicode(teamList);
836 | const url = '/static/php/mysqlAdd.php';
837 | const data = {teamList: teamList, uuid: uuid};
838 | $.ajax({
839 | type: 'POST',
840 | url: url,
841 | data: data,
842 | success: function(data) {
843 | const res = data.toString().trim();
844 | if (res == '200') {
845 | vue.isLoading = false;
846 | vue.exportNotice = 'https://pcredivewiki.tw/Armory?s=' + uuid;
847 | callback();
848 | }
849 | },
850 | });
851 | }
852 |
853 | async function clpSetImage() {
854 | vue.isLoading = true;
855 | await sleep(200);
856 | const shareContent = document.querySelector(
857 | 'table.table.table-bordered.mapDrop-table.helper tbody',
858 | );
859 | const width = shareContent.offsetWidth;
860 | const height = shareContent.offsetHeight;
861 | const canvas = document.createElement('canvas');
862 | const scale = 1;
863 | canvas.width = width * scale;
864 | canvas.height = height * scale;
865 | const content = canvas.getContext('2d');
866 | content.scale(scale, scale);
867 | const opts = {
868 | scale: scale,
869 | width: width,
870 | height: height,
871 | canvas: canvas,
872 | allowTaint: true,
873 | width: width,
874 | heigth: height,
875 | y: window.pageYOffset + shareContent.getBoundingClientRect().top,
876 | }; // 局部元素带滚动时候 截图需要指定window的x,y 元素的getBoundingClientRect挺重要的
877 | html2canvas(shareContent, opts).then((canvas) => {
878 | const content = canvas.getContext('2d');
879 | content.mozImageSmoothingEnabled = false;
880 | content.webkitImageSmoothingEnabled = false;
881 | content.msImageSmoothingEnabled = false;
882 | content.ImgSmoothingEnabled = false;
883 | canvas.toBlob((blob) => {
884 | navigator.clipboard.write([new ClipboardItem({'image/png': blob})]);
885 | vue.isLoading = false;
886 | tips('图片复制成功', '复制完成,可直接复制到微信或qq。');
887 | });
888 | });
889 | }
890 | const deleteItem = (switchOn) => {
891 | switchMultBtnState(`ready`, switchOn);
892 | for (const i of $('table .p-2.text-center.mapDrop-item.mr-2>div.helper--calc-result-cell')) {
893 | (~~i.dataset.itemCount && switchOn && !!$(i).addClass('helper--show-deleted-btn')) ||
894 | $(i).removeClass('helper--show-deleted-btn');
895 | }
896 | !switchOn && multiSelectState();
897 | };
898 | const switchMultBtnState = (cls, switchOn = false) => {
899 | const state = ['ready', 'active', 'selected-completedBtn'];
900 | !switchOn &&
901 | cls == state[1] &&
902 | document.querySelector('a.singleSelect').classList.toggle(state[0], !switchOn);
903 | if (
904 | !switchOn &&
905 | cls == state[0] &&
906 | !state.forEach((i) => {
907 | document.querySelector('span.switch-multiSelectBtnState').classList.toggle(i, switchOn);
908 | document.querySelector('span.switch-handler').classList.toggle(i, switchOn);
909 | document.querySelector('a.singleSelect').classList.toggle(i, switchOn);
910 | })
911 | ) {
912 | return switchOn;
913 | }
914 | if (
915 | !switchOn &&
916 | cls == (state.shift() && state)[0] &&
917 | !state.forEach((i) => {
918 | document.querySelector('span.switch-multiSelectBtnState').classList.toggle(i, switchOn);
919 | document.querySelector('span.switch-handler').classList.toggle(i, switchOn);
920 | })
921 | ) {
922 | return switchOn;
923 | }
924 | document.querySelector('span.switch-multiSelectBtnState').classList.toggle(cls, switchOn);
925 | document.querySelector('span.switch-handler').classList.toggle(cls, switchOn);
926 | switchOn && cls == state[1] ?
927 | document.querySelector('a.singleSelect').classList.toggle(state[0], !switchOn) :
928 | document.querySelector('a.singleSelect').classList.toggle(state[0], switchOn);
929 | return switchOn;
930 | };
931 | const multiSelectState = (switchOn = false) => {
932 | for (const i of $('table .p-2.text-center.mapDrop-item.mr-2>div.helper--calc-result-cell')) {
933 | const c = ~~i.dataset.itemCount;
934 | c && i.classList.toggle('multiSelect-no', switchOn);
935 | c && !switchOn && i.classList.toggle('multiSelect-yes', switchOn);
936 | }
937 | };
938 | const toDetailsTheMap = (map) => {
939 | const genUri = () => {
940 | /* 日后地图更新
941 | 打开https://pcredivewiki.tw/Map 打开控制台按下Exc 在console中输入
942 | ` $$('.btn.btn-info.p-3')
943 | .map(el => (el.innerText.replace(/\d+\./,'')+'N'))
944 | .reduce((sum, value) =>{return sum .push(value),sum},[]).join('","')
945 | `
946 | 不含反引号 输出后模仿格式(注意前后引号!!)复制到下面maps中
947 | */
948 | console.log(`如果地图更新的话看我,点右边的超链接`);
949 | const levelsForMapUir = new Map();
950 | const maps = [
951 | '朱諾平原N',
952 | '帕拉斯高原N',
953 | '赫柏丘陵N',
954 | '維斯塔溪谷N',
955 | '刻瑞斯森林N',
956 | '佛洛拉湖畔N',
957 | '墨提斯大瀑布N',
958 | '伊麗絲樹海N',
959 | '弗麗嘉雪原N',
960 | '洛麗泰海岸N',
961 | '蓋奴亞荒漠N',
962 | '波諾尼亞砂丘N',
963 | '朵羅西亞溼地N',
964 | '尤金尼亞熱地N',
965 | '塔利亞火山N',
966 | '泰美斯銀嶺N',
967 | '菲得斯冰原N',
968 | '法艾頓草原N',
969 | '法艾頓草原‧南部N',
970 | '卡斯塔利亞樹林‧西部N',
971 | '卡斯塔利亞樹林‧東部N',
972 | '馬提爾德岩峰‧南部N',
973 | '馬提爾德岩峰‧北部N',
974 | '雷蒂烏斯群峰‧西麓N',
975 | '雷蒂烏斯群峰‧東麓N',
976 | '佩特羅大森林‧西部N',
977 | '佩特羅大森林‧東部N',
978 | '迪茲塔爾河蝕岸‧北部N',
979 | '迪茲塔爾河蝕岸‧南部N',
980 | '弗泰拉斷崖‧北部N',
981 | '弗泰拉斷崖‧南部N',
982 | '法斯奇亞森林‧南部N',
983 | '法斯奇亞森林‧東部N',
984 | '迪克斯提亞岩崖‧西壁N',
985 | '迪克斯提亞岩崖‧東壁N',
986 | '維娜湖畔道‧南部N',
987 | '維娜湖畔道‧北部N',
988 | '拉圖斯斷崖‧南部N',
989 | '拉圖斯斷崖‧北部N',
990 | 'スカプ山系・西麓N',
991 | 'スカプ山系・東麓N',
992 | 'ペクトス氷峰・西壁N',
993 | 'ペクトス氷峰・東壁N',
994 | ];
995 | let i = 1;
996 | for (const m of maps) {
997 | levelsForMapUir.set(i, `https://pcredivewiki.tw/Map/Detail/${encodeURI(m)}`);
998 | i += 1;
999 | }
1000 | return levelsForMapUir;
1001 | };
1002 | const mapIndex = map.split('-');
1003 | const p = mapIndex.shift() >> 0;
1004 | const d = genUri();
1005 | (d.has(p) && GM.setValue(`toMap`, mapIndex.shift() >> 0) && unsafeWindow.open(d.get(p))) ||
1006 | alert(
1007 | `地图可能更新了,请按下F12 ,再按下Esc,找到‘如果地图更新的话看我,点右边的超链接’字样,按提示修改脚本`,
1008 | );
1009 | };
1010 | function genTable(mapData) {
1011 | uniqueItem(mapData);
1012 | const bouns = getBouns(); //
1013 | const html = `
1014 |