diff --git a/.github/ISSUE_TEMPLATE/bug---beta.md b/.github/ISSUE_TEMPLATE/bug---beta.md new file mode 100644 index 0000000..30a958e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug---beta.md @@ -0,0 +1,24 @@ +--- +name: bug - beta +about: Use this when you find a problem with the beta emulator cores +title: "[beta]" +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..3de0e09 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,24 @@ +--- +name: bug +about: Use this when you find a bug and you are not using the beta cores +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..e46a4c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,10 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/README.md b/README.md index 1c760c0..7c4fe92 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,15 @@ Self-hosted **Javascript** emulation for various system. *The* ***Screen Recording*** *option currently doesn't support* ***Audio*** *.* +The **beta** version of the emulator core files are now avaliable. (For limited systems)
+If you would like to use it, please add the following line to your code. + +```js +EJS_BETA = true; +``` + +When reporting bugs, please specify that you are using the beta version + --- **⸢ [Example Use] ⸥ ⸢ [Emulator Demo] ⸥ ⸢ [Beta] ⸥** @@ -71,8 +80,15 @@ EJS_gameID = 1;
-*I have successfully rewrote the server side portion*
-*of netplay, which you can now use to self host!* +by default, the netplay server url will be `emulatorjs.herokuapp.com`, but to default to the default `ws.emulatorjs.com` server add the following line + +```js +EJS_oldEJSNetplayServer = true; +``` + +
+ +*To self host:* 1. Download the **[Server]**. @@ -84,13 +100,13 @@ EJS_netplayUrl = 'http://localhost:3000/'; // Absolute Url To Your Netplay Serve
-##### Custom Saves +##### Custom Save Filename To customize the filename of save states
simply add the following lines of code. ```js -EJS_gameName = `Game Name`; +EJS_gameName = 'Game Name'; ``` **➞ Save Filename:** `Game Name.state` @@ -103,7 +119,7 @@ To place an advertisement in front of the
`play now` screen, include the following line: ```js -EJS_AdUrl = `URL`; +EJS_AdUrl = 'URL'; ```
@@ -147,17 +163,23 @@ EJS_paths = {
+##### Localization + +please see [data/localization/readme.md](the localization readme) + +
+ ##### USING MAME SYSTEM you must add the line -``` +```js EJS_core = 'mame'; ``` and the line -``` +```js EJS_mameCore = '' // mame core options (example: '4|0') ``` set the mame core value to the mame core number (`1` - `6`) + `|` + save states supported (`0` or `1`) @@ -168,6 +190,8 @@ set the mame core value to the mame core number (`1` - `6`) + `|` + save states Licenced under the Apache License 2.0 +Please state changes and the licence when re-distributing + Read the whole license [here](LICENSE) diff --git a/data/emu-main.js b/data/emu-main.js index debfb48..fcdc879 100644 --- a/data/emu-main.js +++ b/data/emu-main.js @@ -455,7 +455,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { 'wasm': 'undefined' != typeof WebAssembly && _0x1e2c68.object(WebAssembly), 'audioContext': 'undefined' != typeof AudioContext }; - + function _0x55cbbe(_0x43ca9d, _0x1fbf80, _0x332d13) { return _0x1fbf80 in _0x43ca9d ? Object.defineProperty(_0x43ca9d, _0x1fbf80, { 'value': _0x332d13, @@ -2082,7 +2082,7 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } 'undefined' != typeof EJS_CUSTOM_COREFILE && (_0x2458d5 = EJS_CUSTOM_COREFILE); _0x24de8d.db ? _0x24de8d.get(_0x2458d5, function(_0x47a6fd) { - if (_0x47a6fd && _0x47a6fd.version === _0x124167 && false) { + if (_0x47a6fd && _0x47a6fd.version === _0x124167 && !('undefined' != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX)) { if (_0xc6823.coreVer === 2) { _0x4f0fcc(_0x47a6fd.data); } else { @@ -2529,14 +2529,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } if (type === 'save') { try { - if (this.coreVer === 2) { - _0x378b5c.saveState().then(function(data) { - _0x378b5c.saveLoaddbDB.put(key, data); - }) - } else { - var data = _0x378b5c.saveState(); - _0x378b5c.saveLoaddbDB.put(key, data); - } + var data = _0x378b5c.saveState(); + _0x378b5c.saveLoaddbDB.put(key, data); } catch(e) {return false;}; } else { _0x378b5c.saveLoaddbDB.get(key).then(function(data) { @@ -3804,10 +3798,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } } _0x17edbf.on('end', function(_0x27f006, _0x1fb527) { - _0x378b5c.syncInput(0, inputs[4], 0); - _0x378b5c.syncInput(0, inputs[5], 0); - _0x378b5c.syncInput(0, inputs[6], 0); - _0x378b5c.syncInput(0, inputs[7], 0); + _0x378b5c.syncInput(0, inputs()[4], 0); + _0x378b5c.syncInput(0, inputs()[5], 0); + _0x378b5c.syncInput(0, inputs()[6], 0); + _0x378b5c.syncInput(0, inputs()[7], 0); }); _0x17edbf.on('move', function(_0x1b060e, _0x4ae7d6) { var _0x2c1832 = _0x4ae7d6.angle.degree; @@ -4038,8 +4032,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { var options = {}; } _0xa88a13.recordData.stream = _0x27f4c4.Module.canvas.captureStream(30); + //_0xa88a13.recordData.stream.addTrack(); // TODO - find audio element _0xa88a13.recordData.recorder = new MediaRecorder(_0xa88a13.recordData.stream, options); - //_0xa88a13.recordData.recorder.addTrack() // TODO - find audio element _0xa88a13.recordData.recorder.ondataavailable = function(e) { if (e.data.size > 0) { _0xa88a13.recordData.data.push(e.data) @@ -4047,7 +4041,10 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { if (_0xa88a13.recordData.stopped) { var a = document.createElement("a") a.href = window.URL.createObjectURL(new Blob(_0xa88a13.recordData.data, {type: "video/webm"})) - a.download = 'record.webm' + if (typeof _0xa88a13.gameName == 'string') { + var aname = _0xa88a13.gameName + } + a.download = aname ? '' .concat(aname, '-recording.webm') : 'record.webm'; a.click() window.URL.revokeObjectURL(a.href) delete _0xa88a13.recordData @@ -4186,93 +4183,48 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { return _0x762355(_0x433182); } _0x378b5c.getStateInfo = _0x27f4c4.Module.cwrap('get_state_info', 'string', []); - if (_0xa88a13.coreVer === 2) { - _0x378b5c.saveStateToFile = _0x27f4c4.Module.cwrap('cmd_save_state', 'null', []); - } _0x378b5c.saveState = function() { - if (_0xa88a13.coreVer === 2) { - _0x378b5c.saveStateToFile(); - var length; - var asd = 50; - return new Promise(function(resolve, reject) { - var a = setInterval(function() { - try { - var data = _0x27f4c4.FS.readFile('save.state'); - } catch(e) {return;} - if (data.length === 0 || length === 0 || length !== data.length) { - length = data.length; - asd = 50; - return; - } - if (asd > 0) { - asd--; - return; - } - clearInterval(a); - _0x27f4c4.FS.unlink('save.state'); - resolve(data); - }, 100) - }) - } else { - var _0xa88a14, _0x17edbf = _0x378b5c.getStateInfo().split('|'), - _0x2c1832 = _0x17edbf[0x0] >> 0x0; - if (_0x2c1832 > 0x0) { - _0xa88a14 = new Uint8Array(_0x2c1832); - for (var _0x2ef6be = _0x17edbf[0x1] >> 0x0, _0x3cc34b = 0x0; _0x3cc34b < _0x2c1832; _0x3cc34b++) _0xa88a14[_0x3cc34b] = _0x27f4c4.Module.getValue(_0x2ef6be + _0x3cc34b); - } - return _0xa88a14; + var _0xa88a14, _0x17edbf = _0x378b5c.getStateInfo().split('|'), + _0x2c1832 = _0x17edbf[0x0] >> 0x0; + if (_0x2c1832 > 0x0) { + _0xa88a14 = new Uint8Array(_0x2c1832); + for (var _0x2ef6be = _0x17edbf[0x1] >> 0x0, _0x3cc34b = 0x0; _0x3cc34b < _0x2c1832; _0x3cc34b++) _0xa88a14[_0x3cc34b] = _0x27f4c4.Module.getValue(_0x2ef6be + _0x3cc34b); } + return _0xa88a14; }; var _0x25a7a2 = _0x27f4c4.Module.cwrap('load_state', 'number', ['string', 'number']); _0x378b5c.loadState = function(_0x4389ae, _0x1d4918) { var _0x91cd69; _0x91cd69 = _0x4389ae; + try { + _0x27f4c4.FS.unlink('game.state'); + } catch(e){} _0x27f4c4._FS.createDataFile('/', 'game.state', _0x91cd69, true, true); null === _0x1d4918 && (_0x1d4918 = 0); - if ('arcade' === _0x17edbf && _0xa88a13.coreVer !== 2) { + if ('arcade' === _0x17edbf) { setTimeout(function() { _0x378b5c.getStateInfo(); _0x25a7a2('game.state', _0x1d4918); _0x27f4c4.FS.unlink('game.state'); }, 0xa) - } else if (_0xa88a13.coreVer === 2) { - setTimeout(function() { - _0x25a7a2('game.state', _0x1d4918); - setTimeout(function() { - _0x27f4c4.FS.unlink('game.state'); - }, 100) - }, 10) } else { _0x25a7a2('game.state', _0x1d4918); - _0x27f4c4.FS.unlink('game.state'); + setTimeout(function() { + _0x27f4c4.FS.unlink('game.state'); + }, 100) } - if (_0xa88a13.coreVer === 2) { - if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { - var _0x227419 = new File([_0x91cd69], '0-game.state', { - 'type': '', - 'lastModified': new Date() - }); - _0x378b5c.connection.shareFile(_0x227419); - _0x378b5c.inputsData = {}; - _0x378b5c.wait = true; - _0x378b5c.systemPause(0x1); - _0x27f4c4.Module.pauseMainLoop(); - _0x378b5c.disableControl(true); - } - } else { - if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { - for (var _0x54607c = _0x378b5c.getStateInfo().split('|'), _0x1ab9c9 = _0x54607c[0x0] >> 0x0, _0xce58ec = (_0x54607c[0x2], new Uint8Array(_0x1ab9c9)), _0x4aff4f = _0x54607c[0x1] >> 0x0, _0x3bfae0 = 0x0; _0x3bfae0 < _0x1ab9c9; _0x3bfae0 += 0x1) _0xce58ec[_0x3bfae0] = _0x27f4c4.Module.getValue(_0x4aff4f + _0x3bfae0); - var _0x227419 = new File([_0xce58ec], '0-game.state', { - 'type': '', - 'lastModified': new Date() - }); - _0x378b5c.connection.shareFile(_0x227419); - _0x378b5c.inputsData = {}; - _0x378b5c.wait = true; - _0x378b5c.systemPause(0x1); - _0x27f4c4.Module.pauseMainLoop(); - _0x378b5c.disableControl(true); - } + if (_0x378b5c.connected && _0x378b5c.connection.isInitiator) { + for (var _0x54607c = _0x378b5c.getStateInfo().split('|'), _0x1ab9c9 = _0x54607c[0x0] >> 0x0, _0xce58ec = (_0x54607c[0x2], new Uint8Array(_0x1ab9c9)), _0x4aff4f = _0x54607c[0x1] >> 0x0, _0x3bfae0 = 0x0; _0x3bfae0 < _0x1ab9c9; _0x3bfae0 += 0x1) _0xce58ec[_0x3bfae0] = _0x27f4c4.Module.getValue(_0x4aff4f + _0x3bfae0); + var _0x227419 = new File([_0xce58ec], '0-game.state', { + 'type': '', + 'lastModified': new Date() + }); + _0x378b5c.connection.shareFile(_0x227419); + _0x378b5c.inputsData = {}; + _0x378b5c.wait = true; + _0x378b5c.systemPause(0x1); + _0x27f4c4.Module.pauseMainLoop(); + _0x378b5c.disableControl(true); } _0xa88a13.elements.container.focus(); }; @@ -4301,25 +4253,13 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x27f4c4.FS.unlink(name); } catch (_0x4b4d4c) {} try { - if (_0xa88a13.coreVer === 2) { - _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = 'SAVING STATE TO SLOT ' + slot; - _0x378b5c.saveState().then(function(data) { - _0x27f4c4._FS.createDataFile('/', name, data, true, true); - _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = 'STATE SAVED TO SLOT ' + slot; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) - }); - } else { - var _0x17edbf = _0x378b5c.saveState(); - _0x27f4c4._FS.createDataFile('/', name, _0x17edbf, true, true); - _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = 'STATE SAVED TO SLOT ' + slot; - clearTimeout(_0x378b5c.saveMsgTransitions); - _0x378b5c.saveMsgTransitions = setTimeout(function() { - _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = ''; - }, 1500) - } + var _0x17edbf = _0x378b5c.saveState(); + _0x27f4c4._FS.createDataFile('/', name, _0x17edbf, true, true); + _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = 'STATE SAVED TO SLOT ' + slot; + clearTimeout(_0x378b5c.saveMsgTransitions); + _0x378b5c.saveMsgTransitions = setTimeout(function() { + _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = ''; + }, 1500) } catch(e) { _0xa88a13.elements.widgets.stateInfoDiv.innerHTML = 'FAILED TO SAVE STATE TO SLOT ' + slot; clearTimeout(_0x378b5c.saveMsgTransitions); @@ -4351,19 +4291,8 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { var name = slot + '-quick.state'; var success = true; try { - if (_0xa88a13.coreVer === 2) { - var data = _0x27f4c4.FS.readFile(name); - _0x27f4c4.FS.writeFile('/game.state', data); - setTimeout(function() { - _0x25a7a2(name, 0); - setTimeout(function() { - _0x27f4c4.FS.unlink('game.state'); - }, 100) - }, 10) - } else { - _0x25a7a2(name, 0); - } - if ('arcade' === _0x17edbf && _0xa88a13.coreVer !== 2) { + _0x25a7a2(name, 0); + if ('arcade' === _0x17edbf) { setTimeout(function() { _0x378b5c.getStateInfo(); _0x25a7a2(name, 0x0); @@ -5008,6 +4937,9 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { default: _0xa88a13 = {}, console.warn('Unsupported emulator'); } + if (this.coreVer === 2) { + _0xa88a13 = {}; + } if (this.statesSupported === true) { _0xa88a13['save-state-slot'] = { 'label': this.localization('Save State Slot'), @@ -5650,7 +5582,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { } addContextHtml(_0xa88a13.localization('Take Screenshot'), false, function(_0x20faaa) { var _0x4e898a = _0x378b5c.getScreenData(); - _0x4e4ca6()(new Blob([_0x4e898a]), 'game.png'); + if (typeof _0xa88a13.gameName == 'string') { + var gamep = _0xa88a13.gameName + } + var gamepng = gamep ? '' .concat(gamep, '-screenshot.png') : 'game.png'; + _0x4e4ca6()(new Blob([_0x4e898a]), gamepng); return false; }) addContextHtml(_0xa88a13.localization('Cache Manage'), true, function(_0x275730) { @@ -6163,12 +6099,11 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { _0x5ab74d.toggleControls.call(_0x17edbf, !0x1), _0x132da7(_0x2c1832.dialogs.gamepad, !0x1); }, 'mute'), this.bind(_0x2c1832.buttons.saveState, 'click', function() { _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'savestate-start', !0x1, {}); - _0xdcec2a.saveState().then(function(_0x31e271) { - var _0x2c1832 = _0xdcec2a.getScreenData(); - _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'savestate', !0x1, { - 'state': _0x31e271, - 'screenshot': _0x2c1832 - }); + var _0x31e271 = _0xdcec2a.saveState(), + _0x2c1832 = _0xdcec2a.getScreenData(); + _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'savestate', !0x1, { + 'state': _0x31e271, + 'screenshot': _0x2c1832 }); }, 'mute'), this.bind(_0x2c1832.buttons.loadState, 'click', function() { _0xbae705.call(_0x17edbf, _0x17edbf.elements.container, 'loadstate', !0x1, {}); @@ -6299,14 +6234,12 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { var a = function(_0x154660, _0x15626f) { if (!(_0x154660 instanceof _0x15626f)) throw new TypeError('Cannot call a class as a function'); }(this, _0x6954aa); - this.version = _0x3d61f9.a; + this.version = '1.0'; this.system = ''; this.adUrl = null; this.gameName = null; this.loadStateOnStart = false; this.statesSupported = true; - this.listUrl = 'https://ws.emulatorjs.com/'; - this.socketUrl = 'wss://ws.emulatorjs.com/'; this.mameCore = null; this.startOnLoad = false; this.dataPath = ''; @@ -6325,13 +6258,15 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.game = this.game; this.game.innerHTML = ''; this.config = _0x5dc0c0({}, _0x39ca5e, _0x6954aa.defaults, _0x2ba0e6 || {}); - this.coreVer = function(core) { - if (false) { - return 2; + this.coreVer = function(core, useBeta) { + if (useBeta === true) { + if (window.WebAssembly) { + var supportedCores = ['nes', 'snes']; + return supportedCores.includes(core) ? 2 : 1; + } } - var supportedCores = ['nes', 'snes']; - return supportedCores.includes(core) ? 2 : 1; - }(this.config.system); // 2 = beta cores, 1 = old cores + return 1; + }(this.config.system, this.config.useBeta); // 2 = beta cores, 1 = old cores this.lightgun = this.config.lightgun; this.loadStateOnStart = this.config.loadStateOnStart || false; this.adUrl = this.config.adUrl || null; @@ -6340,8 +6275,17 @@ window.EJS_main = function(_0xa88a13, _0x17edbf, _0x2c1832) { this.multitap = this.config.multitap; this.cheats = this.config.cheats; this.cheats || (this.cheats = []); - this.listUrl = this.config.netplayUrl || 'https://ws.emulatorjs.com/'; - this.socketUrl = this.config.netplayUrl || 'wss://ws.emulatorjs.com/'; + var u = function(a, b) { + if (typeof b === 'string') { + return b; + } else if (a === true) { + return 'https://ws.emulatorjs.com/' + } else { + return 'https://emulatorjs.herokuapp.com/'; + } + }(this.config.oldNetplayServer, this.config.netplayUrl); + this.listUrl = u; + this.socketUrl = u; this.mameCore = this.config.mameCore || null; this.color = this.config.color; this.startOnLoad = this.config.startOnLoad || false; diff --git a/data/loader.js b/data/loader.js index 52aa0a6..55fbf9b 100644 --- a/data/loader.js +++ b/data/loader.js @@ -51,6 +51,8 @@ emu_main.onload = function() { 'undefined' != typeof EJS_core && (config.system = EJS_core) 'undefined' != typeof EJS_loadStateURL && (config.loadStateOnStart = EJS_loadStateURL) 'undefined' != typeof EJS_language && (config.lang = EJS_language) + 'undefined' != typeof EJS_oldEJSNetplayServer && (config.oldNetplayServer = EJS_oldEJSNetplayServer) + 'undefined' != typeof EJS_BETA && (config.useBeta = EJS_BETA) config.onsavestate = null config.onloadstate = null 'undefined' != typeof EJS_onSaveState && (config.onsavestate = EJS_onSaveState) diff --git a/data/localization/el-GR.json b/data/localization/el-GR.json new file mode 100644 index 0000000..454bf59 --- /dev/null +++ b/data/localization/el-GR.json @@ -0,0 +1,197 @@ +{ + "i18n": { + "restart": "Επανεκκίνηση", + "play": "Συνέχισε", + "pause": "Παύση", + "played": "Παίχτηκε", + "volume": "Ένταση", + "mute": "Σίγαση (F9)", + "unmute": "Αναίρεση σίγασης (F9)", + "enterFullscreen": "Πλήρης οθόνη", + "exitFullscreen": "Κλείσιμο πλήρους οθόνης", + "settings": "Ρυθμίσεις", + "saveState": "Αποθήκευση (Shift + F2)", + "loadState": "Φόρτωση (Shift + F4)", + "screenRecord": "Εγγραφή οθόνης", + "netplay": "Online παιχνίδι", + "gamepad": "Ρυθμίσεις χειρισμού", + "cheat": "Κωδικοί παιχνιδιού", + "menuBack": "Πίσω στο μενού", + "normal": "Κανονικό", + "all": "Όλα", + "reset": "Επαναφορά", + "disabled": "Απενεργοποιημένο", + "enabled": "Ενεργοποιημένο", + "playNow": "Παίξε τώρα" + }, + "normalOptions": { + "shader": { + "label": "Σκίαση", + "options": { + "disabled": "Απενεργοποιημένο", + "2xScaleHQ.glslp": "Κλίμακα x2", + "4xScaleHQ.glslp": "Κλίμακα x4", + "crt-easymode.glslp": "Λειτουργία οθόνης παλαιού τύπου απλή", + "crt-aperture.glslp": "Λειτουργία οθόνης παλαιού τύπου με άνοιγμα", + "crt-geom.glslp": "Λειτουργία οθόνης παλαιού τύπου με θόλο" + }, + "default": "disabled" + }, + "virtual-gamepad": { + "label": "Εικονικός μοχλός", + "options": { + "disabled": "Απενεργοποιημένο", + "enabled": "Ενεργοποιημένο" + }, + "default": "enabled" + } + }, + "Control Settings": "Ρυθμίσεις χειρισμού", + "Player 1": "Παίκτης 1", + "Player 2": "Παίκτης 2", + "Player 3": "Παίκτης 3", + "Player 4": "Παίκτης 4", + "Update": "Ενημέρωση", + "Reset": "Επαναφορά", + "Clear": "Καθαρισμός", + "Cancel": "Ακύρωση", + "Close": "Κλείσιμο", + "Empty": "Άδειασμα", + "Loading": "Φορτώνει", + "Submit": "Υποβολή", + "Description": "Περιγραφή", + "Code": "Κωδικός", + "Add Cheat Code": "Προσθήκη κωδικού παιχνιδιού", + "OK": "Εντάξει", + "Add Cheat": "Προσθήκη κωδικού", + "Cache Manager": "Διαχείριση μνήμης", + "Press keyboard or gamepad": "Πατήστε στο πληκτρολόγιο ή στο μοχλό", + "Gamepad": "Μοχλός", + "Keyboard": "Πληκτρολόγιο", + "Set": "Διαμόρφωση", + "QUICK SAVE STATE": "Γρήγορη αποθήκευση", + "QUICK LOAD STATE": "Γρήγορη φόρτωση", + "CHANGE STATE SLOT": "Εναλλαγή θέσης αποθήκευσης", + "INSERT COIN": "Βάλτε κέρμα", + "Press keyboard or gamepad": "Πατήστε στο πληκτρολόγιο ή στο μοχλό", + "Press escape (esc) to clear": "Πατήστε escape (esc) για καθαρισμό", + "Netplay": "Online παιχνίδι", + "Rooms": "Online παιχνίδια", + "Players": "Παίκτες", + "Player": "Παίκτης", + "Room Name": "Όνομα online παιχνιδιού", + "Password": "Κωδικός", + "Name": "Όνομα", + "Quit Room": "Έξοδος", + "Create a Room": "Δημιουργία online παιχνιδιού", + "Set Player Name": "Δημιουργία ονόματος παίκτη", + "Player Name": "Όνομα παίκτη", + "Room Name": "Όνομα online παιχνιδιού", + "Create a Room": "Δημιουργία online παιχνιδιού", + "Password (optional)": "Κωδικός (προαιρετικά)", + "Select": "Select", + "Start": "Start", + "Menu": "Menu", + "Decompress Game Core": "Αποσυμπίεση αρχείου πυρήνα παιχνιδιού", + "Decompress Game Data": "Αποσυμπίεση αρχείων παιχνιδιού", + "Decompress Game Patch": "Αποσυμπίεση πρόσθετων αρχείων παιχνιδιού", + "Download Game Data": "Λήψη αρχείων παιχνιδιού", + "Download Game Core": "Λήψη αρχείου πυρήνα παιχνιδιού", + "Network Error": "Σφάλμα δικτύου", + "Default": "Προκαθορισμένο", + "default": "προκαθορισμένο", + "Save State Location": "Διαδρομή αποθήκευσης", + "Save State Slot": "Θυρίδα αποθήκευσης", + "Color Palette": "Χρωματοπαλέτα", + "No Sprite Limit": "Στοιχεία χωρίς όριο", + "Enabled": "Ενεργοποιημένο", + "Disabled": "Απενεργοποιημένο", + "enabled": "ενεργοποιημένο", + "disabled": "απενεργοποιημένο", + "Low": "Χαμηλό", + "High": "Υψηλό", + "Very High": "Πολύ Υψηλό", + "4 Players Support": "Υποστήριξη 4 παικτών", + "Turbo Enable": "Ενεργοποίηση Turbo", + "None": "Κανένα", + "Both": "Και τα δύο", + "Region": "Περιοχή", + "SuperFX Overclock": "Υπερχρονισμός SuperFX", + "Sound Quality": "Ποιότητα ήχου", + "GB Colorization": "Χρωματισμός GB", + "auto": "αυτόματο", + "internal": "εσωτερικό", + "Internal Palette": "Εσωτερική Παλέτα", + "GBC - Blue": "GBC - Μπλε", + "GBC - Brown": "GBC - Καφέ", + "GBC - Dark Blue": "GBC - Σκούρο Μπλε", + "GBC - Dark Brown": "GBC - Σκούρο Καφέ", + "GBC - Dark Green": "GBC - Σκούρο Πράσινο", + "GBC - Grayscale": "GBC - Κλίμακα του γκρι", + "GBC - Green": "GBC - Πράσινο", + "GBC - Inverted": "GBC - Ανεστραμμένο", + "GBC - Orange": "GBC - Πορτοκαλί", + "GBC - Red": "GBC - Κόκκινο", + "GBC - Pastel Mix": "GBC - Παστέλ Μίξη", + "GBC - Yellow": "GBC - Κίτρινο", + "Frameskip": "Παράλειψη Καρέ", + "Solar sensor level": "Επίπεδο ηλιακού σένσορα", + "Enable Turbo Buttons": "Ενεργοποίηση τούρμπο κουμπιών", + "Turbo Delay in frames": "Καθυστέρηση τούρμπο στα καρέ", + "Auto": "Αυτόματο", + "Aspect Ratio (Need to refresh page)": "Αναλογία Απεικόνισης (Χρειάζεται ανανέωση σελίδας)", + "16:9 Resolution": "16:9 Ανάλυση", + "4:3 Resolution": "4:3 Ανάλυση", + "Player 1 Pak": "Παίκτης 1 Pak", + "Player 2 Pak": "Παίκτης 2 Pak", + "Player 3 Pak": "Παίκτης 3 Pak", + "Player 4 Pak": "Παίκτης 4 Pak", + "none": "κανένα", + "memory": "μνήμη", + "rumble": "rumble", + "Screen layout": "Διάταξη οθόνης", + "right/left": "δεξιά/αριστερά", + "left/right": "αριστερά/δεξιά", + "bottom/top": "κάτω/επάνω", + "top/bottom": "επάνω/κάτω", + "top only": "Μόνο επάνω", + "bottom only": "Μόνο κάτω", + "quick switch": "Γρήγορη εναλλαγή", + "hybrid/bottom": "Υβριδικά/κάτω", + "hybrid/top": "-Υβριδικά/επάνω", + "Screen Rotation": "Περιστροφή οθόνης", + "CPU speed": "Ταχύτητα επεξεργαστή", + "Sound output": "Έξοδος ήχου", + "mono": "μονοφωνικός", + "stereo": "στερεοφωνικός", + "OFF": "ΚΛΕΙΣΤΟ", + "ON": "ΑΝΟΙΚΤΟ", + "Fast Blitter": "Γρήγορο Μπλίτερ", + "Bios": "Bios", + "Enable second memory card": "Ενεργοποίηση δεύτερης κάρτας μνήμης", + "Pad 1 Type": "Τύπος Pad 1", + "Pad 2 Type": "Τύπος Pad 2", + "Pad 3 Type": "Τύπος Pad 3", + "Pad 4 Type": "Τύπος Pad 4", + "standard": "πρότυπο", + "analog": "αναλογικός μοχλος", + "negcon": "negcon μοχλός", + "Enable Vibration": "Ενεργοποίηση Δόνησης", + "Enable interlacing mode(s)": "Ενεργοποίηση λειτουργίας διαπλοκής(s)", + "Enhanced resolution (slow)": "Βελτιωμένη ανάλυση (αργό)", + "Enhanced resolution speed hack": "Βελτιωμένη ανάλυση χακάρισμα ταχύτητας", + "Aspect ratio": "Αναλογία απεικόνισης", + "CPU overclock": "Υπερχρονισμός επεξεργαστή", + "Force Neo Geo mode": "Επιβολή λειτουργίας Neo Geo", + "Diagnostic Input": "Διαγωνστική εισαγωγή", + "download": "λήψη", + "keep in browser": "αποθήκευση στον περιηγητή", + "Webassembly support is not detected in this browser": "Η λειτουργία Webassembly δεν υποστηρίζεται από τον τρέχον περιηγητή", + "Please upgrade your browser to the latest version": "Παρακαλώ αναβαθμίστε τον περιηγητή σας στην τελευταία έκδοση", + "Missing mame config": "Λείπει το αρχείο διαμόρφωσης mame", + "Stop Screen Recording": "Στάματημα εγγραφής οθόνης", + "Start Screen Recording": "Εκκίνηση εγγραφής οθόνης", + "Take Screenshot": "Στιγμιότυπο οθόνης", + "Quick Save": "Γρήγορη Αποθήκευση", + "Quick Load": "Γρήγορη Φόρτωση" +} diff --git a/data/localization/readme.md b/data/localization/readme.md index 8c65390..8102dfa 100644 --- a/data/localization/readme.md +++ b/data/localization/readme.md @@ -3,20 +3,33 @@ Supported languages -`en-US` -`pt-BR` -`es-ES` +`en-US`
+`pt-BR`
+`es-ES`
+`el-GR`
-default: `un-US` + +default: `en-US` + + +add the line to your code to use + +```js +EJS_language = ''; //language +``` + +If the language file is not found or there was an error fetching the file, the emulator will default to english. ## credits -translated for `pt-BR` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) - -translated for `es-ES` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) +translated for `pt-BR` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira)
+translated for `es-ES` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira)
+translated for `el-GR` by [@imneckro](https://github.com/imneckro) ## contributing download the default `en.json` file and simply translate all the words that start with the `-` (remove the dash afterwards) then perform a pull request or open an issue with the file uploaded and I will add your work + +Please contribute!! diff --git a/data/nes-wasm.data b/data/nes-wasm.data index 332e362..e1341e7 100644 Binary files a/data/nes-wasm.data and b/data/nes-wasm.data differ diff --git a/data/snes-wasm.data b/data/snes-wasm.data index 65c4e9e..12dd243 100644 Binary files a/data/snes-wasm.data and b/data/snes-wasm.data differ diff --git a/data/v.json b/data/v.json index e5b8f16..e49e25f 100644 --- a/data/v.json +++ b/data/v.json @@ -1,13 +1,13 @@ { "nes": { - "version":"16", + "version":"17", "netplay": 1, "state": 1, "asmjs": 1, "wasm": 1 }, "snes": { - "version":"13", + "version":"14", "netplay": 1, "state": 1, "asmjs": 1, diff --git a/index.html b/index.html new file mode 100644 index 0000000..6cfdeb5 --- /dev/null +++ b/index.html @@ -0,0 +1,111 @@ + + + + Select Game Rom: + +