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 @@
+
+