259 lines
8.1 KiB
JavaScript
Executable File
259 lines
8.1 KiB
JavaScript
Executable File
// "use strict";
|
|
/*
|
|
* This file is part of IodineGBA
|
|
*
|
|
* Copyright (C) 2012-2013 Grant Galitz
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* version 2 as published by the Free Software Foundation.
|
|
* The full license is available at http://www.gnu.org/licenses/gpl.html
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*/
|
|
var KEY_MAP = {
|
|
ST: 13,
|
|
SE: 16,
|
|
A: [88, 74],
|
|
B: [90, 81, 89],
|
|
Y: 50,
|
|
X: 49,
|
|
AB: [88, 74,90, 81, 89],
|
|
UP: 38,
|
|
DOWN: 40,
|
|
LEFT: 37,
|
|
RIGHT: 39,
|
|
L_D: [37, 40],
|
|
L_U: [37, 38],
|
|
R_D: [39, 40],
|
|
R_U: [39, 38]
|
|
};
|
|
window.vm = {
|
|
oldDire: null,
|
|
keyEvent: function(t, e, i) {
|
|
var r = KEY_MAP[t];
|
|
Array.isArray(r) ? (vm.simulateKeyPress(r[0], e), vm.simulateKeyPress(r[1], e)) : vm.simulateKeyPress(r, e)
|
|
},
|
|
initCtrl: function() {
|
|
var s;
|
|
vm.initGameDireCtrl(function(t, e) {
|
|
var i = -1 == t ? s : ["DOWN", "L_D", "LEFT", "L_U", "UP", "R_U", "RIGHT", "R_D"][t],
|
|
r = -1 == t;
|
|
s && (s != i || r) && vm.keyEvent(s, "keyup", e), s = i, !r && vm.keyEvent(i, "keydown", e)
|
|
}), vm.initGameKeyCtrl(), $(".ctrl-wrap").on("click contextmenu touchstart touchmove touchend touchcancel tap", function(t) {
|
|
return t.stopPropagation(), t.preventDefault(), !1
|
|
})
|
|
},
|
|
initGameDireCtrl: function(u) {
|
|
var d = this,
|
|
t = $(".dire-wrap"),
|
|
p = $(".dc-centre"),
|
|
e = $(".dire-ctrl"),
|
|
l = $(".dc-dire"),
|
|
i = e.offset(),
|
|
n = i.top,
|
|
a = i.left,
|
|
f = p.width() / 2,
|
|
m = e.width() / 2,
|
|
r = function() {
|
|
p.css({
|
|
transform: "translate3d(83px,83px,0)"
|
|
}), p.css("opacity", "1"), l.css("opacity", "0")
|
|
},
|
|
y = function(t, e) {
|
|
var i = t[e];
|
|
if (!i) return {
|
|
x: 160,
|
|
y: 500
|
|
};
|
|
var r = i.pageX - a,
|
|
s = i.pageY - n;
|
|
return 600 < s ? y(t, e + 1) : {
|
|
x: r,
|
|
y: s
|
|
}
|
|
};
|
|
r(), t.on("touchstart touchmove", function(t) {
|
|
var e, i, r = y(t.touches, 0),
|
|
s = r.x,
|
|
n = r.y,
|
|
a = Math.atan2(n - m, s - m) / (Math.PI / 180);
|
|
if (l.css("transform", "rotate(" + a + "deg)"), d.onCtrlDire(a, u), (e = m - s, i = m - n, Math.sqrt(e * e + i * i)) <= 86) {
|
|
var o = s - f,
|
|
h = n - f;
|
|
p.css("transform", "translate3d(" + o + "px," + h + "px,0)")
|
|
} else {
|
|
var c = a * Math.PI / 180;
|
|
o = m + 86 * Math.cos(c) - f, h = m + 86 * Math.sin(c) - f;
|
|
p.css("transform", "translate3d(" + o + "px," + h + "px,0)")
|
|
}
|
|
"touchstart" === t.type && (p.css("opacity", "0.8"), l.css("opacity", "0.6"))
|
|
}).on("touchend", function() {
|
|
r(), u(-1, 0), d.oldDire = -1
|
|
})
|
|
},
|
|
initGameKeyCtrl: function() {
|
|
var s = this;
|
|
$(".key-btn").bind("touchstart touchend", function(t) {
|
|
var e = $(t.target),
|
|
i = e.attr("data-key"),
|
|
r = "touchstart" === t.type;
|
|
s.keyEvent(i, r ? "keydown" : "keyup", 0), e[r ? "addClass" : "removeClass"]("btn-on")
|
|
})
|
|
},
|
|
onCtrlDire: function(t, e) {
|
|
this.onCtrlDire;
|
|
var i = Math.round((t + 180) / 45) % 8;
|
|
this.oldDire != i && (e(i, t), this.oldDire = i)
|
|
},
|
|
simulateKeyPress: function(t, e) {
|
|
if(e=="keydown"){
|
|
keyDown({keyCode:t});
|
|
}
|
|
else{
|
|
keyUpPreprocess({keyCode:t});
|
|
}
|
|
// var i = $.Event(e);
|
|
// i.keyCode = t, i.which = i.keyCode, $(window).trigger(i)
|
|
}
|
|
};
|
|
var Iodine = null;
|
|
var Blitter = null;
|
|
var Mixer = null;
|
|
var MixerInput = null;
|
|
var timerID = null;
|
|
window.onload = function () {
|
|
// if (!games[location.hash.substr(1)]) {
|
|
// alert("Invalid game request!");
|
|
// return;
|
|
// }
|
|
//Initialize Iodine:
|
|
Iodine = new GameBoyAdvanceEmulator();
|
|
//Initialize the graphics:
|
|
registerBlitterHandler();
|
|
//Initialize the audio:
|
|
registerAudioHandler();
|
|
//Register the save handler callbacks:
|
|
registerSaveHandlers();
|
|
//Hook the GUI controls.
|
|
registerGUIEvents();
|
|
//Enable Sound:
|
|
Iodine.enableAudio();
|
|
//Download the BIOS:
|
|
downloadBIOS();
|
|
vm.initCtrl()
|
|
}
|
|
|
|
function getParameter (t) {
|
|
var e = window.location.search,
|
|
i = new RegExp(t + "=([^&?]*)", "ig");
|
|
return e.match(i) ? e.match(i)[0].substr(t.length + 1) : null
|
|
}
|
|
|
|
function downloadBIOS() {
|
|
downloadFile("Binaries/gba_bios.bin", registerBIOS);
|
|
}
|
|
function registerBIOS() {
|
|
processDownload(this, attachBIOS);
|
|
downloadROM();
|
|
}
|
|
function downloadROM() {
|
|
Iodine.pause();
|
|
showTempString("Downloading");
|
|
var gameId = getParameter("id")
|
|
var path = "http://h5games-al.kingsome.cn/emulator-static/roms/" + gameId + ".zip"
|
|
downloadFileRemote(path,registerROM2);
|
|
// downloadFile("Binaries/" + gamename + ".gba", registerROM);
|
|
}
|
|
function attachROM2(ROM) {
|
|
JSZip.loadAsync(ROM).then((zip)=>{
|
|
console.log(zip)
|
|
for (var x in zip.files) {
|
|
zip.file(x).async("uint8array").then((gamedt)=>{
|
|
Iodine.attachROM(gamedt);
|
|
Iodine.play();
|
|
});
|
|
break;
|
|
}
|
|
})
|
|
|
|
}
|
|
function registerROM2() {
|
|
clearTempString();
|
|
processDownload(this, attachROM2);
|
|
// if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i)) {
|
|
// Iodine.disableAudio();
|
|
// }
|
|
// Iodine.disableAudio();
|
|
// Iodine.play();
|
|
}
|
|
// function registerROM() {
|
|
// clearTempString();
|
|
// processDownload(this, attachROM);
|
|
// if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i)) {
|
|
// Iodine.disableAudio();
|
|
// }
|
|
// // Iodine.disableAudio();
|
|
// Iodine.play();
|
|
// }
|
|
function registerBlitterHandler() {
|
|
Blitter = new GlueCodeGfx();
|
|
Blitter.attachCanvas(document.getElementById("screen"));
|
|
Blitter.setSmoothScaling(false);
|
|
Iodine.attachGraphicsFrameHandler(function (buffer) {Blitter.copyBuffer(buffer);});
|
|
}
|
|
function registerAudioHandler() {
|
|
Mixer = new GlueCodeMixer();
|
|
MixerInput = new GlueCodeMixerInput(Mixer);
|
|
Iodine.attachAudioHandler(MixerInput);
|
|
}
|
|
function registerGUIEvents() {
|
|
addEvent("keydown", document, keyDown);
|
|
addEvent("keyup", document, keyUpPreprocess);
|
|
addEvent("unload", window, ExportSave);
|
|
Iodine.attachSpeedHandler(function (speed) {
|
|
document.title = ""
|
|
});
|
|
}
|
|
function lowerVolume() {
|
|
Iodine.incrementVolume(-0.04);
|
|
}
|
|
function raiseVolume() {
|
|
Iodine.incrementVolume(0.04);
|
|
}
|
|
function writeRedTemporaryText(textString) {
|
|
if (timerID) {
|
|
clearTimeout(timerID);
|
|
}
|
|
showTempString(textString);
|
|
timerID = setTimeout(clearTempString, 5000);
|
|
}
|
|
function showTempString(textString) {
|
|
document.getElementById("tempMessage").style.display = "block";
|
|
document.getElementById("tempMessage").textContent = textString;
|
|
}
|
|
function clearTempString() {
|
|
document.getElementById("tempMessage").style.display = "none";
|
|
}
|
|
//Some wrappers and extensions for non-DOM3 browsers:
|
|
function addEvent(sEvent, oElement, fListener) {
|
|
try {
|
|
oElement.addEventListener(sEvent, fListener, false);
|
|
}
|
|
catch (error) {
|
|
oElement.attachEvent("on" + sEvent, fListener); //Pity for IE.
|
|
}
|
|
}
|
|
function removeEvent(sEvent, oElement, fListener) {
|
|
try {
|
|
oElement.removeEventListener(sEvent, fListener, false);
|
|
}
|
|
catch (error) {
|
|
oElement.detachEvent("on" + sEvent, fListener); //Pity for IE.
|
|
}
|
|
}
|