mirror of
https://github.com/EmulatorJS/EmulatorJS.git
synced 2024-09-20 02:46:23 +00:00
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:
parent
4ffcd9832f
commit
60cb51da0d
12 changed files with 501 additions and 152 deletions
24
.github/ISSUE_TEMPLATE/bug---beta.md
vendored
Normal file
24
.github/ISSUE_TEMPLATE/bug---beta.md
vendored
Normal 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
24
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal 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.
|
||||
-->
|
10
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
38
README.md
38
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) <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)
|
||||
|
||||
|
||||
|
|
214
data/emu-main.js
214
data/emu-main.js
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
197
data/localization/el-GR.json
Normal file
197
data/localization/el-GR.json
Normal 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": "Γρήγορη Φόρτωση"
|
||||
}
|
|
@ -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.
|
@ -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
111
index.html
Normal 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>
|
Loading…
Reference in a new issue