cemu_graphic_packs/docs/assets/javascript/index.js

172 lines
8.2 KiB
JavaScript

// Download latest version
fetch("https://api.github.com/repos/ActualMandM/cemu_graphic_packs/releases/latest").then(fetchRes => fetchRes.json()).then(fetchJson => {
console.debug("Fetched releases from github...");
document.getElementById("primary_download").href = fetchJson.assets[0].browser_download_url;
return;
}).catch(fetchErr => {
console.error("Seems like something isn't working...", fetchErr);
});
// Search Supported Games
var supportedGames = undefined;
var supportedGamesSearchSet = undefined;
var supportedGamesSearchSetHalfTitles = {};
const altNames = {
"botw": "The Legend of Zelda: Breath of the Wild",
"hw": "Hyrule Warriors",
"mc": "Minecraft",
"slw": "Sonic Lost World",
"smm": "Super Mario Maker",
"mk8": "Mario Kart 8",
"tphd": "The Legend of Zelda: Twilight Princess HD",
"wwhd": "The Legend of Zelda: The Wind Waker HD",
// easter eggs
"breath of the dicknut": "The Legend of Zelda: Breath of the Wild",
"f-zero": "FAST Racing NEO",
"m&m": "Sonic",
"mimi": "Sonic",
"best game": "Meme Run"
};
async function searchSupportedGames(searchString) {
document.getElementById("supported-games-search").classList.add("loading");
document.getElementById("supported-games-search-results").innerHTML = "";
if (!supportedGames) {
supportedGames = true;
await fetch((window.location.origin+window.location.pathname)+"/supported_titles.json", {cache: "no-store"}).then(fetchRes => fetchRes.json()).then(fetchJson => {
console.debug("Fetched supported titles from '/supported_titles.json'.");
supportedGames = fetchJson;
supportedGamesSearchSet = FuzzySet([], false, 2, 3);
for (supportedGame in supportedGames) {
supportedGamesSearchSet.add(supportedGame);
}
return;
}).catch(fetchErr => {
console.error("Seems like something bad happened!", fetchErr);
});
}
if (supportedGames === true) return; // Fix race errors with input
let resultsHintSearch = [];
if (Object.keys(altNames).includes(searchString.toLowerCase())) searchString = altNames[searchString.toLowerCase()];
if (searchString.toLowerCase() == "digital foundry") {
document.title = "Home - CEMU Hacks";
document.getElementsByClassName("display-4")[0].innerText="CEMU Hacks";
document.getElementsByClassName("lead")[0].innerText = "Get your online CEMU hax here!!";
}
if (searchString != "*") resultsHintSearch = supportedGamesSearchSet.get(searchString);
else {
for (supportedGame in supportedGames) {
resultsHintSearch.push([0, supportedGame]);
}
}
if (resultsHintSearch != undefined && resultsHintSearch != null) {
for (let i=0; i<resultsHintSearch.length; i++) {
let currResult = resultsHintSearch[i][1];
let searchResultEntry = document.createElement("li");
let gameTitleText = document.createTextNode(currResult);
let versionBadge = document.createElement("span");
let versionBadgeText;
if (supportedGames[currResult].version == 4) versionBadgeText = document.createTextNode("Fully supports OpenGL and Vulkan");
else if (supportedGames[currResult].version == 3) versionBadgeText = document.createTextNode("Fully supports OpenGL");
else if (supportedGames[currResult].version == 2) versionBadgeText = document.createTextNode("Only supported on 1.8.0 through 1.13.2");
else versionBadgeText = document.createTextNode("No resolution pack yet :(");
let resolutionBadge = document.createElement("span");
let resolutionBadgeText = document.createTextNode(supportedGames[currResult].nativeRes+"p");
searchResultEntry.className = "list-group-item list-group-item-action";
versionBadge.className = "badge badge-light ml-2";
resolutionBadge.className = "badge badge-pill badge-primary float-right";
searchResultEntry.onclick=searchInfoModalTrigger
if (supportedGames[currResult].version === 4) {
searchResultEntry.classList.add("list-group-item-danger");
}
else if (supportedGames[currResult].version === 3) {
searchResultEntry.classList.add("list-group-item-primary");
}
else {
searchResultEntry.classList.add("list-group-item-secondary");
}
searchResultEntry.appendChild(gameTitleText);
versionBadge.appendChild(versionBadgeText);
searchResultEntry.appendChild(versionBadge);
resolutionBadge.appendChild(resolutionBadgeText);
searchResultEntry.appendChild(resolutionBadge);
document.getElementById("supported-games-search-results").appendChild(searchResultEntry);
}
}
document.getElementById("supported-games-search").classList.remove("loading");
}
async function searchInfoModalTrigger(clickedElem) {
$("#searchInfoModal").modal(); // Initiate animation
let clickedGame = clickedElem.target.firstChild.textContent;
// Reset Compat Information
document.getElementById("modal-preview-image").src="assets/images/no-cover-available.png";
document.getElementById("information-box").className="compat-status-loading";
document.getElementById("gameTitle").innerText=clickedGame;
document.getElementById("compatWikiButton").href=supportedGames[clickedGame].compatLink;
document.getElementById("nativeResolution").textContent=supportedGames[clickedGame].nativeRes;
if (supportedGames[clickedGame].version == 4) document.getElementById("information-box").classList.add("version-4-supported");
else if (supportedGames[clickedGame].version == 3) document.getElementById("information-box").classList.add("version-3-supported");
else if (supportedGames[clickedGame].version == 2) document.getElementById("information-box").classList.add("version-2-supported");
document.getElementById("information-box").classList.add(supportedGames[clickedGame].hasUltrawide ? "ultrawide-supported" : "ultrawide-unsupported");
if (supportedGames[clickedGame].hasOwnProperty("compatLink")) {
await fetch(`https://cors-anywhere.herokuapp.com/http://wiki.cemu.info/api.php?action=parse&page=${supportedGames[clickedGame].compatLink.split("http://compat.cemu.info/wiki/")[1]}&redirects=true&prop=parsetree&format=json`).then(fetchRes => fetchRes.json()).then(fetchJson => {
console.debug(`Fetched ${clickedGame}'s(=${supportedGames[clickedGame].compatLink.split("http://compat.cemu.info/wiki/")[1]}) compat wiki`, fetchJson);
let compatTemplates = new DOMParser().parseFromString(fetchJson.parse.parsetree["*"], "application/xml").documentElement.getElementsByTagName("template");
let compatJson = [];
for (let i=0; i<compatTemplates.length; i++) {
if (compatTemplates[i].firstChild.textContent.includes("Infobox VG")) {
let infoboxParts = compatTemplates[i].getElementsByTagName("name");
for (let j=0; j<infoboxParts.length; j++) {
compatJson[infoboxParts[j].textContent.trim()] = infoboxParts[j].nextElementSibling.textContent.trim();
}
break;
}
}
console.debug("Parsed compat info...", compatJson)
if (!compatJson.image.includes("*.jpg")) {
document.getElementById("modal-preview-image").src="https://images.weserv.nl/?url=compat.cemu.info/wiki/Special:Redirect/file/"+compatJson.image.split("File:")[1].split("|")[0];
}
document.getElementById("information-box").classList.remove("compat-status-loading");
document.getElementById("information-box").classList.add("compat-status-"+compatJson.rating.toLowerCase());
});
}
$("#searchInfoModal").modal();
}
function viewAllGames() {
searchSupportedGames("*");
document.getElementById("viewAllGames").onclick=hideAllGames;
document.getElementById("viewAllGames").innerText="Hide the game list...";
}
function hideAllGames() {
searchSupportedGames("");
document.getElementById("viewAllGames").onclick=viewAllGames;
document.getElementById("viewAllGames").innerText="Or view a list with all supported games...";
}
// searchSupportedGames(document.querySelector("#supported-games-search input.form-control").value); // If a user loads the page, execute the search inmediately. Initially meant so that if you'd return to the page and still had a search term, it would look correct.
document.querySelector("#supported-games-search input.form-control").value = ""; // Don't fetch stuff automatically when the user doesn't want to search. Considered better since it's an optional feature.
timeago().render(document.querySelectorAll('.commit-time'));
document.getElementById("viewAllGames").onclick=viewAllGames;