Version 1.0

Co-authored-by: Allan Niles <74841470+allancoding@users.noreply.github.com>
Co-authored-by: imneckro <42493772+imneckro@users.noreply.github.com>
This commit is contained in:
Ethan O'Brien 2022-02-20 15:51:00 -06:00
parent 4ffcd9832f
commit 60cb51da0d
12 changed files with 501 additions and 152 deletions

24
.github/ISSUE_TEMPLATE/bug---beta.md vendored Normal file
View file

@ -0,0 +1,24 @@
---
name: bug - beta
about: Use this when you find a problem with the beta emulator cores
title: "[beta]"
labels: ''
assignees: ''
---
<!--
First, collect a console log.
1. Please add the line of code to your html
```
EJS_DEBUG_XX = true
```
2. then reload the broken page.
3. Right click and click `inspect`.
4. Select the `console` tab at the top.
5. Right click on the console and click `save console log to file`
6. Upload the file here
If no log of the console is present. I will immediately close the issue without any comment.
Please upload straight to github and not to some other website.
-->

24
.github/ISSUE_TEMPLATE/bug.md vendored Normal file
View file

@ -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: ''
---
<!--
First, collect a console log.
1. Please add the line of code to your html
```
EJS_DEBUG_XX = true
```
2. then reload the broken page.
3. Right click and click `inspect`.
4. Select the `console` tab at the top.
5. Right click on the console and click `save console log to file`
6. Upload the file here
If no log of the console is present. I will immediately close the issue without any comment.
Please upload straight to github and not to some other website.
-->

View file

@ -0,0 +1,10 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---

View file

@ -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) <br>
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;
<br>
*I have successfully rewrote the server side portion* <br>
*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;
```
<br>
*To self host:*
1. Download the **[Server]**.
@ -84,13 +100,13 @@ EJS_netplayUrl = 'http://localhost:3000/'; // Absolute Url To Your Netplay Serve
<br>
##### Custom Saves
##### Custom Save Filename
To customize the filename of save states <br>
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 <br>
`play now` screen, include the following line:
```js
EJS_AdUrl = `URL`;
EJS_AdUrl = 'URL';
```
<br>
@ -147,17 +163,23 @@ EJS_paths = {
<br>
##### Localization
please see [data/localization/readme.md](the localization readme)
<br>
##### 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)

View file

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

View file

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

View file

@ -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": "Γρήγορη Φόρτωση"
}

View file

@ -3,20 +3,33 @@
Supported languages
`en-US`
`pt-BR`
`es-ES`
`en-US` <br>
`pt-BR` <br>
`es-ES` <br>
`el-GR` <br>
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) <br>
translated for `es-ES` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) <br>
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!!

Binary file not shown.

Binary file not shown.

View file

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

111
index.html Normal file
View file

@ -0,0 +1,111 @@
<html>
<body>
<script>
window.addEventListener('load', function() {
document.getElementById('file').onchange = async function(e) {
var ce = function(e) {return document.createElement(e);};
var br = function(e) {e.appendChild(ce('br'))};
var gameUrl = URL.createObjectURL(new Blob([e.target.files[0]]))
var extension = e.target.files[0].name.split('.').pop()
var gameName = e.target.files[0].name.replaceAll("'", "\\'")
var gameName = gameName.substr(0, gameName.length - extension.length - 1)
e.target.remove()
while(document.body.firstChild) {
document.body.removeChild(document.body.firstChild);
};
if (['fds', 'nes', 'unif', 'unf'].includes(extension)) {
var core = 'nes';
} else if (['z64'].includes(extension)) {
var core = 'n64';
} else if (['smc', 'fig', 'sfc', 'gd3', 'gd7', 'dx2', 'bsx', 'swc'].includes(extension)) {
var core = 'snes';
} else if (['nds'].includes(extension)) {
var core = 'nds';
} else if (['gba'].includes(extension)) {
var core = 'gba';
} else if (['gb'].includes(extension)) {
var core = 'gb';
} else {
var core = await function() {
return new Promise(function(resolve, reject) {
var cores = {"NES / Nintendo Entertainment System / Famicon": "nes",
"SNES / Super Nintendo Entertainment System": "snes",
"Nintendo 64": "n64",
"Nintendo Game Boy": "gb",
"Nintendo Game Boy Advance": "gba",
"Nintendo DS": "nds",
"PlayStation": "psx",
"Virtual Boy": "vb",
"Sega Mega Drive": "segaMD",
"Sega Master System": "segaMS",
"Sega CD": "segaCD",
"Atari Lynx": "lynx",
"Sega 32X": "sega32x",
"Atari Jaguar": "jaguar",
"Sega Game Gear": "segaGG",
"Sega Saturn": "segaSaturn",
"Atari 7800": "atari7800",
"Atari 2600": "atari2600"};
var a = ce('div');
a.style = 'padding: 50px;';
var p = ce('h2');
p.innerHTML = 'Unable to auto-detect system. Please select the desired system.';
a.appendChild(p);
br(a);
for (var k in cores) {
var input = ce('input');
input.type = 'radio';
input.id = 'game-' + cores[k];
input.name = 'game';
input.value = cores[k];
a.appendChild(input);
var label = ce('label');
label.for = 'game-' + cores[k];
label.innerHTML = k;
a.appendChild(label);
br(a);
};
br(a);
var submit = ce('input');
submit.type = 'submit';
submit.value = 'Load Game';
submit.onclick = function(e) {
var q = false;
var radios = document.getElementsByName('game');
for (var i=0; i<radios.length; i++) {
if (radios[i].checked) {
var q = radios[i].value;
break;
};
};
if (! q) {
return;
};
while(document.body.firstChild) {
document.body.removeChild(document.body.firstChild);
};
resolve(q);
};
a.appendChild(submit);
document.body.appendChild(a);
});
}();
};
var a = document.createElement('div');
a.style = "width:640px;height:480px;max-width:100%";
var b = document.createElement('div');
b.id = 'game';
a.appendChild(b);
document.body.appendChild(a);
var script = document.createElement('script');
script.innerHTML = "EJS_player = '#game'; EJS_gameName = '" + gameName + "'; EJS_biosUrl = ''; EJS_gameUrl = '" + gameUrl + "'; EJS_core = '" + core + "'; EJS_pathtodata = 'data/'; ";
document.body.appendChild(script);
var script = document.createElement('script');
script.src = 'data/loader.js';
document.body.appendChild(script);
}
})
</script>
Select Game Rom: <input type="file" id="file">
</body>
</html>