XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat(webui): display Favorite items first (#2656)

Closes #2653 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2656 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>

024b806a
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

1 个文件 +153 -145
Modified static/webui/script.js +153 -145
@@ -662,166 +662,174 @@ function updateInventory() {
662 662 "KubrowPets"
663 663 ].forEach(category => {
664 664 document.getElementById(category + "-list").innerHTML = "";
665 data[category].forEach(item => {
666 const tr = document.createElement("tr");
667 tr.setAttribute("data-item-type", item.ItemType);
668 {
669 const td = document.createElement("td");
670 td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
671 if (item.ItemName) {
672 const pipeIndex = item.ItemName.indexOf("|");
673 if (pipeIndex != -1) {
674 td.textContent = item.ItemName.substr(1 + pipeIndex) + " " + td.textContent;
675 } else {
676 td.textContent = item.ItemName + " (" + td.textContent + ")";
665 data[category]
666 .sort((a, b) => (b.Favorite ? 1 : 0) - (a.Favorite ? 1 : 0))
667 .forEach(item => {
668 const tr = document.createElement("tr");
669 tr.setAttribute("data-item-type", item.ItemType);
670 {
671 const td = document.createElement("td");
672 td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
673 if (item.ItemName) {
674 const pipeIndex = item.ItemName.indexOf("|");
675 if (pipeIndex != -1) {
676 td.textContent = item.ItemName.substr(1 + pipeIndex) + " " + td.textContent;
677 } else {
678 td.textContent = item.ItemName + " (" + td.textContent + ")";
679 }
677 680 }
681 if (item.Details?.Name) {
682 td.textContent = item.Details.Name + " (" + td.textContent + ")";
683 }
684 if (item.ModularParts && item.ModularParts.length) {
685 td.textContent += " [";
686 item.ModularParts.forEach(part => {
687 td.textContent += " " + (itemMap[part]?.name ?? part) + ",";
688 });
689 td.textContent = td.textContent.slice(0, -1) + " ]";
690 }
691 tr.appendChild(td);
678 692 }
679 if (item.Details?.Name) {
680 td.textContent = item.Details.Name + " (" + td.textContent + ")";
681 }
682 if (item.ModularParts && item.ModularParts.length) {
683 td.textContent += " [";
684 item.ModularParts.forEach(part => {
685 td.textContent += " " + (itemMap[part]?.name ?? part) + ",";
686 });
687 td.textContent = td.textContent.slice(0, -1) + " ]";
688 }
689 tr.appendChild(td);
690 }
691 {
692 const td = document.createElement("td");
693 td.classList = "text-end text-nowrap";
693 {
694 const td = document.createElement("td");
695 td.classList = "text-end text-nowrap";
694 696
695 let maxXP = Math.pow(uniqueLevelCaps[item.ItemType] ?? 30, 2) * 1000;
696 if (
697 category != "Suits" &&
698 category != "SpaceSuits" &&
699 category != "Sentinels" &&
700 category != "Hoverboards" &&
701 category != "MechSuits" &&
702 category != "MoaPets" &&
703 category != "KubrowPets"
704 ) {
705 maxXP /= 2;
706 }
707 let anyExaltedMissingXP = false;
708 if (item.XP >= maxXP && item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) {
709 for (const exaltedType of itemMap[item.ItemType].exalted) {
710 const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
711 if (exaltedItem) {
712 const exaltedCap = itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
713 if (exaltedItem.XP < exaltedCap) {
714 anyExaltedMissingXP = true;
715 break;
697 let maxXP = Math.pow(uniqueLevelCaps[item.ItemType] ?? 30, 2) * 1000;
698 if (
699 category != "Suits" &&
700 category != "SpaceSuits" &&
701 category != "Sentinels" &&
702 category != "Hoverboards" &&
703 category != "MechSuits" &&
704 category != "MoaPets" &&
705 category != "KubrowPets"
706 ) {
707 maxXP /= 2;
708 }
709 let anyExaltedMissingXP = false;
710 if (item.XP >= maxXP && item.ItemType in itemMap && "exalted" in itemMap[item.ItemType]) {
711 for (const exaltedType of itemMap[item.ItemType].exalted) {
712 const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
713 if (exaltedItem) {
714 const exaltedCap =
715 itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
716 if (exaltedItem.XP < exaltedCap) {
717 anyExaltedMissingXP = true;
718 break;
719 }
716 720 }
717 721 }
718 722 }
719 }
720 if (item.XP < maxXP || anyExaltedMissingXP) {
721 const a = document.createElement("a");
722 a.href = "#";
723 a.onclick = function (event) {
724 event.preventDefault();
725 revalidateAuthz().then(() => {
726 const promises = [];
727 if (item.XP < maxXP) {
728 promises.push(addGearExp(category, item.ItemId.$oid, maxXP - item.XP));
729 }
730 if ("exalted" in itemMap[item.ItemType]) {
731 for (const exaltedType of itemMap[item.ItemType].exalted) {
732 const exaltedItem = data.SpecialItems.find(x => x.ItemType == exaltedType);
733 if (exaltedItem) {
734 const exaltedCap =
735 itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
736 if (exaltedItem.XP < exaltedCap) {
737 promises.push(
738 addGearExp(
739 "SpecialItems",
740 exaltedItem.ItemId.$oid,
741 exaltedCap - exaltedItem.XP
742 )
743 );
723 if (item.XP < maxXP || anyExaltedMissingXP) {
724 const a = document.createElement("a");
725 a.href = "#";
726 a.onclick = function (event) {
727 event.preventDefault();
728 revalidateAuthz().then(() => {
729 const promises = [];
730 if (item.XP < maxXP) {
731 promises.push(addGearExp(category, item.ItemId.$oid, maxXP - item.XP));
732 }
733 if ("exalted" in itemMap[item.ItemType]) {
734 for (const exaltedType of itemMap[item.ItemType].exalted) {
735 const exaltedItem = data.SpecialItems.find(
736 x => x.ItemType == exaltedType
737 );
738 if (exaltedItem) {
739 const exaltedCap =
740 itemMap[exaltedType]?.type == "weapons" ? 800_000 : 1_600_000;
741 if (exaltedItem.XP < exaltedCap) {
742 promises.push(
743 addGearExp(
744 "SpecialItems",
745 exaltedItem.ItemId.$oid,
746 exaltedCap - exaltedItem.XP
747 )
748 );
749 }
744 750 }
745 751 }
746 752 }
747 }
748 Promise.all(promises).then(() => {
749 updateInventory();
753 Promise.all(promises).then(() => {
754 updateInventory();
755 });
750 756 });
751 });
752 };
753 a.title = loc("code_maxRank");
754 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
755 td.appendChild(a);
756 }
757 };
758 a.title = loc("code_maxRank");
759 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z"/></svg>`;
760 td.appendChild(a);
761 }
757 762
758 if (
759 ["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(category) ||
760 modularWeapons.includes(item.ItemType)
761 ) {
762 const a = document.createElement("a");
763 a.href = "/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid;
764 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M278.5 215.6L23 471c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l57-57h68c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v55.3L253.6 195.8c6.2-6.2 16.4-6.2 22.6 0c5.4 5.4 6.1 13.6 2.2 19.8z"/></svg>`;
765 td.appendChild(a);
766 }
763 if (
764 ["Suits", "LongGuns", "Pistols", "Melee", "SpaceGuns", "SpaceMelee"].includes(
765 category
766 ) ||
767 modularWeapons.includes(item.ItemType)
768 ) {
769 const a = document.createElement("a");
770 a.href =
771 "/webui/detailedView?productCategory=" + category + "&itemId=" + item.ItemId.$oid;
772 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M278.5 215.6L23 471c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l57-57h68c49.7 0 97.9-14.4 139-41c11.1-7.2 5.5-23-7.8-23c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l81-24.3c2.5-.8 4.8-2.1 6.7-4l22.4-22.4c10.1-10.1 2.9-27.3-11.3-27.3l-32.2 0c-5.1 0-9.2-4.1-9.2-9.2c0-4.1 2.7-7.6 6.5-8.8l112-33.6c4-1.2 7.4-3.9 9.3-7.7C506.4 207.6 512 184.1 512 160c0-41-16.3-80.3-45.3-109.3l-5.5-5.5C432.3 16.3 393 0 352 0s-80.3 16.3-109.3 45.3L139 149C91 197 64 262.1 64 330v55.3L253.6 195.8c6.2-6.2 16.4-6.2 22.6 0c5.4 5.4 6.1 13.6 2.2 19.8z"/></svg>`;
773 td.appendChild(a);
774 }
767 775
768 if (!(item.Features & 8) && modularWeapons.includes(item.ItemType)) {
769 const a = document.createElement("a");
770 a.href = "#";
771 a.onclick = function (event) {
772 event.preventDefault();
773 gildEquipment(category, item.ItemId.$oid);
774 };
775 a.title = loc("code_gild");
776 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"/></svg>`;
777 td.appendChild(a);
778 }
779 if (category == "KubrowPets") {
780 const a = document.createElement("a");
781 a.href = "#";
782 a.onclick = function (event) {
783 event.preventDefault();
784 maturePet(item.ItemId.$oid, !item.Details.IsPuppy);
785 };
786 if (item.Details.IsPuppy) {
787 a.title = loc("code_mature");
788 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M112 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm40 304l0 128c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-223.1L59.4 304.5c-9.1 15.1-28.8 20-43.9 10.9s-20-28.8-10.9-43.9l58.3-97c17.4-28.9 48.6-46.6 82.3-46.6l29.7 0c33.7 0 64.9 17.7 82.3 46.6l58.3 97c9.1 15.1 4.2 34.8-10.9 43.9s-34.8 4.2-43.9-10.9L232 256.9 232 480c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-128-16 0z"/></svg>`;
789 } else {
790 a.title = loc("code_unmature");
791 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M256 64A64 64 0 1 0 128 64a64 64 0 1 0 128 0zM152.9 169.3c-23.7-8.4-44.5-24.3-58.8-45.8L74.6 94.2C64.8 79.5 45 75.6 30.2 85.4s-18.7 29.7-8.9 44.4L40.9 159c18.1 27.1 42.8 48.4 71.1 62.4L112 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96 32 0 0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-258.4c29.1-14.2 54.4-36.2 72.7-64.2l18.2-27.9c9.6-14.8 5.4-34.6-9.4-44.3s-34.6-5.5-44.3 9.4L291 122.4c-21.8 33.4-58.9 53.6-98.8 53.6c-12.6 0-24.9-2-36.6-5.8c-.9-.3-1.8-.7-2.7-.9z"/></svg>`;
776 if (!(item.Features & 8) && modularWeapons.includes(item.ItemType)) {
777 const a = document.createElement("a");
778 a.href = "#";
779 a.onclick = function (event) {
780 event.preventDefault();
781 gildEquipment(category, item.ItemId.$oid);
782 };
783 a.title = loc("code_gild");
784 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M316.9 18C311.6 7 300.4 0 288.1 0s-23.4 7-28.8 18L195 150.3 51.4 171.5c-12 1.8-22 10.2-25.7 21.7s-.7 24.2 7.9 32.7L137.8 329 113.2 474.7c-2 12 3 24.2 12.9 31.3s23 8 33.8 2.3l128.3-68.5 128.3 68.5c10.8 5.7 23.9 4.9 33.8-2.3s14.9-19.3 12.9-31.3L438.5 329 542.7 225.9c8.6-8.5 11.7-21.2 7.9-32.7s-13.7-19.9-25.7-21.7L381.2 150.3 316.9 18z"/></svg>`;
785 td.appendChild(a);
792 786 }
793 td.appendChild(a);
794 }
795 {
796 const a = document.createElement("a");
797 a.href = "#";
798 a.onclick = function (event) {
799 event.preventDefault();
800 const name = prompt(loc("code_renamePrompt"));
801 if (name !== null) {
802 renameGear(category, item.ItemId.$oid, name);
787 if (category == "KubrowPets") {
788 const a = document.createElement("a");
789 a.href = "#";
790 a.onclick = function (event) {
791 event.preventDefault();
792 maturePet(item.ItemId.$oid, !item.Details.IsPuppy);
793 };
794 if (item.Details.IsPuppy) {
795 a.title = loc("code_mature");
796 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M112 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm40 304l0 128c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-223.1L59.4 304.5c-9.1 15.1-28.8 20-43.9 10.9s-20-28.8-10.9-43.9l58.3-97c17.4-28.9 48.6-46.6 82.3-46.6l29.7 0c33.7 0 64.9 17.7 82.3 46.6l58.3 97c9.1 15.1 4.2 34.8-10.9 43.9s-34.8 4.2-43.9-10.9L232 256.9 232 480c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-128-16 0z"/></svg>`;
797 } else {
798 a.title = loc("code_unmature");
799 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--!Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d="M256 64A64 64 0 1 0 128 64a64 64 0 1 0 128 0zM152.9 169.3c-23.7-8.4-44.5-24.3-58.8-45.8L74.6 94.2C64.8 79.5 45 75.6 30.2 85.4s-18.7 29.7-8.9 44.4L40.9 159c18.1 27.1 42.8 48.4 71.1 62.4L112 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96 32 0 0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-258.4c29.1-14.2 54.4-36.2 72.7-64.2l18.2-27.9c9.6-14.8 5.4-34.6-9.4-44.3s-34.6-5.5-44.3 9.4L291 122.4c-21.8 33.4-58.9 53.6-98.8 53.6c-12.6 0-24.9-2-36.6-5.8c-.9-.3-1.8-.7-2.7-.9z"/></svg>`;
803 800 }
804 };
805 a.title = loc("code_rename");
806 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 80V229.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0L418.7 317.3c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7H48C21.5 32 0 53.5 0 80zm112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>`;
807 td.appendChild(a);
808 }
809 {
810 const a = document.createElement("a");
811 a.href = "#";
812 a.onclick = function (event) {
813 event.preventDefault();
814 document.getElementById(category + "-list").removeChild(tr);
815 disposeOfGear(category, item.ItemId.$oid);
816 };
817 a.title = loc("code_remove");
818 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
819 td.appendChild(a);
801 td.appendChild(a);
802 }
803 {
804 const a = document.createElement("a");
805 a.href = "#";
806 a.onclick = function (event) {
807 event.preventDefault();
808 const name = prompt(loc("code_renamePrompt"));
809 if (name !== null) {
810 renameGear(category, item.ItemId.$oid, name);
811 }
812 };
813 a.title = loc("code_rename");
814 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M0 80V229.5c0 17 6.7 33.3 18.7 45.3l176 176c25 25 65.5 25 90.5 0L418.7 317.3c25-25 25-65.5 0-90.5l-176-176c-12-12-28.3-18.7-45.3-18.7H48C21.5 32 0 53.5 0 80zm112 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>`;
815 td.appendChild(a);
816 }
817 {
818 const a = document.createElement("a");
819 a.href = "#";
820 a.onclick = function (event) {
821 event.preventDefault();
822 document.getElementById(category + "-list").removeChild(tr);
823 disposeOfGear(category, item.ItemId.$oid);
824 };
825 a.title = loc("code_remove");
826 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
827 td.appendChild(a);
828 }
829 tr.appendChild(td);
820 830 }
821 tr.appendChild(td);
822 }
823 document.getElementById(category + "-list").appendChild(tr);
824 });
831 document.getElementById(category + "-list").appendChild(tr);
832 });
825 833 });
826 834
827 835 document.getElementById("EvolutionProgress-list").innerHTML = "";