mirror of
https://github.com/db48x/emularity.git
synced 2026-09-15 02:52:57 +00:00
177 lines
5.8 KiB
JavaScript
177 lines
5.8 KiB
JavaScript
var ar = new Array(33,34,35,36,37,38,39,40);
|
|
|
|
function getfullscreenenabler() {
|
|
return canvas.webkitRequestFullScreen || canvas.mozRequestFullScreen || canvas.requestFullScreen;
|
|
}
|
|
|
|
function getpointerlockenabler() {
|
|
return canvas.requestPointerLock || canvas.mozRequestPointerLock || canvas.webkitRequestPointerLock;
|
|
}
|
|
|
|
function isfullscreensupported() {
|
|
return !!(getfullscreenenabler());
|
|
}
|
|
|
|
function gofullscreen() {
|
|
Module.requestFullScreen(1,0);
|
|
}
|
|
|
|
function keypress(e) {
|
|
if (typeof(loader_game)=='object' && !loader_game.started)
|
|
return true; // Don't ignore certain keys yet (until game started by "click to play")
|
|
|
|
var key = e.which;
|
|
if($.inArray(key,ar) > -1) {
|
|
e.preventDefault(); //Don't let arrow, pg up/down, home, end affect page position
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
window.onkeydown = keypress;
|
|
|
|
(function() {
|
|
function get(name) {
|
|
if (typeof(loader_game)=='object')
|
|
return loader_game[name]; //alternate case where dont have CGI args to parse...
|
|
if ((name = (new RegExp('[?&]'+encodeURIComponent(name)+'=([^&]*)')).exec(location.search))) {
|
|
return decodeURIComponent(name[1]);
|
|
}
|
|
}
|
|
|
|
var games;
|
|
var emulator;
|
|
|
|
function init() {
|
|
ready();
|
|
}
|
|
|
|
function ready() {
|
|
var fullscreenbutton = document.getElementById('gofullscreen');
|
|
if (isfullscreensupported()) {
|
|
fullscreenbutton.addEventListener('click', gofullscreen);
|
|
if ('onfullscreenchange' in document) {
|
|
document.addEventListener('fullscreenchange', DOSBOX.fullScreenChangeHandler);
|
|
} else if ('onmozfullscreenchange' in document) {
|
|
document.addEventListener('mozfullscreenchange', DOSBOX.fullScreenChangeHandler);
|
|
} else if ('onwebkitfullscreenchange' in document) {
|
|
document.addEventListener('webkitfullscreenchange', DOSBOX.fullScreenChangeHandler);
|
|
}
|
|
} else {
|
|
fullscreenbutton.disabled = true;
|
|
}
|
|
var canvas = document.getElementById('canvas');
|
|
emulator = new DOSBOX(canvas).setscale(get('scale') ? parseFloat(get('scale')) : 1)
|
|
.setgame(loader_game === 'NONE' ? null
|
|
: loader_game)
|
|
.start();
|
|
disableRightClickContextMenu(canvas);
|
|
|
|
// Emscripten doesn't use the proper prefixed functions for fullscreen requests,
|
|
// so let's map the prefixed versions to the correct function.
|
|
canvas.requestPointerLock = getpointerlockenabler();
|
|
|
|
if (get('autostart')) {
|
|
emulator.start();
|
|
}
|
|
// Gamepad text
|
|
if (detectgamepadsupport()) {
|
|
var gamepadDiv = document.getElementById('gamepadtext');
|
|
gamepadDiv.innerHTML = "No gamepads detected. Press a button on a gamepad to use it.";
|
|
listenforgamepads(function(gamepads, newgamepad) {
|
|
var s = (gamepads.length === 1 ? '' : 's');
|
|
gamepadDiv.innerHTML = gamepads.length + ' gamepad'+s+' detected. If the game does not ' +
|
|
'respond to your gamepad'+s+', refresh the browser and try again.';
|
|
if (emulator.hasStarted) {
|
|
gamepadDiv.innerHTML += "<br />Restart MESS to use new gamepads.";
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Disables the right click menu for the given element.
|
|
*/
|
|
function disableRightClickContextMenu(element) {
|
|
element.addEventListener('contextmenu', function(e) {
|
|
if (e.button == 2) {
|
|
// Block right-click menu thru preventing default action.
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
}
|
|
|
|
function switchgame(e) {
|
|
emulator.setgame(getgameurl(e.target.value));
|
|
}
|
|
|
|
// Firefox will not give us Joystick data unless we register this NOP
|
|
// callback.
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=936104
|
|
addEventListener("gamepadconnected", function() {});
|
|
var getgamepads = navigator.getGamepads || navigator.webkitGamepads ||
|
|
navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads;
|
|
/**
|
|
* Does the current browser support the Gamepad API?
|
|
* Returns a boolean.
|
|
*/
|
|
function detectgamepadsupport() {
|
|
return typeof getgamepads === 'function';
|
|
}
|
|
// The timer that listens for gamepads, in case we ever want to stop it.
|
|
var gamepadlistener;
|
|
/**
|
|
* Listens for new gamepads, and triggers the callback when it detects a
|
|
* change.
|
|
* The callback is passed an array of active gamepads.
|
|
*/
|
|
function listenforgamepads(cb, freq) {
|
|
// NOP if the browser doesn't support gamepads.
|
|
if (!detectgamepadsupport()) return;
|
|
// Map from gamepad id to gamepad information.
|
|
var prevgamepads = {};
|
|
// DEFAULT: Check gamepads every second.
|
|
if (typeof freq === 'undefined') freq = 1000;
|
|
gamepadlistener = setInterval(function() {
|
|
// Browsers get cranky when you don't apply this on the navigator object.
|
|
var gamepads = getgamepads.apply(navigator);
|
|
var currentgamepads = {};
|
|
var i;
|
|
var hasChanged = false;
|
|
for (i = 0; i < gamepads.length; i++) {
|
|
var gamepad = gamepads[i];
|
|
if (gamepad != null) {
|
|
currentgamepads[gamepad.id] = gamepad;
|
|
if (!prevgamepads.hasOwnProperty(gamepad.id)) {
|
|
// Gamepad has been added.
|
|
hasChanged = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Has a gamepad been removed?
|
|
if (!hasChanged) {
|
|
for (var gamepadid in prevgamepads) {
|
|
if (!currentgamepads.hasOwnProperty(gamepadid)) {
|
|
hasChanged = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
prevgamepads = currentgamepads;
|
|
|
|
if (hasChanged) {
|
|
// Actual gamepads, filtered from gamepads. Chrome puts empty items into
|
|
// its gamepadlist.
|
|
var actualgamepads = [];
|
|
for (i = 0; i < gamepads.length; i++) {
|
|
if (gamepads[i] != null) actualgamepads.push(gamepads[i]);
|
|
}
|
|
cb(actualgamepads);
|
|
}
|
|
}, freq);
|
|
}
|
|
|
|
window.addEventListener('load', init);
|
|
})();
|