diff --git a/changelog.xml b/changelog.xml
new file mode 100644
index 0000000..05f047d
--- /dev/null
+++ b/changelog.xml
@@ -0,0 +1,19 @@
+
+
+
+ Oct 16, 2017
+ Updated descriptions for incompatible codes.
+
+
+ Oct 15, 2017
+ Fixed download for Firefox
+
+
+ Oct 14, 2017
+ Added Fast Any% for JP & PAL
+
+
+ Oct 11, 2017
+ Added Stage Randomizer (Experimental) for NTSC-U
+
+
\ No newline at end of file
diff --git a/gctGenerator.js b/gctGenerator.js
new file mode 100644
index 0000000..18e4cff
--- /dev/null
+++ b/gctGenerator.js
@@ -0,0 +1,147 @@
+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);
+ }
+}
+
+var xmlData;
+function fillChecklist(i) {
+ if (i < xmlData.length) {
+ 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", xmlData[i].getElementsByTagName("title")[0].textContent);
+ li.setAttribute("data-codeAuthor", xmlData[i].getElementsByTagName("author")[0].textContent);
+ li.setAttribute("data-codeDesc", xmlData[i].getElementsByTagName("description")[0].textContent);
+ li.setAttribute("data-codeVersion", xmlData[i].getElementsByTagName("version")[0].textContent);
+ li.setAttribute("data-codeDate", xmlData[i].getElementsByTagName("date")[0].textContent);
+ li.setAttribute("data-codeSrc", xmlData[i].getElementsByTagName("source")[0].textContent.replace(/[\s\n\r\t]+/gm, ""));
+ li.setAttribute("onmouseover", "updateDescription(this)");
+ document.getElementById("checkList").appendChild(li);
+ i++;
+ setTimeout(function() {
+ fillChecklist(i)
+ }, 16);
+ } else {
+ setTimeout(function() {
+ button = document.getElementById("downloadButton");
+ button.style.transitionDuration = "1s";
+ button.style.opacity = "1";
+ button.disabled = false;
+ document.getElementById("gameID").disabled = false;
+ }, 24);
+ }
+}
+
+function parseXML(name) {
+ var xml = new XMLHttpRequest();
+ var file = "codes/" + name + ".xml";
+ xml.onload = function() {
+ if (this.status == 200 && this.responseXML != null) {
+ xmlData = xml.responseXML;
+ xmlData = (new DOMParser()).parseFromString(xml.responseText, "text/xml");
+ xmlData = xmlData.getElementsByTagName("code");
+
+ fillChecklist(0);
+ }
+ };
+ xml.open("GET", file);
+ xml.send();
+}
+
+function downloadGCT(data, filename) {
+ var rawData = new Uint8Array(data.length / 2);
+
+ for (var x = 0; x < rawData.length; x++) {
+ rawData[x] = parseInt(data.substr(x * 2, 2), 16);
+ }
+
+ var file = new Blob([rawData], {
+ type: "application/octet-stream"
+ });
+
+ if (window.navigator.msSaveOrOpenBlob)
+ window.navigator.msSaveOrOpenBlob(file, filename);
+ else {
+ var a = document.createElement("a"),
+ url = window.URL.createObjectURL(file);
+ a.href = url;
+ a.download = filename;
+ a.click();
+ setTimeout(function() {
+ window.URL.revokeObjectURL(url);
+ }, 500);
+ }
+}
+
+function generateGCT() {
+
+ if (document.getElementById("gameID").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 += codeList[i].getAttribute("data-codeSrc");
+ valueSelected = true;
+ }
+ }
+
+ if (valueSelected) {
+ data += "FF00000000000000";
+
+ downloadGCT(data, document.getElementById("gameID").value + ".gct");
+ } else {
+ alert("No cheat(s) selected!");
+ }
+}
+
+function updateCodelist() {
+ resetDescription();
+ document.getElementById("gameID").disabled = true;
+ button = document.getElementById("downloadButton");
+ button.style.visibility = "visible";
+ button.style.transitionDuration = "0s";
+ button.style.opacity = "0";
+ button.disabled = true;
+ document.getElementById("checkList").innerHTML = "";
+ var gameVersion = document.getElementById("gameID").value;
+ parseXML(gameVersion);
+}
+
+function updateDescription($this) {
+ document.getElementById("descriptionBox").innerHTML = "
" +
+ $this.getAttribute("data-codeName") + " Author(s): " +
+ $this.getAttribute("data-codeAuthor") + " Version: " +
+ $this.getAttribute("data-codeVersion") + " (" +
+ $this.getAttribute("data-codeDate") + ")
" + "Description: " +
+ $this.getAttribute("data-codeDesc") + "
";
+}
+
+function resetDescription() {
+ document.getElementById("descriptionBox").innerHTML = "
Select your codes from the list... ";
+}
+
+function updateChangelog() {
+ 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");
+
+ for (var i = 0; i < changelogData.length; i++) {
+ document.getElementById("changelog").innerHTML += "" + changelogData[i].getElementsByTagName("date")[0].textContent + ": " + changelogData[i].getElementsByTagName("change")[0].textContent + " ";
+ }
+ };
+ }
+ xml.open("GET", file);
+ xml.send();
+}
\ No newline at end of file
diff --git a/guide.html b/guide.html
index c5a365f..5ad8089 100644
--- a/guide.html
+++ b/guide.html
@@ -7,7 +7,7 @@
SMS GCT Generator
-
+
How to install and use practice codes
This page is a simple guide to explain the recommended way to install practice codes on your Nintendo Wii.
diff --git a/index.html b/index.html
index 286d1c7..e50c02a 100644
--- a/index.html
+++ b/index.html
@@ -6,128 +6,33 @@
SMS GCT Generator
-
+
-
+
-
Mario Sunshine Cheatfile Generator (Guide ) by Psy & Milk
-
-
+
+
+
Mario Sunshine Cheatfile Generator
+
+
Authors: Psy & Milk
+ Last Updated: Oct 18, 2017
+
Description: This is a cheatfile generator for SMS Speedrun practice. A guide on how to use the generator and cheatfiles on your Wii can be found here: Guide
+
+
Changelog:
+
diff --git a/style/style.css b/style/style.css
index 1b512a3..02241a0 100644
--- a/style/style.css
+++ b/style/style.css
@@ -24,6 +24,11 @@ body button {
cursor: pointer;
margin-top: 10px;
outline: none;
+ -webkit-transition: all 0s ease-out 0s;
+ -moz-transition: all 0s ease-out 0s;
+ -ms-transition: all 0s ease-out 0s;
+ -o-transition: all 0s ease-out 0s;
+ transition: all 0s ease-out 0s;
}
img {
border-radius: 4px;
@@ -47,8 +52,13 @@ ul li {
-ms-user-select: none;
user-select: none;
outline: none;
+ -webkit-animation: fadein .8s;
+ -moz-animation: fadein .8s;
+ -ms-animation: fadein .8s;
+ -o-animation: fadein .8s;
+ animation: fadein .8s;
}
-ul li::before {
+ul li::before {
content: '';
position: absolute;
border-color: #a6a6a6;
@@ -60,10 +70,10 @@ ul li::before {
height: 15px;
width: 15px;
}
-ul li:nth-child(odd) {
+ul li:nth-child(odd) {
background: #fdfdfd;
}
-ul li:hover {
+ul li:hover {
/*background: #ddd;*/
background: #565656;
@@ -101,28 +111,88 @@ ul li.checked::before {
outline: none;
}
.framed {
- margin: 30px 0 10px 0;
+ margin: 10px 0px 10px 0;
padding: 0px 12px 12px 12px;
+ background-color: #111;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 18px;
border-color: #fff;
border-style: solid;
border-width: 1px;
border-radius: 4px;
width: 500px;
- /*min-height: 300px;*/
+ min-height: 150px;
+ -webkit-animation: fadein 1s;
+ -moz-animation: fadein 1s;
+ -ms-animation: fadein 1s;
+ -o-animation: fadein 1s;
+ animation: fadein 1s;
}
#guide_content {
- clear:both;
- background-color:#111;
- width:100%;
- max-width:960px;
- overflow:hidden;
- border:1px solid #333;
+ clear: both;
+ background-color: #111;
+ width: 100%;
+ max-width: 960px;
+ overflow: hidden;
+ border: 1px solid #333;
margin: 30px 0 10px 0;
- padding: 0px 12px 12px 12px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 22px;
+ padding: 0px 12px 12px 12px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 22px;
+}
+.hidden {
+ opacity: 0;
}
a {
- color: pink;
+ color: pink;
+}
+@keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+/* Firefox < 16 */
+
+@-moz-keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+/* Safari, Chrome and Opera > 12.1 */
+
+@-webkit-keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+/* Internet Explorer */
+
+@-ms-keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+/* Opera < 12.1 */
+
+@-o-keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
}
\ No newline at end of file