diff --git a/gctGenerator.js b/gctGenerator.js
index 029e0c1..f93941e 100644
--- a/gctGenerator.js
+++ b/gctGenerator.js
@@ -1,457 +1,457 @@
-if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
- HTMLElement.prototype.click = function() {
- var evt = this.ownerDocument.createEvent("MouseEvents");
- evt.initMouseEvent("click", true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
- this.dispatchEvent(evt);
- }
-}
-
-document.getElementById("checklist").addEventListener("click", function(ev) {
- if (ev.target && ev.target.nodeName == "LI") {
- ev.target.classList.toggle("checked");
- }
-});
-
-function parseXML(name) {
- var xml = new XMLHttpRequest();
- var file = "codes/" + name + ".xml";
- xml.onreadystatechange = function() {
- if (this.status == 200 && this.readyState == 4) {
- var xmlData = xml.responseXML;
- xmlData = (new DOMParser()).parseFromString(xml.responseText, "text/xml");
- xmlData = xmlData.getElementsByTagName("code");
-
- var i = 0;
- for (; i < xmlData.length; i++) {
- var li = document.createElement("li");
- var desc = xmlData[i].getElementsByTagName("title")[0].textContent;
- var t = document.createTextNode(desc);
- li.appendChild(t);
- li.setAttribute("data-codename", btoa(xmlData[i].getElementsByTagName("title")[0].textContent));
- li.setAttribute("data-codeauthor", btoa(xmlData[i].getElementsByTagName("author")[0].textContent));
- li.setAttribute("data-codedesc", btoa(xmlData[i].getElementsByTagName("description")[0].textContent));
- li.setAttribute("data-codeversion", btoa(xmlData[i].getElementsByTagName("version")[0].textContent));
- li.setAttribute("data-codedate", btoa(xmlData[i].getElementsByTagName("date")[0].textContent));
- li.setAttribute("data-codesrc", btoa(xmlData[i].getElementsByTagName("source")[0].textContent.replace(/[\s\n\r\t]+/gm, "")));
- li.setAttribute("onmouseover", "updateDescription(this)");
- document.getElementById("checklist").appendChild(li);
- }
-
- var buttons = document.getElementsByTagName("button");
- for (var i = 0; i < buttons.length; i++) buttons[i].disabled = false;
-
- document.getElementById("gameversion").disabled = false;
- }
- };
-
- xml.open("GET", file);
- xml.send();
-}
-
-function updateFastCode(name) {
- var xml = new XMLHttpRequest();
- var file = "codes/fast/" + name + ".json";
- xml.onreadystatechange = function() {
- if (this.status == 200 && this.readyState == 4) {
- document.getElementById("route_levels").setAttribute("data-json", btoa(xml.responseText));
- }
- }
- xml.open("GET",file);
- xml.send();
-}
-
-function downloadFile(data, filename) {
-
- var file = new Blob([data], {
- type: "application/octet-stream"
- });
-
- if (window.navigator.msSaveOrOpenBlob) window.navigator.msSaveOrOpenBlob(file, filename.replace("GMSJ0A","GMSJ01"));
- else {
- var a = document.createElement("a"),
- url = window.URL.createObjectURL(file);
- a.href = url;
- a.download = filename.replace("GMSJ0A","GMSJ01");
- a.click();
- setTimeout(function() { window.URL.revokeObjectURL(url); }, 500);
- }
-}
-
-function generateGCT() {
-
- if (document.getElementById("gameversion").value === "Choose Version") {
- alert("Select the game version!");
- return;
- }
- var data = "00D0C0DE00D0C0DE";
- var codeList = document.getElementById("checklist").getElementsByTagName("li");
- var valueSelected = false;
- for (var i = 0; i < codeList.length; i++) {
- if (codeList[i].className === "checked") {
- data += atob(codeList[i].getAttribute("data-codesrc"));
- valueSelected = true;
- }
- }
-
- var fastcode = getFastCode();
-
- if(fastcode !== false) {
- data += fastcode;
- valueSelected = true;
- }
-
- if (valueSelected) {
- data += "FF00000000000000";
- var rawData = new Uint8Array(data.length / 2);
-
- for (var x = 0; x < rawData.length; x++) {
- rawData[x] = parseInt(data.substr(x * 2, 2), 16);
- }
-
- downloadFile(rawData, document.getElementById("gameversion").value + ".gct");
- } else {
- alert("No cheat(s) selected!");
- }
-}
-
-function generateTXT() {
-
- var dolphin = (document.getElementById("downloadformat").value === "ini");
-
- if (document.getElementById("gameversion").value === "Choose Version") {
- alert("Select the game version!");
- return;
- }
- if (dolphin) var data = "Paste the following on top of your games .ini file:\r\n[Gecko]";
- else var data = document.getElementById("gameversion").value.replace("GMSJ0A","GMSJ01") + "\r\nSuper Mario Sunshine";
- var codeList = document.getElementById("checklist").getElementsByTagName("li");
- var valueSelected = false;
- for (var i = 0; i < codeList.length; i++) {
- if (codeList[i].className === "checked") {
- data += "\r\n";
- if (dolphin) data += "$";
- else data += "\r\n";
- data += atob(codeList[i].getAttribute("data-codename")) + " (" + atob(codeList[i].getAttribute("data-codedate")) + ") [" + atob(codeList[i].getAttribute("data-codeauthor")) + "]\r\n";
- data += (atob(codeList[i].getAttribute("data-codesrc")).match(/.{8}/g).join(" ")).replace(/(.{17})./g, "$1\r\n");
- valueSelected = true;
- }
- }
-
- var fastcode = getFastCode();
-
- if(fastcode !== false) {
- data += "\r\n";
- if (dolphin) data += "$";
- else data += "\r\n";
- data += "Stage list loader [Noki Doki]\r\n";
- data += (fastcode.match(/.{8}/g).join(" ")).replace(/(.{17})./g, "$1\r\n");
- valueSelected = true;
- }
-
- if (valueSelected)
- downloadFile(data, document.getElementById("gameversion").value + ".txt");
- else alert("No cheat(s) selected!");
-}
-
-function downloadCodes() {
- if (document.getElementById("downloadformat").value === "gct") generateGCT();
- else generateTXT();
-}
-
-function updateCodelist() {
- resetDescription();
- document.getElementById("gameversion").disabled = true;
- var buttons = document.getElementsByTagName("button");
- for (var i = 0; i < buttons.length; i++) buttons[i].disabled = true;
- document.getElementById("checklist").innerHTML = "";
- var gameVersion = document.getElementById("gameversion").value;
- parseXML(gameVersion);
- updateFastCode(gameVersion);
- document.getElementById("left").style.visibility = "visible";
- while (document.getElementsByClassName("initialhidden").length > 0) {
- document.getElementsByClassName("initialhidden")[0].classList.remove("initialhidden");
- }
-}
-
-function updateDescription(s) {
- document.getElementById("descriptionbox").innerHTML = "
" +
- atob(s.getAttribute("data-codename")) + " Author(s): " +
- atob(s.getAttribute("data-codeauthor")) + "
Version: " +
- atob(s.getAttribute("data-codeversion")) + " (" +
- atob(s.getAttribute("data-codedate")) + ")
" + "Description: " +
- atob(s.getAttribute("data-codedesc")) + "
";
-}
-
-function updateUIDescription(s) {
- if (s.id === "route_notext")
- document.getElementById("descriptionbox").innerHTML = "Remove Dialogue Replaces all Dialogue with \"!!!\". 'Always' and 'Not in Pianta 5' will override the dialogue skip from the DPad Functions.
";
- else if (s.id === "route_nofmvs")
- document.getElementById("descriptionbox").innerHTML = "Skippable Cutscenes Makes FMVs Skippable. 'Always' has the same effect as the 'FMV Skips' code. Also, having 'FMV Skips' enabled will override 'Not in Pinna 1' - so don't use both simultaneously.
";
- else if (s.id === "route_order")
- document.getElementById("descriptionbox").innerHTML = "Level Order The order in which levels are loaded:
As specified The code loads levels in the order of the list.
Random, no duplicates The code picks levels at random, excluding levels that you’ve finished already.
Fully random The code picks levels at random, even levels that you’ve finished already.
";
- else if (s.id === "route_ending")
- document.getElementById("descriptionbox").innerHTML = "Route Ending What to do after you complete the final level on the list. This has no effect if the level order is set to Fully random.
";
- else if (s.id === "downloadformat")
- document.getElementById("descriptionbox").innerHTML = "File Format You can choose between 3 file formats:
GCT Download a GCT file for use with Nintendont
Dolphin INI Download a textfile containing the formatted codes for use with Dolphin. Copy the contents of the file on top of your games .ini file.
You can open the .ini file by right clicking the game in Dolphin. In the context menu select 'Properties' and then 'Edit configuration'.
Cheat Manager TXT Download the cheats in a textfile formatted for use with the Gecko Cheat Manager . Place the txt file in SD:/txtcodes/.
A zip archive containing pregenerated txt files with all available codes on this site can be downloaded here .
";
- else if (s.id === "stageloader")
- document.getElementById("descriptionbox").innerHTML = "Stage Loader Select yes if you want to use a custom stage loader, which automatically loads the levels you choose, similiar to 'Fast Any%'.
";
-}
-
-function resetDescription() {
- document.getElementById("descriptionbox").innerHTML = "
Choose your codes from the list... ";
-}
-
-function updateChangelog() {
- document.getElementById("gameversion").style.visibility = "visible";
- var xml = new XMLHttpRequest();
- var file = "changelog.xml";
- xml.onload = function() {
- if (this.status == 200 && this.responseXML != null) {
- var changelogData = xml.responseXML;
- changelogData = (new DOMParser()).parseFromString(xml.responseText, "text/xml");
- changelogData = changelogData.getElementsByTagName("update");
-
- var recentchanges = "";
- try {
- document.getElementById("lastupdate").innerHTML = "Last Updated: " + changelogData[0].getElementsByTagName("date")[0].textContent;
-
- for (var i = 0; i < changelogData.length && i < 3;i++) {
- recentchanges += "" + changelogData[i].getElementsByTagName("date")[0].textContent + ": ";
-
- var changes = changelogData[i].getElementsByTagName("change");
- for (var k = 0; k < changes.length && (i+k-1) < 3; k++) {
- recentchanges += changes[k].getElementsByTagName("head")[0].textContent + " ";
- }
-
- i += k-1;
-
- recentchanges += "
";
- }
- } catch (err) {}
-
- document.getElementById("changelog").innerHTML += recentchanges + "more ...
";
- };
- }
-
- xml.open("GET", file);
- xml.send();
-}
-
-/****************************
-*
-* Fastcode, https://github.com/QbeRoot/fastcodes/blob/master/script.js
-*
-****************************/
-
-const levels = document.querySelector("#route_levels");
-const template = levels.lastElementChild;
-template.ondragstart = function() { return false; };
-
-function appendLevel(code) {
- const clone = template.cloneNode(true);
- clone.draggable = true;
- selSetHandlers(clone);
- clone.querySelector("select").value = code;
- levels.insertBefore(clone, template);
-}
-
-function clearLevels() {
- while (levels.firstChild !== template) levels.removeChild(levels.firstChild);
-}
-
-template.addEventListener("change", function () {
- appendLevel(template.querySelector("select").value);
- template.querySelector("select").value = "0F00";
-})
-
-levels.addEventListener("change", function (ev) {
- if (ev.target.value === "0F00" && ev.target.parentNode !== template) levels.removeChild(ev.target.parentNode);
-})
-
-levels.addEventListener("click", function (ev) {
- if (ev.target.tagName.toUpperCase() === "BUTTON") levels.removeChild(ev.target.parentNode);
-})
-
-document.querySelector("#route_ending").disabled = document.querySelector("#route_order").value === "random";
-document.querySelector("#route_order").addEventListener("change", function (ev) {
- document.querySelector("#route_ending").disabled = ev.currentTarget.value === "random";
-})
-
-document.querySelector("#route_presets").addEventListener("change", function (ev) {
- if (levels.childElementCount <= 1 || confirm("Loading a preset will erase your current list. Continue?")) {
- clearLevels();
- const preset = ev.currentTarget.value.split(";")[0];
- const ending = ev.currentTarget.value.split(";")[1];
- for (let i = 0; i <= preset.length - 4; i += 4) appendLevel(preset.substr(i, 4));
- if (ending) document.querySelector("#route_ending").value = ending
- }
- ev.currentTarget.value = "";
-})
-
-document.querySelector("#route_clear").addEventListener("click", function () {
- confirm("Do you really want to clear the list?") && clearLevels();
-})
-
-{
- let selection;
-
- function selDragStart(e) {
- selection = this;
- e.dataTransfer.effectAllowed = "move";
- e.dataTransfer.setData("html", this.querySelector("select").value);
-
- this.classList.add("dragelement");
- }
-
- function selDragOver(e) {
- if (e.preventDefault) {
- e.preventDefault();
- }
-
- this.classList.add("dragover");
- e.dataTransfer.dropEffect = "move";
-
- return false;
- }
-
- function selDragLeave() {
- this.classList.remove("dragover");
- }
-
- function selDragDrop(e) {
- if (e.stopPropagation) {
- e.stopPropagation();
- }
-
- if (selection != this) {
- this.parentNode.removeChild(selection);
- this.insertAdjacentHTML("afterend", template.outerHTML);
- this.nextSibling.querySelector("select").value = e.dataTransfer.getData('html');
- this.nextSibling.draggable = true;
- selSetHandlers(this.nextSibling);
- }
-
- this.classList.remove("dragover");
- return false;
- }
-
- function selDragEnd() {
- this.classList.remove("dragelement");
- }
-
- function selSetHandlers(elem) {
- elem.addEventListener('dragstart', selDragStart, false);
- elem.addEventListener('dragover', selDragOver, false);
- elem.addEventListener('dragleave', selDragLeave, false);
- elem.addEventListener('drop', selDragDrop, false);
- elem.addEventListener('dragend', selDragEnd, false);
- }
-}
-
-//Interface
-function getFastCode() {
- var levelCodes = [];
- for (var c = levels.getElementsByTagName("select"), i = 0; i < c.length; i++) {
- levelCodes.push(c[i].value);
- }
- levelCodes.pop();
-
- if (!(document.getElementById("usefastcode").checked) || levelCodes.length <= 1) return false;
-
- let game = JSON.parse(atob(document.getElementById("route_levels").getAttribute("data-json")));
- const order = document.getElementById("route_order").value;
- const ending = document.getElementById("route_ending").value;
- const branchBase = 0x18 + 0x24 * (order !== 'list');
- const asm = [];
- asm.push("48" + ("00000" + (Math.ceil(levelCodes.length / 2) + 1 << 2 | 1).toString(16).toUpperCase()).slice(-6)); // bl code
- for (let i = levelCodes.length - 1; i >= 0; i -= 2) {
- asm.push(levelCodes[i] + (levelCodes[i - 1] || "0000"));
- }
-
- // code:
- //Timer compatibility
- asm.push("3C80817F"); // lis r4, 0x817F
- asm.push("38000000"); // li r0, 0
- asm.push("9004010C"); // stw r0, 0x010C(r4)
- asm.push("38000001"); // li r0, 1
- asm.push("98040101"); // stb r0, 0x0101(r4)
-
- asm.push("887F0012"); // lbz r3, 0x12(r31)
- asm.push("2C030001"); // cmpwi r3, 1
- asm.push("4181" + ("000" + (branchBase + 0x48).toString(16).toUpperCase()).slice(-4)); // bgt- done
-
- asm.push("98040100"); // stb r0, 0x0100(r4)
-
- asm.push("80AD" + game.fmOffset); // lwz r5, TFlagManager::smInstance
- asm.push("7CC802A6"); // mflr r6
- asm.push("80640000"); // lwz r3, 0(r4)
-
- asm.push("881F000E"); // lbz r0, 0x0E(r31)
- asm.push("2C00000F"); // cmpwi r0, 15
- asm.push("40820010"); // bne- 0x10
- asm.push("3860" + ("000" + ((levelCodes.length - (order === 'random')) * 2).toString(16).toUpperCase()).slice(-4)); // li r3, length
- asm.push("90640000"); // stw r3, 0(r4)
- asm.push("48000018"); // b 0x18
- asm.push("2C030000"); // cmpwi r3, 0
- asm.push("4180" + ("000" + (0x1C + 0x14 * (order !== "list")).toString(16).toUpperCase()).slice(-4)); // blt- loadEnding
- asm.push("880500CC"); // lbz r0, 0xCC(r5)
- asm.push("54000673"); // rlwinm. r0, r0, 0, 25, 25
- asm.push("4182" + ("000" + branchBase.toString(16).toUpperCase()).slice(-4)); // beq- loadIndex
-
- if (order === "random") {
- asm.push("38630002"); // addi r3, r3, 2
- }
-
- if (order !== "list") {
- asm.push("7CEC42E6"); // mftbl r7
- asm.push("7C071B96"); // divwu r0, r7, r3
- asm.push("7C0019D6"); // mullw r0, r0, r3
- asm.push("7CE03850"); // sub r7, r7, r0
- asm.push("54E7003C"); // rlwinm r7, r7, 0, 0, 30
- }
-
- asm.push("3463FFFE"); // subic. r3, r3, 2
- if (order !== "random") {
- asm.push("90640000"); // stw r3, 0(r4)
- }
-
- asm.push("4080000C"); // bge- 0xC
-
- // loadEnding:
- asm.push("3860" + ending); // li r3, ending
- asm.push("4800" + ("000" + (0x8 + 0x10 * (order !== "list")).toString(16).toUpperCase()).slice(-4)); // b loadStage
-
- if (order !== "list") {
- asm.push("7C061A2E"); // lhzx r0, r6, r3
- asm.push("7C863A2E"); // lhzx r4, r6, r7
- asm.push("7C063B2E"); // sthx r0, r6, r7
- asm.push("7C861B2E"); // sthx r4, r6, r3
- }
-
- // loadIndex:
- asm.push("7C661A2E"); // lhzx r3, r6, r3
-
- // loadStage:
- asm.push("B07F0012"); // sth r3, 0x12(r31)
- asm.push("986500DF"); // stb r3, 0xDF(r5)
-
- // done:
- asm.push("807F0020"); // lwz r3, 0x20(r31)
-
- if (asm.length % 2 === 0) {
- asm.push("60000000"); // nop
- }
- asm.push("00000000");
-
- const geckoLines = asm.length / 2;
- let gecko = "C2" + game.injectAddr + " " + ("0000000" + geckoLines.toString(16).toUpperCase()).slice(-8) + "\r\n";
- for (let i = 0; i < geckoLines; ++i) {
- gecko += asm[2 * i] + " " + asm[2 * i + 1] + "\r\n";
- }
-
- let codes = gecko +
- game.notext[document.getElementById("route_notext").value] +
- game.nofmvs[document.getElementById("route_nofmvs").value];
-
- return codes.replace(/[^0-9A-F]/g, '');
-}
+if (navigator.userAgent.toLowerCase().indexOf("firefox") > -1) {
+ HTMLElement.prototype.click = function() {
+ var evt = this.ownerDocument.createEvent("MouseEvents");
+ evt.initMouseEvent("click", true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
+ this.dispatchEvent(evt);
+ }
+}
+
+document.getElementById("checklist").addEventListener("click", function(ev) {
+ if (ev.target && ev.target.nodeName == "LI") {
+ ev.target.classList.toggle("checked");
+ }
+});
+
+function parseXML(name) {
+ var xml = new XMLHttpRequest();
+ var file = "codes/" + name + ".xml";
+ xml.onreadystatechange = function() {
+ if (this.status == 200 && this.readyState == 4) {
+ var xmlData = xml.responseXML;
+ xmlData = (new DOMParser()).parseFromString(xml.responseText, "text/xml");
+ xmlData = xmlData.getElementsByTagName("code");
+
+ var i = 0;
+ for (; i < xmlData.length; i++) {
+ var li = document.createElement("li");
+ var desc = xmlData[i].getElementsByTagName("title")[0].textContent;
+ var t = document.createTextNode(desc);
+ li.appendChild(t);
+ li.setAttribute("data-codename", btoa(xmlData[i].getElementsByTagName("title")[0].textContent));
+ li.setAttribute("data-codeauthor", btoa(xmlData[i].getElementsByTagName("author")[0].textContent));
+ li.setAttribute("data-codedesc", btoa(xmlData[i].getElementsByTagName("description")[0].textContent));
+ li.setAttribute("data-codeversion", btoa(xmlData[i].getElementsByTagName("version")[0].textContent));
+ li.setAttribute("data-codedate", btoa(xmlData[i].getElementsByTagName("date")[0].textContent));
+ li.setAttribute("data-codesrc", btoa(xmlData[i].getElementsByTagName("source")[0].textContent.replace(/[\s\n\r\t]+/gm, "")));
+ li.setAttribute("onmouseover", "updateDescription(this)");
+ document.getElementById("checklist").appendChild(li);
+ }
+
+ var buttons = document.getElementsByTagName("button");
+ for (var i = 0; i < buttons.length; i++) buttons[i].disabled = false;
+
+ document.getElementById("gameversion").disabled = false;
+ }
+ };
+
+ xml.open("GET", file);
+ xml.send();
+}
+
+function updateFastCode(name) {
+ var xml = new XMLHttpRequest();
+ var file = "codes/fast/" + name + ".json";
+ xml.onreadystatechange = function() {
+ if (this.status == 200 && this.readyState == 4) {
+ document.getElementById("route_levels").setAttribute("data-json", btoa(xml.responseText));
+ }
+ }
+ xml.open("GET",file);
+ xml.send();
+}
+
+function downloadFile(data, filename) {
+
+ var file = new Blob([data], {
+ type: "application/octet-stream"
+ });
+
+ if (window.navigator.msSaveOrOpenBlob) window.navigator.msSaveOrOpenBlob(file, filename.replace("GMSJ0A","GMSJ01"));
+ else {
+ var a = document.createElement("a"),
+ url = window.URL.createObjectURL(file);
+ a.href = url;
+ a.download = filename.replace("GMSJ0A","GMSJ01");
+ a.click();
+ setTimeout(function() { window.URL.revokeObjectURL(url); }, 500);
+ }
+}
+
+function generateGCT() {
+
+ if (document.getElementById("gameversion").value === "Choose Version") {
+ alert("Select the game version!");
+ return;
+ }
+ var data = "00D0C0DE00D0C0DE";
+ var codeList = document.getElementById("checklist").getElementsByTagName("li");
+ var valueSelected = false;
+ for (var i = 0; i < codeList.length; i++) {
+ if (codeList[i].className === "checked") {
+ data += atob(codeList[i].getAttribute("data-codesrc"));
+ valueSelected = true;
+ }
+ }
+
+ var fastcode = getFastCode();
+
+ if(fastcode !== false) {
+ data += fastcode;
+ valueSelected = true;
+ }
+
+ if (valueSelected) {
+ data += "FF00000000000000";
+ var rawData = new Uint8Array(data.length / 2);
+
+ for (var x = 0; x < rawData.length; x++) {
+ rawData[x] = parseInt(data.substr(x * 2, 2), 16);
+ }
+
+ downloadFile(rawData, document.getElementById("gameversion").value + ".gct");
+ } else {
+ alert("No cheat(s) selected!");
+ }
+}
+
+function generateTXT() {
+
+ var dolphin = (document.getElementById("downloadformat").value === "ini");
+
+ if (document.getElementById("gameversion").value === "Choose Version") {
+ alert("Select the game version!");
+ return;
+ }
+ if (dolphin) var data = "Paste the following on top of your games .ini file:\r\n[Gecko]";
+ else var data = document.getElementById("gameversion").value.replace("GMSJ0A","GMSJ01") + "\r\nSuper Mario Sunshine";
+ var codeList = document.getElementById("checklist").getElementsByTagName("li");
+ var valueSelected = false;
+ for (var i = 0; i < codeList.length; i++) {
+ if (codeList[i].className === "checked") {
+ data += "\r\n";
+ if (dolphin) data += "$";
+ else data += "\r\n";
+ data += atob(codeList[i].getAttribute("data-codename")) + " (" + atob(codeList[i].getAttribute("data-codedate")) + ") [" + atob(codeList[i].getAttribute("data-codeauthor")) + "]\r\n";
+ data += (atob(codeList[i].getAttribute("data-codesrc")).match(/.{8}/g).join(" ")).replace(/(.{17})./g, "$1\r\n");
+ valueSelected = true;
+ }
+ }
+
+ var fastcode = getFastCode();
+
+ if(fastcode !== false) {
+ data += "\r\n";
+ if (dolphin) data += "$";
+ else data += "\r\n";
+ data += "Stage list loader [Noki Doki]\r\n";
+ data += (fastcode.match(/.{8}/g).join(" ")).replace(/(.{17})./g, "$1\r\n");
+ valueSelected = true;
+ }
+
+ if (valueSelected)
+ downloadFile(data, document.getElementById("gameversion").value + ".txt");
+ else alert("No cheat(s) selected!");
+}
+
+function downloadCodes() {
+ if (document.getElementById("downloadformat").value === "gct") generateGCT();
+ else generateTXT();
+}
+
+function updateCodelist() {
+ resetDescription();
+ document.getElementById("gameversion").disabled = true;
+ var buttons = document.getElementsByTagName("button");
+ for (var i = 0; i < buttons.length; i++) buttons[i].disabled = true;
+ document.getElementById("checklist").innerHTML = "";
+ var gameVersion = document.getElementById("gameversion").value;
+ parseXML(gameVersion);
+ updateFastCode(gameVersion);
+ document.getElementById("left").style.visibility = "visible";
+ while (document.getElementsByClassName("initialhidden").length > 0) {
+ document.getElementsByClassName("initialhidden")[0].classList.remove("initialhidden");
+ }
+}
+
+function updateDescription(s) {
+ document.getElementById("descriptionbox").innerHTML = "" +
+ atob(s.getAttribute("data-codename")) + " Author(s): " +
+ atob(s.getAttribute("data-codeauthor")) + "
Version: " +
+ atob(s.getAttribute("data-codeversion")) + " (" +
+ atob(s.getAttribute("data-codedate")) + ")
" + "Description: " +
+ atob(s.getAttribute("data-codedesc")) + "
";
+}
+
+function updateUIDescription(s) {
+ if (s.id === "route_notext")
+ document.getElementById("descriptionbox").innerHTML = "Remove Dialogue Replaces all Dialogue with \"!!!\". 'Always' and 'Not in Pianta 5' will override the dialogue skip from the DPad Functions.
";
+ else if (s.id === "route_nofmvs")
+ document.getElementById("descriptionbox").innerHTML = "Skippable Cutscenes Makes FMVs Skippable. 'Always' has the same effect as the 'FMV Skips' code. Also, having 'FMV Skips' enabled will override 'Not in Pinna 1' - so don't use both simultaneously.
";
+ else if (s.id === "route_order")
+ document.getElementById("descriptionbox").innerHTML = "Level Order The order in which levels are loaded:
As specified The code loads levels in the order of the list.
Random, no duplicates The code picks levels at random, excluding levels that you’ve finished already.
Fully random The code picks levels at random, even levels that you’ve finished already.
";
+ else if (s.id === "route_ending")
+ document.getElementById("descriptionbox").innerHTML = "Route Ending What to do after you complete the final level on the list. This has no effect if the level order is set to Fully random.
";
+ else if (s.id === "downloadformat")
+ document.getElementById("descriptionbox").innerHTML = "File Format You can choose between 3 file formats:
GCT Download a GCT file for use with Nintendont
Dolphin INI Download a textfile containing the formatted codes for use with Dolphin. Copy the contents of the file on top of your games .ini file.
You can open the .ini file by right clicking the game in Dolphin. In the context menu select 'Properties' and then 'Edit configuration'.
Cheat Manager TXT Download the cheats in a textfile formatted for use with the Gecko Cheat Manager . Place the txt file in SD:/txtcodes/.
A zip archive containing pregenerated txt files with all available codes on this site can be downloaded here .
";
+ else if (s.id === "stageloader")
+ document.getElementById("descriptionbox").innerHTML = "Stage Loader Select yes if you want to use a custom stage loader, which automatically loads the levels you choose, similiar to 'Fast Any%'.
";
+}
+
+function resetDescription() {
+ document.getElementById("descriptionbox").innerHTML = "
Choose your codes from the list... ";
+}
+
+function updateChangelog() {
+ document.getElementById("gameversion").style.visibility = "visible";
+ var xml = new XMLHttpRequest();
+ var file = "changelog.xml";
+ xml.onload = function() {
+ if (this.status == 200 && this.responseXML != null) {
+ var changelogData = xml.responseXML;
+ changelogData = (new DOMParser()).parseFromString(xml.responseText, "text/xml");
+ changelogData = changelogData.getElementsByTagName("update");
+
+ var recentchanges = "";
+ try {
+ document.getElementById("lastupdate").innerHTML = "Last Updated: " + changelogData[0].getElementsByTagName("date")[0].textContent;
+
+ for (var i = 0; i < changelogData.length && i < 3;i++) {
+ recentchanges += "" + changelogData[i].getElementsByTagName("date")[0].textContent + ": ";
+
+ var changes = changelogData[i].getElementsByTagName("change");
+ for (var k = 0; k < changes.length && (i+k-1) < 3; k++) {
+ recentchanges += changes[k].getElementsByTagName("head")[0].textContent + " ";
+ }
+
+ i += k-1;
+
+ recentchanges += "
";
+ }
+ } catch (err) {}
+
+ document.getElementById("changelog").innerHTML += recentchanges + "more ...
";
+ };
+ }
+
+ xml.open("GET", file);
+ xml.send();
+}
+
+/****************************
+*
+* Fastcode, https://github.com/QbeRoot/fastcodes/blob/master/script.js
+*
+****************************/
+
+const levels = document.querySelector("#route_levels");
+const template = levels.lastElementChild;
+template.ondragstart = function() { return false; };
+
+function appendLevel(code) {
+ const clone = template.cloneNode(true);
+ clone.draggable = true;
+ selSetHandlers(clone);
+ clone.querySelector("select").value = code;
+ levels.insertBefore(clone, template);
+}
+
+function clearLevels() {
+ while (levels.firstChild !== template) levels.removeChild(levels.firstChild);
+}
+
+template.addEventListener("change", function () {
+ appendLevel(template.querySelector("select").value);
+ template.querySelector("select").value = "0F00";
+})
+
+levels.addEventListener("change", function (ev) {
+ if (ev.target.value === "0F00" && ev.target.parentNode !== template) levels.removeChild(ev.target.parentNode);
+})
+
+levels.addEventListener("click", function (ev) {
+ if (ev.target.tagName.toUpperCase() === "BUTTON") levels.removeChild(ev.target.parentNode);
+})
+
+document.querySelector("#route_ending").disabled = document.querySelector("#route_order").value === "random";
+document.querySelector("#route_order").addEventListener("change", function (ev) {
+ document.querySelector("#route_ending").disabled = ev.currentTarget.value === "random";
+})
+
+document.querySelector("#route_presets").addEventListener("change", function (ev) {
+ if (levels.childElementCount <= 1 || confirm("Loading a preset will erase your current list. Continue?")) {
+ clearLevels();
+ const preset = ev.currentTarget.value.split(";")[0];
+ const ending = ev.currentTarget.value.split(";")[1];
+ for (let i = 0; i <= preset.length - 4; i += 4) appendLevel(preset.substr(i, 4));
+ if (ending) document.querySelector("#route_ending").value = ending
+ }
+ ev.currentTarget.value = "";
+})
+
+document.querySelector("#route_clear").addEventListener("click", function () {
+ confirm("Do you really want to clear the list?") && clearLevels();
+})
+
+{
+ let selection;
+
+ function selDragStart(e) {
+ selection = this;
+ e.dataTransfer.effectAllowed = "move";
+ e.dataTransfer.setData("html", this.querySelector("select").value);
+
+ this.classList.add("dragelement");
+ }
+
+ function selDragOver(e) {
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+
+ this.classList.add("dragover");
+ e.dataTransfer.dropEffect = "move";
+
+ return false;
+ }
+
+ function selDragLeave() {
+ this.classList.remove("dragover");
+ }
+
+ function selDragDrop(e) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+
+ if (selection != this) {
+ this.parentNode.removeChild(selection);
+ this.insertAdjacentHTML("afterend", template.outerHTML);
+ this.nextSibling.querySelector("select").value = e.dataTransfer.getData('html');
+ this.nextSibling.draggable = true;
+ selSetHandlers(this.nextSibling);
+ }
+
+ this.classList.remove("dragover");
+ return false;
+ }
+
+ function selDragEnd() {
+ this.classList.remove("dragelement");
+ }
+
+ function selSetHandlers(elem) {
+ elem.addEventListener('dragstart', selDragStart, false);
+ elem.addEventListener('dragover', selDragOver, false);
+ elem.addEventListener('dragleave', selDragLeave, false);
+ elem.addEventListener('drop', selDragDrop, false);
+ elem.addEventListener('dragend', selDragEnd, false);
+ }
+}
+
+//Interface
+function getFastCode() {
+ var levelCodes = [];
+ for (var c = levels.getElementsByTagName("select"), i = 0; i < c.length; i++) {
+ levelCodes.push(c[i].value);
+ }
+ levelCodes.pop();
+
+ if (!(document.getElementById("usefastcode").checked) || levelCodes.length <= 1) return false;
+
+ let game = JSON.parse(atob(document.getElementById("route_levels").getAttribute("data-json")));
+ const order = document.getElementById("route_order").value;
+ const ending = document.getElementById("route_ending").value;
+ const branchBase = 0x18 + 0x24 * (order !== 'list');
+ const asm = [];
+ asm.push("48" + ("00000" + (Math.ceil(levelCodes.length / 2) + 1 << 2 | 1).toString(16).toUpperCase()).slice(-6)); // bl code
+ for (let i = levelCodes.length - 1; i >= 0; i -= 2) {
+ asm.push(levelCodes[i] + (levelCodes[i - 1] || "0000"));
+ }
+
+ // code:
+ //Timer compatibility
+ asm.push("3C80817F"); // lis r4, 0x817F
+ asm.push("38000000"); // li r0, 0
+ asm.push("9004010C"); // stw r0, 0x010C(r4)
+ asm.push("38000001"); // li r0, 1
+ asm.push("98040101"); // stb r0, 0x0101(r4)
+
+ asm.push("887F0012"); // lbz r3, 0x12(r31)
+ asm.push("2C030001"); // cmpwi r3, 1
+ asm.push("4181" + ("000" + (branchBase + 0x48).toString(16).toUpperCase()).slice(-4)); // bgt- done
+
+ asm.push("98040100"); // stb r0, 0x0100(r4)
+
+ asm.push("80AD" + game.fmOffset); // lwz r5, TFlagManager::smInstance
+ asm.push("7CC802A6"); // mflr r6
+ asm.push("80640000"); // lwz r3, 0(r4)
+
+ asm.push("881F000E"); // lbz r0, 0x0E(r31)
+ asm.push("2C00000F"); // cmpwi r0, 15
+ asm.push("40820010"); // bne- 0x10
+ asm.push("3860" + ("000" + ((levelCodes.length - (order === 'random')) * 2).toString(16).toUpperCase()).slice(-4)); // li r3, length
+ asm.push("90640000"); // stw r3, 0(r4)
+ asm.push("48000018"); // b 0x18
+ asm.push("2C030000"); // cmpwi r3, 0
+ asm.push("4180" + ("000" + (0x1C + 0x14 * (order !== "list")).toString(16).toUpperCase()).slice(-4)); // blt- loadEnding
+ asm.push("880500CC"); // lbz r0, 0xCC(r5)
+ asm.push("54000673"); // rlwinm. r0, r0, 0, 25, 25
+ asm.push("4182" + ("000" + branchBase.toString(16).toUpperCase()).slice(-4)); // beq- loadIndex
+
+ if (order === "random") {
+ asm.push("38630002"); // addi r3, r3, 2
+ }
+
+ if (order !== "list") {
+ asm.push("7CEC42E6"); // mftbl r7
+ asm.push("7C071B96"); // divwu r0, r7, r3
+ asm.push("7C0019D6"); // mullw r0, r0, r3
+ asm.push("7CE03850"); // sub r7, r7, r0
+ asm.push("54E7003C"); // rlwinm r7, r7, 0, 0, 30
+ }
+
+ asm.push("3463FFFE"); // subic. r3, r3, 2
+ if (order !== "random") {
+ asm.push("90640000"); // stw r3, 0(r4)
+ }
+
+ asm.push("4080000C"); // bge- 0xC
+
+ // loadEnding:
+ asm.push("3860" + ending); // li r3, ending
+ asm.push("4800" + ("000" + (0x8 + 0x10 * (order !== "list")).toString(16).toUpperCase()).slice(-4)); // b loadStage
+
+ if (order !== "list") {
+ asm.push("7C061A2E"); // lhzx r0, r6, r3
+ asm.push("7C863A2E"); // lhzx r4, r6, r7
+ asm.push("7C063B2E"); // sthx r0, r6, r7
+ asm.push("7C861B2E"); // sthx r4, r6, r3
+ }
+
+ // loadIndex:
+ asm.push("7C661A2E"); // lhzx r3, r6, r3
+
+ // loadStage:
+ asm.push("B07F0012"); // sth r3, 0x12(r31)
+ asm.push("986500DF"); // stb r3, 0xDF(r5)
+
+ // done:
+ asm.push("807F0020"); // lwz r3, 0x20(r31)
+
+ if (asm.length % 2 === 0) {
+ asm.push("60000000"); // nop
+ }
+ asm.push("00000000");
+
+ const geckoLines = asm.length / 2;
+ let gecko = "C2" + game.injectAddr + " " + ("0000000" + geckoLines.toString(16).toUpperCase()).slice(-8) + "\r\n";
+ for (let i = 0; i < geckoLines; ++i) {
+ gecko += asm[2 * i] + " " + asm[2 * i + 1] + "\r\n";
+ }
+
+ let codes = gecko +
+ game.notext[document.getElementById("route_notext").value] +
+ game.nofmvs[document.getElementById("route_nofmvs").value];
+
+ return codes.replace(/[^0-9A-F]/g, '');
+}
diff --git a/index.html b/index.html
index 7cdfc6e..dcc884c 100644
--- a/index.html
+++ b/index.html
@@ -1,291 +1,291 @@
-
-
-
-
-
-
-
-
- Super Mario Sunshine Practice Code Generator
-
-
-
-
-
-
-
-
-
- Game Version:
-
-
-
- Choose Version
- GMSE01 (NTSC-U)
- GMSP01 (PAL)
- GMSJ01 (NTSC-J 1.0)
- GMSJ01 (NTSC-J 1.1/A)
-
-
-
-
-
- Stage Loader:
-
-
-
- Yes
- No
-
-
-
-
-
- File Format:
-
-
-
- GCT
- Dolphin INI
- Cheat Manager TXT
-
-
-
-
-
-
- Download
-
-
-
-
-
-
-
-
-
Stage Loader
-
-
-
-
- Remove Dialogue:
-
-
-
- Always
- Not in Pianta 5
- Don't include
-
-
-
-
-
- Skippable Cutscenes:
-
-
-
- Always
- Not in Pinna 1
- Don't include
-
-
-
-
-
- Level Order:
-
-
-
- As specified
- Random, no duplicates
- Fully random
-
-
-
-
-
- After the last level:
-
-
-
- Return to the title screen
- Load Corona Mountain
- Load the Bowser fight
-
-
-
-
-
-
-
-
- ≡
-
- Select a level…
-
- Airstrip (red coins)
- Slide
- Pachinko
- Grass pipe
- Lily Pad Ride
- Jail secret
-
-
- Bianco 1
- Bianco 2
- Bianco 3
- Bianco 4
- Bianco 5
- Bianco 6
- Bianco 7
- Bianco 8
-
-
- Ricco 1
- Ricco 2
- Ricco 3
- Ricco 4
- Ricco 5
- Ricco 6
- Ricco 7
- Ricco 8
-
-
- Gelato 1
- Gelato 2
- Gelato 3
- Gelato 4
- Gelato 5
- Gelato 6
- Gelato 7
- Gelato 8
-
-
- Pinna 1
- Pinna 2
- Pinna 3
- Pinna 4
- Pinna 5
- Pinna 6
- Pinna 7
- Pinna 8
-
-
- Sirena 1
- Sirena 2
- Sirena 3
- Sirena 4
- Sirena 5
- Sirena 6
- Sirena 7
- Sirena 8
-
-
- Noki 1
- Noki 2
- Noki 3
- Noki 4
- Noki 5
- Noki 6
- Noki 7
- Noki 8
-
-
- Pianta 1
- Pianta 2
- Pianta 3
- Pianta 4
- Pianta 5
- Pianta 6
- Pianta 7
- Pianta 8
-
-
- Bianco 3 secret
- Bianco 6 secret
- Ricco 4 secret
- Gelato 1 secret
- Pinna 2 secret
- Pinna 6 secret
- Sirena 2 secret
- Sirena 4 secret
- Noki 6 secret
- Pianta 5 secret
-
-
- Petey Piranha fight (Bianco 2)
- Gooper Blooper fight (Ricco 1)
- Race course (Ricco 2)
- Sand bird (Gelato 4)
- Mecha-Bowser fight (Pinna 1)
- Rollercoaster (Pinna 8)
- Casino Delfino (Sirena 4)
- Casino Delfino (Sirena 5)
- King Boo fight (Sirena 5)
- Bottle (Noki 3)
- Deep Sea of Mare (Noki 4)
- Deep Sea of Mare (Noki 8)
-
-
- ×
-
-
-
-
- Clear list
-
- Load a preset…
- Any% usual route
- Any% Ricco late
- Any% No Major Skips
- All Episodes
- All Level Shines
-
- Bianco Hills
- Ricco Harbor
- Gelato Beach
- Pinna Park
- Sirena Beach
- Noki Bay
- Pianta Village
-
-
- Bianco Hills
- Ricco Harbor
- Gelato Beach
- Pinna Park
- Sirena Beach
- Noki Bay
- Pianta Village
-
-
-
-
-
-
-
-
Super Mario Sunshine Practice Code Generator v2
-
-
-
This is a cheatfile generator for Super Mario Sunshine speedrun practice. A guide on how to use the generator and practice codes on your Wii can be found here: Guide . Visit the troubleshooting section if you encounter any issues.
-
-
Changelog:
-
-
Made by Psychonauter , Noki Doki & Milk
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ Super Mario Sunshine Practice Code Generator
+
+
+
+
+
+
+
+
+
+ Game Version:
+
+
+
+ Choose Version
+ GMSE01 (NTSC-U)
+ GMSP01 (PAL)
+ GMSJ01 (NTSC-J 1.0)
+ GMSJ01 (NTSC-J 1.1/A)
+
+
+
+
+
+ Stage Loader:
+
+
+
+ Yes
+ No
+
+
+
+
+
+ File Format:
+
+
+
+ GCT
+ Dolphin INI
+ Cheat Manager TXT
+
+
+
+
+
+
+ Download
+
+
+
+
+
+
+
+
+
Stage Loader
+
+
+
+
+ Remove Dialogue:
+
+
+
+ Always
+ Not in Pianta 5
+ Don't include
+
+
+
+
+
+ Skippable Cutscenes:
+
+
+
+ Always
+ Not in Pinna 1
+ Don't include
+
+
+
+
+
+ Level Order:
+
+
+
+ As specified
+ Random, no duplicates
+ Fully random
+
+
+
+
+
+ After the last level:
+
+
+
+ Return to the title screen
+ Load Corona Mountain
+ Load the Bowser fight
+
+
+
+
+
+
+
+
+ ≡
+
+ Select a level…
+
+ Airstrip (red coins)
+ Slide
+ Pachinko
+ Grass pipe
+ Lily Pad Ride
+ Jail secret
+
+
+ Bianco 1
+ Bianco 2
+ Bianco 3
+ Bianco 4
+ Bianco 5
+ Bianco 6
+ Bianco 7
+ Bianco 8
+
+
+ Ricco 1
+ Ricco 2
+ Ricco 3
+ Ricco 4
+ Ricco 5
+ Ricco 6
+ Ricco 7
+ Ricco 8
+
+
+ Gelato 1
+ Gelato 2
+ Gelato 3
+ Gelato 4
+ Gelato 5
+ Gelato 6
+ Gelato 7
+ Gelato 8
+
+
+ Pinna 1
+ Pinna 2
+ Pinna 3
+ Pinna 4
+ Pinna 5
+ Pinna 6
+ Pinna 7
+ Pinna 8
+
+
+ Sirena 1
+ Sirena 2
+ Sirena 3
+ Sirena 4
+ Sirena 5
+ Sirena 6
+ Sirena 7
+ Sirena 8
+
+
+ Noki 1
+ Noki 2
+ Noki 3
+ Noki 4
+ Noki 5
+ Noki 6
+ Noki 7
+ Noki 8
+
+
+ Pianta 1
+ Pianta 2
+ Pianta 3
+ Pianta 4
+ Pianta 5
+ Pianta 6
+ Pianta 7
+ Pianta 8
+
+
+ Bianco 3 secret
+ Bianco 6 secret
+ Ricco 4 secret
+ Gelato 1 secret
+ Pinna 2 secret
+ Pinna 6 secret
+ Sirena 2 secret
+ Sirena 4 secret
+ Noki 6 secret
+ Pianta 5 secret
+
+
+ Petey Piranha fight (Bianco 2)
+ Gooper Blooper fight (Ricco 1)
+ Race course (Ricco 2)
+ Sand bird (Gelato 4)
+ Mecha-Bowser fight (Pinna 1)
+ Rollercoaster (Pinna 8)
+ Casino Delfino (Sirena 4)
+ Casino Delfino (Sirena 5)
+ King Boo fight (Sirena 5)
+ Bottle (Noki 3)
+ Deep Sea of Mare (Noki 4)
+ Deep Sea of Mare (Noki 8)
+
+
+ ×
+
+
+
+
+ Clear list
+
+ Load a preset…
+ Any% usual route
+ Any% Ricco late
+ Any% No Major Skips
+ All Episodes
+ All Level Shines
+
+ Bianco Hills
+ Ricco Harbor
+ Gelato Beach
+ Pinna Park
+ Sirena Beach
+ Noki Bay
+ Pianta Village
+
+
+ Bianco Hills
+ Ricco Harbor
+ Gelato Beach
+ Pinna Park
+ Sirena Beach
+ Noki Bay
+ Pianta Village
+
+
+
+
+
+
+
+
Super Mario Sunshine Practice Code Generator v2
+
+
+
This is a cheatfile generator for Super Mario Sunshine speedrun practice. A guide on how to use the generator and practice codes on your Wii can be found here: Guide . Visit the troubleshooting section if you encounter any issues.
+
+
Changelog:
+
+
Made by Psychonauter , Noki Doki & Milk
+
+
+
+
+
+
+
+
diff --git a/style/style.css b/style/style.css
index 955d901..1cb2017 100644
--- a/style/style.css
+++ b/style/style.css
@@ -1,403 +1,403 @@
-html {
- background-color:#f0f1f0;
- color:#000;
- font-family:Calibri;
- text-align:left
-}
-
-body {
- display:inline-block;
- margin:10px 0px;
- min-height:450px;
- font-size:1em;
- text-align:left
-}
-
-h1,h2,h3,h4{
- margin:5px 0px
-}
-
-h2,h3 {
- text-align:center
-}
-
-h1 {
- font-size:1.3em
-}
-
-h2 {
- font-size:1.1em
-}
-
-h3,h4 {
- margin-top:15px;
- font-size:1em
-}
-
-p {
- margin:10px 5px 0px 2px
-}
-
-img {
- border-radius:4px;
- max-width:100%
-}
-
-a {
- color:#ff0029;
- text-decoration:none
-}
-
-a:hover {
- color:#1185fd
-}
-
-hr {
- border-color:#f3f3f3
-}
-
-input[type=checkbox] {
- vertical-align:middle;
- width:15px;
- height:15px;
- margin:0;
- -webkit-appearance: checkbox;
- box-sizing: border-box
-}
-
-tr td:first-child {
- padding-right:5px
-}
-
-td {
- vertical-align:middle
-}
-
-#mainContainer {
- width:100vw;
- text-align:center
-}
-
-.initialhidden {
- visibility:hidden;
-}
-
-.section {
- display:inline-block;
- vertical-align:top;
- margin:20px 8px;
- text-align:left
-}
-
-.framed {
- padding:12px;
- text-align:justify;
- border-style:solid;
- border-color:#000;
- border-width:1px;
- border-radius:0px
-}
-
-.section .framed {
- margin-top:16px
-}
-
-.section .framed:first-of-type {
- margin-top:0px
-}
-
-#gameversion {
- width:100%;
- margin-top:0
-}
-
-#downloadbutton {
- width:100%;
- margin-top:2px
-}
-
-#generalsettings table {
- width:100%
-}
-
-#home {
- display:inline-block;
- min-width:400px;
- width:50vw;
- margin:10px 0px;
- padding:4px;
- text-align:justify
-}
-
-#smscommunity {
- display:block;
- text-align:center;
- margin:18px 0px 7px 0px
-}
-
-#smscommunity img {
- margin:0px 3px;
- vertical-align:middle
-}
-
-#left {
- width:30vw;
- min-width:300px;
- max-width:400px
-}
-
-#center {
- display:none
-}
-
-#right {
- width:50vw;
- min-width:300px;
- max-width:800px
-}
-
-#usefastcode:checked ~ #center {
- display:inline-block;
- width:20vw;
- min-width:300px;
- max-width:400px
-}
-
-#usefastcode:checked ~ #left {
- width:20vw
-}
-
-#usefastcode:checked ~ #right {
- width:35vw
-}
-
-@media screen and (max-width:1100px) {
-
- #usefastcode:checked ~ #left, #usefastcode:checked ~ #center{
- min-width:45vw;
- max-width:45vw
- }
-
- #usefastcode:checked ~ #right {
- min-width:90vw;
- min-width:calc(90vw + 24px);
- max-width:90vw
- }
-}
-
-@media screen and (max-width:700px) {
-
- #left,#center,#usefastcode:checked ~ #left, #usefastcode:checked ~ #center{
- min-width:400px;
- max-width:90vw;
- width:90vw
- }
-
- #right,#usefastcode:checked ~ #right {
- display:none
- }
-}
-
-button {
- padding:6px;
- margin:auto;
- color:#f1f1f1;
- background-color:#ca0707;
- border-style:none;
- border-radius:4px;
- cursor:pointer;
- outline:none
-}
-
-button:hover {
- background-color:#ff5151;
-}
-
-select {
- margin:2px 0px;
- background-color:#ca0707;
- padding:5px;
- color:#fff;
- width:200px;
- border-style:none;
- border-radius:4px;
- -webkit-user-select:none;
- -moz-user-select:none;
- -ms-user-select:none;
- user-select:none;
- outline:none
-}
-
-select:disabled {
- background:#e2e2e2;
- color: grey
-}
-
-optgroup {
- background:#ff5151
-}
-
-option {
- background:#ca0707
-}
-
-label {
- -webkit-user-select:none;
- -moz-user-select:none;
- -ms-user-select:none;
- user-select:none
-}
-
-ul {
- margin:0;
- padding:0;
- width:100%;
- list-style-type:none
-}
-
-ul li {
- margin-top:2px;
- cursor:pointer;
- position:relative;
- padding:4px;
- color:#262626;
- text-align:left;
- transition:.1s;
- -webkit-user-select:none;
- -moz-user-select:none;
- -ms-user-select:none;
- user-select:none;
- outline:none
-}
-
-ul li:nth-child(odd) {
- background:#e2e2e2
-}
-
-ul li:hover {
- background:#ca0707;
- color:#fff;
- border-color:#000
-}
-
-ul li.checked:hover {
- background:#ca0707;
- color:#fff
-}
-
-ul li.checked {
- background:#434343;
- color:#fff;
- border-color:#262626
-}
-
-[draggable] {
- -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- user-select: none;
- -khtml-user-drag: element;
- -webkit-user-drag: element
-}
-
-#route_levels {
- margin:10px 0px;
-}
-
-#route_levels li {
- padding:0px 10px;
- margin:0
-}
-
-#route_levels li.dragover {
- padding-bottom:20px;
- background-color:white
-}
-
-#route_levels li select {
- margin:0;
- width:calc(100% - 40px);
- margin:0px 6px;
- color:black;
- background-color:inherit
-}
-
-#route_levels li select:hover {
- color:white
-}
-
-#route_levels li:hover select {
- color:white
-}
-
-#route_levels li:last-child {
- padding-left:24px
-}
-
-#route_levels li:last-child .route_remove, #route_levels li:last-child .route_drag {
- display:none
-}
-
-#checklist li {
- padding-left: 26px;
-}
-
-#checklist li::before {
- content:'';
- position:absolute;
- border-color:#a6a6a6;
- border-style:solid;
- border-width:2px;
- border-radius:50%;
- -webkit-transform: translateY(20%);
- -moz-transform: translateY(20%);
- -ms-transform: translateY(20%);
- -o-transform: translateY(20%);
- transform: translateY(20%);
- transform: translateY(20%);
- left:6px;
- height:10px;
- width:10px
-}
-
-#checklist li:hover::before {
- border-color:#fff;
- background-color:#ffc0cb
-}
-
-#checklist li.checked::before {
- border-color:#fff;
- background-color:#d85e55
-}
-
-.dragelement {
- opacity:0.3
-}
-
-.route_remove {
- background:inherit;
- color:red;
- font-weight:bold;
- border-radius:0;
- vertical-align:middle;
- padding:0
-}
-
-.route_remove:hover {
- background:inherit;
- color:white
-}
-
-.route_drag {
- display:inline;
- background-color:inherit;
- color:#aaa;
- border-radius:0;
- vertical-align:middle;
- margin:0;
- padding:0
-}
-
-.route_clear, .route_presets {
- display:inline-block
-}
+html {
+ background-color:#f0f1f0;
+ color:#000;
+ font-family:Calibri;
+ text-align:left
+}
+
+body {
+ display:inline-block;
+ margin:10px 0px;
+ min-height:450px;
+ font-size:1em;
+ text-align:left
+}
+
+h1,h2,h3,h4{
+ margin:5px 0px
+}
+
+h2,h3 {
+ text-align:center
+}
+
+h1 {
+ font-size:1.3em
+}
+
+h2 {
+ font-size:1.1em
+}
+
+h3,h4 {
+ margin-top:15px;
+ font-size:1em
+}
+
+p {
+ margin:10px 5px 0px 2px
+}
+
+img {
+ border-radius:4px;
+ max-width:100%
+}
+
+a {
+ color:#ff0029;
+ text-decoration:none
+}
+
+a:hover {
+ color:#1185fd
+}
+
+hr {
+ border-color:#f3f3f3
+}
+
+input[type=checkbox] {
+ vertical-align:middle;
+ width:15px;
+ height:15px;
+ margin:0;
+ -webkit-appearance: checkbox;
+ box-sizing: border-box
+}
+
+tr td:first-child {
+ padding-right:5px
+}
+
+td {
+ vertical-align:middle
+}
+
+#mainContainer {
+ width:100vw;
+ text-align:center
+}
+
+.initialhidden {
+ visibility:hidden;
+}
+
+.section {
+ display:inline-block;
+ vertical-align:top;
+ margin:20px 8px;
+ text-align:left
+}
+
+.framed {
+ padding:12px;
+ text-align:justify;
+ border-style:solid;
+ border-color:#000;
+ border-width:1px;
+ border-radius:0px
+}
+
+.section .framed {
+ margin-top:16px
+}
+
+.section .framed:first-of-type {
+ margin-top:0px
+}
+
+#gameversion {
+ width:100%;
+ margin-top:0
+}
+
+#downloadbutton {
+ width:100%;
+ margin-top:2px
+}
+
+#generalsettings table {
+ width:100%
+}
+
+#home {
+ display:inline-block;
+ min-width:400px;
+ width:50vw;
+ margin:10px 0px;
+ padding:4px;
+ text-align:justify
+}
+
+#smscommunity {
+ display:block;
+ text-align:center;
+ margin:18px 0px 7px 0px
+}
+
+#smscommunity img {
+ margin:0px 3px;
+ vertical-align:middle
+}
+
+#left {
+ width:30vw;
+ min-width:300px;
+ max-width:400px
+}
+
+#center {
+ display:none
+}
+
+#right {
+ width:50vw;
+ min-width:300px;
+ max-width:800px
+}
+
+#usefastcode:checked ~ #center {
+ display:inline-block;
+ width:20vw;
+ min-width:300px;
+ max-width:400px
+}
+
+#usefastcode:checked ~ #left {
+ width:20vw
+}
+
+#usefastcode:checked ~ #right {
+ width:35vw
+}
+
+@media screen and (max-width:1100px) {
+
+ #usefastcode:checked ~ #left, #usefastcode:checked ~ #center{
+ min-width:45vw;
+ max-width:45vw
+ }
+
+ #usefastcode:checked ~ #right {
+ min-width:90vw;
+ min-width:calc(90vw + 24px);
+ max-width:90vw
+ }
+}
+
+@media screen and (max-width:700px) {
+
+ #left,#center,#usefastcode:checked ~ #left, #usefastcode:checked ~ #center{
+ min-width:400px;
+ max-width:90vw;
+ width:90vw
+ }
+
+ #right,#usefastcode:checked ~ #right {
+ display:none
+ }
+}
+
+button {
+ padding:6px;
+ margin:auto;
+ color:#f1f1f1;
+ background-color:#ca0707;
+ border-style:none;
+ border-radius:4px;
+ cursor:pointer;
+ outline:none
+}
+
+button:hover {
+ background-color:#ff5151;
+}
+
+select {
+ margin:2px 0px;
+ background-color:#ca0707;
+ padding:5px;
+ color:#fff;
+ width:200px;
+ border-style:none;
+ border-radius:4px;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none;
+ outline:none
+}
+
+select:disabled {
+ background:#e2e2e2;
+ color: grey
+}
+
+optgroup {
+ background:#ff5151
+}
+
+option {
+ background:#ca0707
+}
+
+label {
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none
+}
+
+ul {
+ margin:0;
+ padding:0;
+ width:100%;
+ list-style-type:none
+}
+
+ul li {
+ margin-top:2px;
+ cursor:pointer;
+ position:relative;
+ padding:4px;
+ color:#262626;
+ text-align:left;
+ transition:.1s;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none;
+ outline:none
+}
+
+ul li:nth-child(odd) {
+ background:#e2e2e2
+}
+
+ul li:hover {
+ background:#ca0707;
+ color:#fff;
+ border-color:#000
+}
+
+ul li.checked:hover {
+ background:#ca0707;
+ color:#fff
+}
+
+ul li.checked {
+ background:#434343;
+ color:#fff;
+ border-color:#262626
+}
+
+[draggable] {
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+ -khtml-user-drag: element;
+ -webkit-user-drag: element
+}
+
+#route_levels {
+ margin:10px 0px;
+}
+
+#route_levels li {
+ padding:0px 10px;
+ margin:0
+}
+
+#route_levels li.dragover {
+ padding-bottom:20px;
+ background-color:white
+}
+
+#route_levels li select {
+ margin:0;
+ width:calc(100% - 40px);
+ margin:0px 6px;
+ color:black;
+ background-color:inherit
+}
+
+#route_levels li select:hover {
+ color:white
+}
+
+#route_levels li:hover select {
+ color:white
+}
+
+#route_levels li:last-child {
+ padding-left:24px
+}
+
+#route_levels li:last-child .route_remove, #route_levels li:last-child .route_drag {
+ display:none
+}
+
+#checklist li {
+ padding-left: 26px;
+}
+
+#checklist li::before {
+ content:'';
+ position:absolute;
+ border-color:#a6a6a6;
+ border-style:solid;
+ border-width:2px;
+ border-radius:50%;
+ -webkit-transform: translateY(20%);
+ -moz-transform: translateY(20%);
+ -ms-transform: translateY(20%);
+ -o-transform: translateY(20%);
+ transform: translateY(20%);
+ transform: translateY(20%);
+ left:6px;
+ height:10px;
+ width:10px
+}
+
+#checklist li:hover::before {
+ border-color:#fff;
+ background-color:#ffc0cb
+}
+
+#checklist li.checked::before {
+ border-color:#fff;
+ background-color:#d85e55
+}
+
+.dragelement {
+ opacity:0.3
+}
+
+.route_remove {
+ background:inherit;
+ color:red;
+ font-weight:bold;
+ border-radius:0;
+ vertical-align:middle;
+ padding:0
+}
+
+.route_remove:hover {
+ background:inherit;
+ color:white
+}
+
+.route_drag {
+ display:inline;
+ background-color:inherit;
+ color:#aaa;
+ border-radius:0;
+ vertical-align:middle;
+ margin:0;
+ padding:0
+}
+
+.route_clear, .route_presets {
+ display:inline-block
+}