Merge branch 'main' into enable-capture-pointer

This commit is contained in:
Michael Green 2024-04-30 13:47:13 +10:00 committed by GitHub
commit 745351dcb2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 1013 additions and 188 deletions

View file

@ -1,6 +1,18 @@
# Changes # Changes
# 4.0.11 # 4.0.12
- Fix scroll bar css (Thanks to [@allancoding](https://github.com/allancoding))
- Flip the context menu instead of going off the page
- Add hooks for save files (Thanks to [@gantoine](https://github.com/gantoine))
- Add class for each virtual gamepad button
- Add `EJS_forceLegacyCores` option
- Add `EJS_noAutoFocus` (this is only for advanced developers, not likely an option you will use)
- Added supported Amiga file extensions (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Display the file name of the ROM/disk when using M3U lists (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Added vsync option
- Added advanced shader configuration support (Thanks to [@n-at](https://github.com/n-at))
# 4.0.11 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/cafd80d023afa9562c7054e89a4240f3381d64ff)
- Added the ability to disable localstorage using `EJS_disableLocalStorage`. (Thanks to [@n-at](https://github.com/n-at)) - Added the ability to disable localstorage using `EJS_disableLocalStorage`. (Thanks to [@n-at](https://github.com/n-at))
- Added the ability to trigger `EJS_emulator.displayMessage` with a duration. (Thanks to [@allancoding](https://github.com/allancoding)) - Added the ability to trigger `EJS_emulator.displayMessage` with a duration. (Thanks to [@allancoding](https://github.com/allancoding))
- `EJS_emulator.gameManager.getState` now returns a Uint8Array instead of a promise. - `EJS_emulator.gameManager.getState` now returns a Uint8Array instead of a promise.

View file

@ -29,7 +29,8 @@ class EJS_GameManager {
setRewindGranularity: this.Module.cwrap('set_rewind_granularity', 'null', ['number']), setRewindGranularity: this.Module.cwrap('set_rewind_granularity', 'null', ['number']),
toggleSlowMotion: this.Module.cwrap('toggle_slow_motion', 'null', ['number']), toggleSlowMotion: this.Module.cwrap('toggle_slow_motion', 'null', ['number']),
setSlowMotionRatio: this.Module.cwrap('set_sm_ratio', 'null', ['number']), setSlowMotionRatio: this.Module.cwrap('set_sm_ratio', 'null', ['number']),
getFrameNum: this.Module.cwrap('get_current_frame_count', 'number', ['']) getFrameNum: this.Module.cwrap('get_current_frame_count', 'number', ['']),
setVSync: this.Module.cwrap('set_vsync', 'null', ['number'])
} }
this.writeFile("/home/web_user/retroarch/userdata/config/Beetle PSX HW/Beetle PSX HW.opt", 'beetle_psx_hw_renderer = "software"\n'); this.writeFile("/home/web_user/retroarch/userdata/config/Beetle PSX HW/Beetle PSX HW.opt", 'beetle_psx_hw_renderer = "software"\n');
this.writeFile("/home/web_user/retroarch/userdata/config/MAME 2003 (0.78)/MAME 2003 (0.78).opt", 'mame2003_skip_disclaimer = "enabled"\nmame2003_skip_warnings = "enabled"\n'); this.writeFile("/home/web_user/retroarch/userdata/config/MAME 2003 (0.78)/MAME 2003 (0.78).opt", 'mame2003_skip_disclaimer = "enabled"\nmame2003_skip_warnings = "enabled"\n');
@ -118,10 +119,13 @@ class EJS_GameManager {
"savefile_directory = \"/data/saves\"\n"; "savefile_directory = \"/data/saves\"\n";
} }
initShaders() { initShaders() {
if (!window.EJS_SHADERS) return; if (!this.EJS.config.shaders) return;
this.mkdir("/shader"); this.mkdir("/shader");
for (const shader in window.EJS_SHADERS) { for (const shaderFileName in this.EJS.config.shaders) {
this.FS.writeFile('/shader/'+shader, window.EJS_SHADERS[shader]); const shader = this.EJS.config.shaders[shaderFileName];
if (typeof shader === 'string') {
this.FS.writeFile(`/shader/${shaderFileName}`, shader);
}
} }
} }
clearEJSResetTimer() { clearEJSResetTimer() {
@ -306,6 +310,9 @@ class EJS_GameManager {
}, null, false, {responseType: "arraybuffer", method: "GET"}); }, null, false, {responseType: "arraybuffer", method: "GET"});
}) })
} }
setVSync(enabled) {
this.functions.setVSync(enabled);
}
toggleMainLoop(playing) { toggleMainLoop(playing) {
this.functions.toggleMainLoop(playing); this.functions.toggleMainLoop(playing);
} }

View file

@ -287,8 +287,11 @@
.ejs_svg_rotate { .ejs_svg_rotate {
transform: rotate(90deg); transform: rotate(90deg);
} }
.ejs_small_screen .ejs_settings_parent::before {
border: none;
}
.ejs_small_screen .ejs_settings_parent::after { .ejs_small_screen .ejs_settings_parent::after {
right: 15px; border: none;
} }
.ejs_small_screen .ejs_settings_center_right { .ejs_small_screen .ejs_settings_center_right {
right: -35% right: -35%
@ -374,12 +377,15 @@
.ejs_big_screen .ejs_settings_parent { .ejs_big_screen .ejs_settings_parent {
right: -3px; right: -3px;
} }
.ejs_big_screen .ejs_settings_parent::after { /* .ejs_big_screen .ejs_settings_parent::after {
right: 15px; right: 15px;
} } */
.ejs_big_screen .ejs_settings_text { .ejs_big_screen .ejs_settings_text {
display: none; display: none;
} }
.ejs_big_screen .ejs_disks_text {
display: none;
}
.ejs_big_screen .ejs_menu_bar_spacer { .ejs_big_screen .ejs_menu_bar_spacer {
flex:1; flex:1;
} }
@ -764,8 +770,11 @@
.ejs_settings_parent { .ejs_settings_parent {
animation: ejs_settings_parent_animation .2s ease; animation: ejs_settings_parent_animation .2s ease;
background: rgba(16,16,16,0.9); background: rgba(29, 29, 29, 0.9);
border-radius: 4px; border-radius: 4px;
border-width: 1px;
border-style: solid;
border-color: rgba(49, 49, 49, 0.9);
bottom: 100%; bottom: 100%;
box-shadow: 0 1px 2px rgba(0,0,0,0.15); box-shadow: 0 1px 2px rgba(0,0,0,0.15);
color: #4f5b5f; color: #4f5b5f;
@ -775,15 +784,36 @@
text-align: left; text-align: left;
white-space: nowrap; white-space: nowrap;
z-index: 9999; z-index: 9999;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
} }
.ejs_settings_parent::after { /* .ejs_settings_parent::after {
border: 4px solid transparent; border: 5px solid transparent;
border-top-color: rgba(16,16,16,0.9); border-top-color: rgba(119, 119, 119, 0.9);
content: ''; content: '';
height: 0; height: 0;
position: absolute; position: absolute;
top: 100%; top: 100%;
width: 0; width: 0;
} */
.ejs_settings_parent::before, .ejs_settings_parent::after {
position: absolute;
right: 15px;
width: 0;
height: 0;
content: '';
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top-width: 5px;
border-top-style: solid;
}
.ejs_settings_parent::before {
top: calc(100% + 1px);
border-top-color: rgba(49, 49, 49, 0.9);
}
.ejs_settings_parent::after {
top: 100%;
border-top-color: rgba(29, 29, 29, 0.9);
} }
.ejs_settings_transition { .ejs_settings_transition {
overflow: hidden; overflow: hidden;

View file

@ -1,5 +1,5 @@
class EmulatorJS { class EmulatorJS {
version = 12; //Increase by 1 when cores are updated version = 13; //Increase by 1 when cores are updated
getCore(generic) { getCore(generic) {
const core = this.config.system; const core = this.config.system;
/*todo: /*todo:
@ -269,8 +269,8 @@ class EmulatorJS {
}) })
} }
constructor(element, config) { constructor(element, config) {
this.ejs_version = "4.0.11"; this.ejs_version = "4.0.12";
this.ejs_num_version = 401.1; this.ejs_num_version = 401.2;
this.debug = (window.EJS_DEBUG_XX === true); this.debug = (window.EJS_DEBUG_XX === true);
if (this.debug || (window.location && ['localhost', '127.0.0.1'].includes(location.hostname))) this.checkForUpdates(); if (this.debug || (window.location && ['localhost', '127.0.0.1'].includes(location.hostname))) this.checkForUpdates();
this.netplayEnabled = (window.EJS_DEBUG_XX === true) && (window.EJS_EXPERIMENTAL_NETPLAY === true); this.netplayEnabled = (window.EJS_DEBUG_XX === true) && (window.EJS_EXPERIMENTAL_NETPLAY === true);
@ -952,7 +952,7 @@ class EmulatorJS {
const altName = this.getBaseFileName(true); const altName = this.getBaseFileName(true);
let disableCue = false; let disableCue = false;
if (['pcsx_rearmed', 'genesis_plus_gx', 'picodrive', 'mednafen_pce', 'smsplus', 'vice_x64', 'vice_x64sc', 'vice_x128', 'vice_xvic', 'vice_xplus4', 'vice_xpet'].includes(this.getCore()) && this.config.disableCue === undefined) { if (['pcsx_rearmed', 'genesis_plus_gx', 'picodrive', 'mednafen_pce', 'smsplus', 'vice_x64', 'vice_x64sc', 'vice_x128', 'vice_xvic', 'vice_xplus4', 'vice_xpet', 'puae'].includes(this.getCore()) && this.config.disableCue === undefined) {
disableCue = true; disableCue = true;
} else { } else {
disableCue = this.config.disableCue; disableCue = this.config.disableCue;
@ -1129,6 +1129,11 @@ class EmulatorJS {
} }
this.Module.resumeMainLoop(); this.Module.resumeMainLoop();
this.checkSupportedOpts(); this.checkSupportedOpts();
this.setupDisksMenu();
// hide the disks menu if the disk count is not greater than 1
if (!(this.gameManager.getDiskCount() > 1)) {
this.diskParent.style.display = 'none';
}
this.setupSettingsMenu(); this.setupSettingsMenu();
this.loadSettings(); this.loadSettings();
this.updateCheatUI(); this.updateCheatUI();
@ -1580,7 +1585,7 @@ class EmulatorJS {
let timeout = null; let timeout = null;
let ignoreEvents = false; let ignoreEvents = false;
const hide = () => { const hide = () => {
if (this.paused || this.settingsMenuOpen) return; if (this.paused || this.settingsMenuOpen || this.disksMenuOpen) return;
this.elements.menu.classList.add("ejs_menu_bar_hidden"); this.elements.menu.classList.add("ejs_menu_bar_hidden");
} }
@ -1882,6 +1887,30 @@ class EmulatorJS {
} }
}); });
this.diskParent = this.createElement("div");
this.diskParent.id = "ejs_disksMenu";
this.disksMenuOpen = false;
const diskButton = addButton("Disks", '<svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 473.109 473.109"><path d="M340.963,101.878H12.105C5.423,101.878,0,107.301,0,113.983v328.862c0,6.68,5.423,12.105,12.105,12.105h328.857 c6.685,0,12.104-5.426,12.104-12.105V113.983C353.067,107.301,347.647,101.878,340.963,101.878z M67.584,120.042h217.895v101.884 H67.584V120.042z M296.076,429.228H56.998V278.414h239.079V429.228z M223.947,135.173h30.269v72.638h-30.269V135.173z M274.13,315.741H78.933v-12.105H274.13V315.741z M274.13,358.109H78.933v-12.105H274.13V358.109z M274.13,398.965H78.933v-12.105 H274.13V398.965z M473.109,30.263v328.863c0,6.68-5.426,12.105-12.105,12.105H384.59v-25.724h31.528V194.694H384.59v-56.489h20.93 V36.321H187.625v43.361h-67.583v-49.42c0-6.682,5.423-12.105,12.105-12.105H461.01C467.695,18.158,473.109,23.581,473.109,30.263z M343.989,51.453h30.269v31.321c-3.18-1.918-6.868-3.092-10.853-3.092h-19.416V51.453z M394.177,232.021h-9.581v-12.105h9.581 V232.021z M384.59,262.284h9.581v12.105h-9.581V262.284z M384.59,303.14h9.581v12.104h-9.581V303.14z"/></svg>', () => {
this.disksMenuOpen = !this.disksMenuOpen;
diskButton[1].classList.toggle("ejs_svg_rotate", this.disksMenuOpen);
this.disksMenu.style.display = this.disksMenuOpen ? "" : "none";
diskButton[2].classList.toggle("ejs_disks_text", this.disksMenuOpen);
}, this.diskParent, true);
this.elements.menu.appendChild(this.diskParent);
this.closeDisksMenu = () => {
if (!this.disksMenu) return;
this.disksMenuOpen = false;
diskButton[1].classList.toggle("ejs_svg_rotate", this.disksMenuOpen);
diskButton[2].classList.toggle("ejs_disks_text", this.disksMenuOpen);
this.disksMenu.style.display = "none";
}
this.addEventListener(this.elements.parent, "mousedown touchstart", (e) => {
if (this.isChild(this.disksMenu, e.target)) return;
if (e.pointerType === "touch") return;
if (e.target === diskButton[0] || e.target === diskButton[2]) return;
this.closeDisksMenu();
})
this.settingParent = this.createElement("div"); this.settingParent = this.createElement("div");
this.settingsMenuOpen = false; this.settingsMenuOpen = false;
const settingButton = addButton("Settings", '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M495.9 166.6C499.2 175.2 496.4 184.9 489.6 191.2L446.3 230.6C447.4 238.9 448 247.4 448 256C448 264.6 447.4 273.1 446.3 281.4L489.6 320.8C496.4 327.1 499.2 336.8 495.9 345.4C491.5 357.3 486.2 368.8 480.2 379.7L475.5 387.8C468.9 398.8 461.5 409.2 453.4 419.1C447.4 426.2 437.7 428.7 428.9 425.9L373.2 408.1C359.8 418.4 344.1 427 329.2 433.6L316.7 490.7C314.7 499.7 307.7 506.1 298.5 508.5C284.7 510.8 270.5 512 255.1 512C241.5 512 227.3 510.8 213.5 508.5C204.3 506.1 197.3 499.7 195.3 490.7L182.8 433.6C167 427 152.2 418.4 138.8 408.1L83.14 425.9C74.3 428.7 64.55 426.2 58.63 419.1C50.52 409.2 43.12 398.8 36.52 387.8L31.84 379.7C25.77 368.8 20.49 357.3 16.06 345.4C12.82 336.8 15.55 327.1 22.41 320.8L65.67 281.4C64.57 273.1 64 264.6 64 256C64 247.4 64.57 238.9 65.67 230.6L22.41 191.2C15.55 184.9 12.82 175.3 16.06 166.6C20.49 154.7 25.78 143.2 31.84 132.3L36.51 124.2C43.12 113.2 50.52 102.8 58.63 92.95C64.55 85.8 74.3 83.32 83.14 86.14L138.8 103.9C152.2 93.56 167 84.96 182.8 78.43L195.3 21.33C197.3 12.25 204.3 5.04 213.5 3.51C227.3 1.201 241.5 0 256 0C270.5 0 284.7 1.201 298.5 3.51C307.7 5.04 314.7 12.25 316.7 21.33L329.2 78.43C344.1 84.96 359.8 93.56 373.2 103.9L428.9 86.14C437.7 83.32 447.4 85.8 453.4 92.95C461.5 102.8 468.9 113.2 475.5 124.2L480.2 132.3C486.2 143.2 491.5 154.7 495.9 166.6V166.6zM256 336C300.2 336 336 300.2 336 255.1C336 211.8 300.2 175.1 256 175.1C211.8 175.1 176 211.8 176 255.1C176 300.2 211.8 336 256 336z"/></svg>', () => { const settingButton = addButton("Settings", '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M495.9 166.6C499.2 175.2 496.4 184.9 489.6 191.2L446.3 230.6C447.4 238.9 448 247.4 448 256C448 264.6 447.4 273.1 446.3 281.4L489.6 320.8C496.4 327.1 499.2 336.8 495.9 345.4C491.5 357.3 486.2 368.8 480.2 379.7L475.5 387.8C468.9 398.8 461.5 409.2 453.4 419.1C447.4 426.2 437.7 428.7 428.9 425.9L373.2 408.1C359.8 418.4 344.1 427 329.2 433.6L316.7 490.7C314.7 499.7 307.7 506.1 298.5 508.5C284.7 510.8 270.5 512 255.1 512C241.5 512 227.3 510.8 213.5 508.5C204.3 506.1 197.3 499.7 195.3 490.7L182.8 433.6C167 427 152.2 418.4 138.8 408.1L83.14 425.9C74.3 428.7 64.55 426.2 58.63 419.1C50.52 409.2 43.12 398.8 36.52 387.8L31.84 379.7C25.77 368.8 20.49 357.3 16.06 345.4C12.82 336.8 15.55 327.1 22.41 320.8L65.67 281.4C64.57 273.1 64 264.6 64 256C64 247.4 64.57 238.9 65.67 230.6L22.41 191.2C15.55 184.9 12.82 175.3 16.06 166.6C20.49 154.7 25.78 143.2 31.84 132.3L36.51 124.2C43.12 113.2 50.52 102.8 58.63 92.95C64.55 85.8 74.3 83.32 83.14 86.14L138.8 103.9C152.2 93.56 167 84.96 182.8 78.43L195.3 21.33C197.3 12.25 204.3 5.04 213.5 3.51C227.3 1.201 241.5 0 256 0C270.5 0 284.7 1.201 298.5 3.51C307.7 5.04 314.7 12.25 316.7 21.33L329.2 78.43C344.1 84.96 359.8 93.56 373.2 103.9L428.9 86.14C437.7 83.32 447.4 85.8 453.4 92.95C461.5 102.8 468.9 113.2 475.5 124.2L480.2 132.3C486.2 143.2 491.5 154.7 495.9 166.6V166.6zM256 336C300.2 336 336 300.2 336 255.1C336 211.8 300.2 175.1 256 175.1C211.8 175.1 176 211.8 176 255.1C176 300.2 211.8 336 256 336z"/></svg>', () => {
@ -1904,6 +1933,7 @@ class EmulatorJS {
if (e.target === settingButton[0] || e.target === settingButton[2]) return; if (e.target === settingButton[0] || e.target === settingButton[2]) return;
this.closeSettingsMenu(); this.closeSettingsMenu();
}) })
this.addEventListener(this.canvas, "click", (e) => { this.addEventListener(this.canvas, "click", (e) => {
if (e.pointerType === "touch") return; if (e.pointerType === "touch") return;
if (!this.paused) { if (!this.paused) {
@ -3853,15 +3883,7 @@ class EmulatorJS {
this.saveSettings(); this.saveSettings();
if (this.debug) console.log(option, value); if (this.debug) console.log(option, value);
if (option === "shader") { if (option === "shader") {
try { this.enableShader(value);
this.Module.FS.unlink("/shader/shader.glslp");
} catch(e) {}
if (value === "disabled") {
this.gameManager.toggleShader(0);
return;
}
this.Module.FS.writeFile("/shader/shader.glslp", window.EJS_SHADERS[value]);
this.gameManager.toggleShader(1);
return; return;
} else if (option === "disk") { } else if (option === "disk") {
this.gameManager.setCurrentDisk(value); this.gameManager.setCurrentDisk(value);
@ -3912,10 +3934,197 @@ class EmulatorJS {
} else { } else {
this.isPointerCapture = false; this.isPointerCapture = false;
} }
} else if (option === "vsync") {
this.gameManager.setVSync(value === "enabled");
} }
this.gameManager.setVariable(option, value); this.gameManager.setVariable(option, value);
this.saveSettings(); this.saveSettings();
} }
setupDisksMenu() {
this.disksMenu = this.createElement("div");
this.disksMenu.classList.add("ejs_settings_parent");
const nested = this.createElement("div");
nested.classList.add("ejs_settings_transition");
this.disks = {};
const home = this.createElement("div");
home.style.overflow = "auto";
const menus = [];
this.handleDisksResize = () => {
let needChange = false;
if (this.disksMenu.style.display !== "") {
this.disksMenu.style.opacity = "0";
this.disksMenu.style.display = "";
needChange = true;
}
let height = this.elements.parent.getBoundingClientRect().height;
let w2 = this.diskParent.parentElement.getBoundingClientRect().width;
let disksX = this.diskParent.getBoundingClientRect().x;
if (w2 > window.innerWidth) disksX += (w2 - window.innerWidth);
const onTheRight = disksX > (w2-15)/2;
if (height > 375) height = 375;
home.style['max-height'] = (height - 95) + "px";
nested.style['max-height'] = (height - 95) + "px";
for (let i=0; i<menus.length; i++) {
menus[i].style['max-height'] = (height - 95) + "px";
}
this.disksMenu.classList.toggle("ejs_settings_center_left", !onTheRight);
this.disksMenu.classList.toggle("ejs_settings_center_right", onTheRight);
if (needChange) {
this.disksMenu.style.display = "none";
this.disksMenu.style.opacity = "";
}
}
home.classList.add("ejs_setting_menu");
nested.appendChild(home);
let funcs = [];
this.changeDiskOption = (title, newValue) => {
this.disks[title] = newValue;
funcs.forEach(e => e(title));
}
let allOpts = {};
const addToMenu = (title, id, options, defaultOption) => {
const span = this.createElement("span");
span.innerText = title;
const current = this.createElement("div");
current.innerText = "";
current.classList.add("ejs_settings_main_bar_selected");
span.appendChild(current);
const menu = this.createElement("div");
menus.push(menu);
menu.style.overflow = "auto";
menu.setAttribute("hidden", "");
const button = this.createElement("button");
const goToHome = () => {
const homeSize = this.getElementSize(home);
nested.style.width = (homeSize.width+20) + "px";
nested.style.height = homeSize.height + "px";
menu.setAttribute("hidden", "");
home.removeAttribute("hidden");
}
this.addEventListener(button, "click", goToHome);
button.type = "button";
button.classList.add("ejs_back_button");
menu.appendChild(button);
const pageTitle = this.createElement("span");
pageTitle.innerText = title;
pageTitle.classList.add("ejs_menu_text_a");
button.appendChild(pageTitle);
const optionsMenu = this.createElement("div");
optionsMenu.classList.add("ejs_setting_menu");
let buttons = [];
let opts = options;
if (Array.isArray(options)) {
opts = {};
for (let i=0; i<options.length; i++) {
opts[options[i]] = options[i];
}
}
allOpts[id] = opts;
funcs.push((title) => {
if (id !== title) return;
for (let j=0; j<buttons.length; j++) {
buttons[j].classList.toggle("ejs_option_row_selected", buttons[j].getAttribute("ejs_value") === this.disks[id]);
}
this.menuOptionChanged(id, this.disks[id]);
current.innerText = opts[this.disks[id]];
});
for (const opt in opts) {
const optionButton = this.createElement("button");
buttons.push(optionButton);
optionButton.setAttribute("ejs_value", opt);
optionButton.type = "button";
optionButton.value = opts[opt];
optionButton.classList.add("ejs_option_row");
optionButton.classList.add("ejs_button_style");
this.addEventListener(optionButton, "click", (e) => {
this.disks[id] = opt;
for (let j=0; j<buttons.length; j++) {
buttons[j].classList.remove("ejs_option_row_selected");
}
optionButton.classList.add("ejs_option_row_selected");
this.menuOptionChanged(id, opt);
current.innerText = opts[opt];
goToHome();
})
if (defaultOption === opt) {
optionButton.classList.add("ejs_option_row_selected");
this.menuOptionChanged(id, opt);
current.innerText = opts[opt];
}
const msg = this.createElement("span");
msg.innerText = opts[opt];
optionButton.appendChild(msg);
optionsMenu.appendChild(optionButton);
}
home.appendChild(optionsMenu);
nested.appendChild(menu);
}
if (this.gameManager.getDiskCount() > 1) {
const diskLabels = {};
let isM3U = false;
let disks = {};
if (this.fileName.split(".").pop() === "m3u") {
disks = this.gameManager.Module.FS.readFile(this.fileName, { encoding: 'utf8' }).split("\n");
isM3U = true;
}
for (let i=0; i<this.gameManager.getDiskCount(); i++) {
// default if not an m3u loaded rom is "Disk x"
// if m3u, then use the file name without the extension
// if m3u, and contains a |, then use the string after the | as the disk label
if (!isM3U) {
diskLabels[i.toString()] = "Disk "+(i+1);
} else {
// get disk name from m3u
const diskLabelValues = disks[i].split("|");
// remove the file extension from the disk file name
let diskLabel = diskLabelValues[0].replace("." + diskLabelValues[0].split(".").pop(), "");
if (diskLabelValues.length >= 2) {
// has a label - use that instead
diskLabel = diskLabelValues[1];
}
diskLabels[i.toString()] = diskLabel;
}
}
addToMenu(this.localization("Disk"), "disk", diskLabels, this.gameManager.getCurrentDisk().toString());
}
this.disksMenu.appendChild(nested);
this.diskParent.appendChild(this.disksMenu);
this.diskParent.style.position = "relative";
const homeSize = this.getElementSize(home);
nested.style.width = (homeSize.width+20) + "px";
nested.style.height = homeSize.height + "px";
this.disksMenu.style.display = "none";
if (this.debug) {
console.log("Available core options", allOpts);
}
if (this.config.defaultOptions) {
for (const k in this.config.defaultOptions) {
this.changeDiskOption(k, this.config.defaultOptions[k]);
}
}
}
setupSettingsMenu() { setupSettingsMenu() {
this.settingsMenu = this.createElement("div"); this.settingsMenu = this.createElement("div");
this.settingsMenu.classList.add("ejs_settings_parent"); this.settingsMenu.classList.add("ejs_settings_parent");
@ -4006,8 +4215,6 @@ class EmulatorJS {
const optionsMenu = this.createElement("div"); const optionsMenu = this.createElement("div");
optionsMenu.classList.add("ejs_setting_menu"); optionsMenu.classList.add("ejs_setting_menu");
//optionsMenu.style["max-height"] = "385px";
//optionsMenu.style.overflow = "auto";
let buttons = []; let buttons = [];
let opts = options; let opts = options;
@ -4064,28 +4271,35 @@ class EmulatorJS {
nested.appendChild(menu); nested.appendChild(menu);
} }
//addToMenu("Test", 'test', {a:1, b:2, c:3}, 2);
//addToMenu("Test2", 'test_2', [4, 5, 6]);
//addToMenu("Testertthgfd", 'booger', [7, 8, 9]);
if (this.gameManager.getDiskCount() > 1) { if (this.config.shaders) {
const diskLabels = {}; const builtinShaders = {
for (let i=0; i<this.gameManager.getDiskCount(); i++) {
diskLabels[i.toString()] = "Disk "+(i+1);
}
addToMenu(this.localization("Disk"), "disk", diskLabels, this.gameManager.getCurrentDisk().toString());
}
if (window.EJS_SHADERS) {
addToMenu(this.localization('Shaders'), 'shader', {
'disabled': this.localization("Disabled"),
'2xScaleHQ.glslp': this.localization("2xScaleHQ"), '2xScaleHQ.glslp': this.localization("2xScaleHQ"),
'4xScaleHQ.glslp': this.localization("4xScaleHQ"), '4xScaleHQ.glslp': this.localization("4xScaleHQ"),
'crt-easymode.glslp': this.localization('CRT easymode'),
'crt-aperture.glslp': this.localization('CRT aperture'), 'crt-aperture.glslp': this.localization('CRT aperture'),
'crt-beam': this.localization('CRT beam'),
'crt-caligari': this.localization('CRT caligari'),
'crt-easymode.glslp': this.localization('CRT easymode'),
'crt-geom.glslp': this.localization('CRT geom'), 'crt-geom.glslp': this.localization('CRT geom'),
'crt-mattias.glslp': this.localization('CRT mattias') 'crt-lottes': this.localization('CRT lottes'),
}, 'disabled'); 'crt-mattias.glslp': this.localization('CRT mattias'),
'crt-yeetron': this.localization('CRT yeetron'),
'crt-zfast': this.localization('CRT zfast'),
'sabr': this.localization('SABR'),
'bicubic': this.localization('Bicubic'),
'mix-frames': this.localization('Mix frames'),
};
let shaderMenu = {
'disabled': this.localization("Disabled"),
};
for (const shaderName in this.config.shaders) {
if (builtinShaders[shaderName]) {
shaderMenu[shaderName] = builtinShaders[shaderName];
} else {
shaderMenu[shaderName] = shaderName;
}
}
addToMenu(this.localization('Shaders'), 'shader', shaderMenu, 'disabled');
} }
addToMenu(this.localization('Capture Pointer'), 'capturepointer', { addToMenu(this.localization('Capture Pointer'), 'capturepointer', {
@ -4098,6 +4312,11 @@ class EmulatorJS {
'hide': this.localization("hide") 'hide': this.localization("hide")
}, 'hide'); }, 'hide');
addToMenu(this.localization("VSync"), "vsync", {
'enabled': this.localization("Enabled"),
'disabled': this.localization("Disabled")
}, "enabled");
addToMenu(this.localization('Fast Forward Ratio'), 'ff-ratio', [ addToMenu(this.localization('Fast Forward Ratio'), 'ff-ratio', [
"1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5", "8.0", "8.5", "9.0", "9.5", "10.0", "unlimited" "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5", "8.0", "8.5", "9.0", "9.5", "10.0", "unlimited"
], "3.0"); ], "3.0");
@ -4974,6 +5193,33 @@ class EmulatorJS {
this.gameManager.setCheat(index, checked, code); this.gameManager.setCheat(index, checked, code);
} }
enableShader(name) {
try {
this.Module.FS.unlink("/shader/shader.glslp");
} catch(e) {}
if (name === "disabled" || !this.config.shaders[name]) {
this.gameManager.toggleShader(0);
return;
}
const shaderConfig = this.config.shaders[name];
if (typeof shaderConfig === 'string') {
this.Module.FS.writeFile("/shader/shader.glslp", shaderConfig, {}, 'w+');
} else {
const shader = shaderConfig.shader;
this.Module.FS.writeFile('/shader/shader.glslp', shader.type === 'base64' ? atob(shader.value) : shader.value, {}, 'w+');
if (shaderConfig.resources && shaderConfig.resources.length) {
shaderConfig.resources.forEach(resource => {
this.Module.FS.writeFile(`/shader/${resource.name}`, resource.type === 'base64' ? atob(resource.value) : resource.value, {}, 'w+');
});
}
}
this.gameManager.toggleShader(1);
}
collectScreenRecordingMediaTracks(canvasEl, fps) { collectScreenRecordingMediaTracks(canvasEl, fps) {
let videoTrack = null; let videoTrack = null;
const videoTracks = canvasEl.captureStream(fps).getVideoTracks(); const videoTracks = canvasEl.captureStream(fps).getVideoTracks();

View file

@ -113,6 +113,7 @@
config.disableLocalStorage = window.EJS_disableLocalStorage; config.disableLocalStorage = window.EJS_disableLocalStorage;
config.forceLegacyCores = window.EJS_forceLegacyCores; config.forceLegacyCores = window.EJS_forceLegacyCores;
config.noAutoFocus = window.EJS_noAutoFocus; config.noAutoFocus = window.EJS_noAutoFocus;
config.shaders = Object.assign({}, window.EJS_SHADERS, window.EJS_shaders ? window.EJS_shaders : {});
if (typeof window.EJS_language === "string" && window.EJS_language !== "en-US") { if (typeof window.EJS_language === "string" && window.EJS_language !== "en-US") {
try { try {

View file

@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>EmulalorJS | Translate Languages</title> <title>EmulatorJS | Translate Languages</title>
<link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAb1BMVEVHcEwJNVMBkbwDi7cJNVMJNVMIN1UAlsIGZIcAlcEBs+kJNVMDn9EHVXYEc5kJNVMEgasFdZ0HUnMBk78EdZ0GfacFaIwHW3wINVMJNVMJNVMGYoUJNVMEeJ4JNVMDgakJNVMChwAAl8QCpNcCh7CQzQKfAAAAIXRSTlMAEvv+Py9y+L/2/Ev+q99H3s6R/u3+5r8hm82HYLpk+2GSUqJjAAAAgElEQVQY022PyQ6DMAxEHRM7KZCwdQG6ys3/f2MT1IMleLcZacZjgGOo6UjJpm/ruh3sJoy1XH03LmytgYAnBQbwItGfJVONg4gHP6U73FLWV3i8i5E+BuaXQ6Z1MbEYPAOxm8ZuXSiqCOZIKhGR/vkvjaU0oFPks7thu+mHz2l+F+sLcletMXIAAAAASUVORK5CYII="> <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAb1BMVEVHcEwJNVMBkbwDi7cJNVMJNVMIN1UAlsIGZIcAlcEBs+kJNVMDn9EHVXYEc5kJNVMEgasFdZ0HUnMBk78EdZ0GfacFaIwHW3wINVMJNVMJNVMGYoUJNVMEeJ4JNVMDgakJNVMChwAAl8QCpNcCh7CQzQKfAAAAIXRSTlMAEvv+Py9y+L/2/Ev+q99H3s6R/u3+5r8hm82HYLpk+2GSUqJjAAAAgElEQVQY022PyQ6DMAxEHRM7KZCwdQG6ys3/f2MT1IMleLcZacZjgGOo6UjJpm/ruh3sJoy1XH03LmytgYAnBQbwItGfJVONg4gHP6U73FLWV3i8i5E+BuaXQ6Z1MbEYPAOxm8ZuXSiqCOZIKhGR/vkvjaU0oFPks7thu+mHz2l+F+sLcletMXIAAAAASUVORK5CYII=">
</head> </head>
<body> <body>

View file

@ -9,40 +9,40 @@
"7": "7", "7": "7",
"8": "8", "8": "8",
"9": "9", "9": "9",
"Restart": "Neu starten", "Restart": "Neustart",
"Pause": "Pause", "Pause": "Pause",
"Play": "Spielen", "Play": "Spielen",
"Save State": "Sicherer Staat", "Save State": "Zustand speichern",
"Load State": "Ladezustand", "Load State": "Zustand laden",
"Control Settings": "Kontrolleinstellungen", "Control Settings": "Steuerung",
"Cheats": "Betrüger", "Cheats": "Cheats",
"Cache Manager": "Cache-Manager", "Cache Manager": "Cache-Manager",
"Export Save File": "Speichern Sie die Datei exportieren", "Export Save File": "Speicherstand exportieren",
"Import Save File": "Speicherdatei importieren", "Import Save File": "Speicherstand importieren",
"Netplay": "Spiel am Netz", "Netplay": "Onlinespiel",
"Mute": "Stumm", "Mute": "Stumm",
"Unmute": "Stummschaltung aufheben", "Unmute": "Stummschaltung aufheben",
"Settings": "Einstellungen", "Settings": "Einstellungen",
"Enter Fullscreen": "Vollbildmodus aktivieren", "Enter Fullscreen": "Vollbildmodus aktivieren",
"Exit Fullscreen": "Beenden Sie den Vollbildmodus", "Exit Fullscreen": "Vollbildmodus verlassen",
"Reset": "Zurücksetzen", "Reset": "Zurücksetzen",
"Clear": "Klar", "Clear": "Löschen",
"Close": "Schließen", "Close": "Schließen",
"QUICK SAVE STATE": "SCHNELLER SPEICHERENZUSTAND", "QUICK SAVE STATE": "SCHNELLSPEICHERN",
"QUICK LOAD STATE": "SCHNELLER LADEZUSTAND", "QUICK LOAD STATE": "SCHNELLLADEN",
"CHANGE STATE SLOT": "STATUS-SLOT ÄNDERN", "CHANGE STATE SLOT": "STATUS-SLOT ÄNDERN",
"FAST FORWARD": "SCHNELLER VORLAUF", "FAST FORWARD": "VORSPULEN",
"Player": "Spieler", "Player": "Spieler",
"Connected Gamepad": "Verbundenes Gamepad", "Connected Gamepad": "Verbundenes Gamepad",
"Gamepad": "Gamepad", "Gamepad": "Gamepad",
"Keyboard": "Tastatur", "Keyboard": "Tastatur",
"Set": "Satz", "Set": "Setzen",
"Add Cheat": "Cheat hinzufügen", "Add Cheat": "Cheat hinzufügen",
"Create a Room": "Erstellen Sie einen Raum", "Create a Room": "Raum erstellen",
"Rooms": "Räume", "Rooms": "Räume",
"Start Game": "Spiel beginnen", "Start Game": "Spiel beginnen",
"Loading...": "Wird geladen...", "Loading...": "Wird geladen...",
"Download Game Core": "Laden Sie Game Core herunter", "Download Game Core": "Game Core herunterladen",
"Decompress Game Core": "Game Core entpacken", "Decompress Game Core": "Game Core entpacken",
"Download Game Data": "Spieldaten herunterladen", "Download Game Data": "Spieldaten herunterladen",
"Decompress Game Data": "Spieldaten entpacken", "Decompress Game Data": "Spieldaten entpacken",
@ -57,16 +57,16 @@
"FPS": "FPS", "FPS": "FPS",
"show": "zeigen", "show": "zeigen",
"hide": "verstecken", "hide": "verstecken",
"Fast Forward Ratio": "Schnellvorlaufverhältnis", "Fast Forward Ratio": "Vorspulgeschwindigkeit",
"Fast Forward": "Schneller Vorlauf", "Fast Forward": "Vorspulen",
"Enabled": "Ermöglicht", "Enabled": "Aktiviert",
"Save State Slot": "Status-Slot speichern", "Save State Slot": "Speicherplatz",
"Save State Location": "Bundeslandstandort speichern", "Save State Location": "Speicherort",
"Download": "Herunterladen", "Download": "Herunterladen",
"Keep in Browser": "Im Browser behalten", "Keep in Browser": "Im Browser behalten",
"Auto": "Auto", "Auto": "Auto",
"NTSC": "NTSC", "NTSC": "NTSC",
"PAL": "KUMPEL", "PAL": "PAL",
"Dendy": "Dendy", "Dendy": "Dendy",
"8:7 PAR": "8:7 PAR", "8:7 PAR": "8:7 PAR",
"4:3": "4:3", "4:3": "4:3",
@ -77,59 +77,59 @@
"Player 1": "Spieler 1", "Player 1": "Spieler 1",
"Player 2": "Spieler 2", "Player 2": "Spieler 2",
"Both": "Beide", "Both": "Beide",
"SAVED STATE TO SLOT": "STATUS FÜR SLOT GESPEICHERT", "SAVED STATE TO SLOT": "STATUS IN SLOT SPEICHERN",
"LOADED STATE FROM SLOT": "GELADENER STATUS VON SLOT", "LOADED STATE FROM SLOT": "STATUS VON SLOT GELADEN",
"SET SAVE STATE SLOT TO": "SAVE STATE SLOT EINSTELLEN AUF", "SET SAVE STATE SLOT TO": "SPEICHERPLATZ ÄNDERN",
"Network Error": "Netzwerkfehler", "Network Error": "Netzwerkfehler",
"Submit": "Einreichen", "Submit": "Abschicken",
"Description": "Beschreibung", "Description": "Beschreibung",
"Code": "Code", "Code": "Code",
"Add Cheat Code": "Cheat-Code hinzufügen", "Add Cheat Code": "Cheat-Code hinzufügen",
"Leave Room": "Zimmer verlassen", "Leave Room": "Raum verlassen",
"Password": "Passwort", "Password": "Passwort",
"Password (optional)": "Passwort (optional)", "Password (optional)": "Passwort (optional)",
"Max Players": "Maximale Spieleranzahl", "Max Players": "Maximale Spieleranzahl",
"Room Name": "Raumname", "Room Name": "Raumname",
"Join": "Verbinden", "Join": "Beitreten",
"Player Name": "Spielername", "Player Name": "Spielername",
"Set Player Name": "Legen Sie den Spielernamen fest", "Set Player Name": "Spielernamen festlegen",
"Left Handed Mode": "Linkshänder-Modus", "Left Handed Mode": "Linkshänder-Modus",
"Virtual Gamepad": "Virtuelles Gamepad", "Virtual Gamepad": "Virtuelles Gamepad",
"Disk": "Scheibe", "Disk": "Scheibe",
"Press Keyboard": "Drücken Sie Tastatur", "Press Keyboard": "Taste drücken",
"INSERT COIN": "MÜNZE EINWERFEN", "INSERT COIN": "MÜNZE EINWERFEN",
"Remove": "Entfernen", "Remove": "Entfernen",
"SAVE LOADED FROM BROWSER": "SPEICHERN VOM BROWSER GELADEN", "SAVE LOADED FROM BROWSER": "SPEICHERSTAND VOM BROWSER GELADEN",
"SAVE SAVED TO BROWSER": "SPEICHERN IM BROWSER GESPEICHERT", "SAVE SAVED TO BROWSER": "SPEICHERSTAND IM BROWSER GESPEICHERT",
"Join the discord": "Treten Sie dem Discord bei", "Join the discord": "Treten Sie dem Discord bei",
"View on GitHub": "Auf GitHub ansehen", "View on GitHub": "Auf GitHub ansehen",
"Failed to start game": "Das Spiel konnte nicht gestartet werden", "Failed to start game": "Das Spiel konnte nicht gestartet werden",
"Download Game BIOS": "Laden Sie das Spiel-BIOS herunter", "Download Game BIOS": "Spiel-BIOS herunterladen",
"Decompress Game BIOS": "Dekomprimieren Sie das Spiel-BIOS", "Decompress Game BIOS": "Spiel-BIOS entpacken",
"Download Game Parent": "Laden Sie Game Parent herunter", "Download Game Parent": "Game Parent herunterladen",
"Decompress Game Parent": "Dekomprimieren Sie das übergeordnete Spiel", "Decompress Game Parent": "Game Parent entpacken",
"Download Game Patch": "Laden Sie den Spiel-Patch herunter", "Download Game Patch": "Spiel-Patch herunterladen",
"Decompress Game Patch": "Dekomprimieren Sie den Spiel-Patch", "Decompress Game Patch": "Spiel-Patch entpacken",
"Download Game State": "Spielstatus herunterladen", "Download Game State": "Spielstatus herunterladen",
"Check console": "Überprüfen Sie die Konsole", "Check console": "Überprüfen Sie die Konsole",
"Error for site owner": "Fehler für Websitebesitzer", "Error for site owner": "Fehler für Websitebesitzer",
"EmulatorJS": "EmulatorJS", "EmulatorJS": "EmulatorJS",
"Clear All": "Alles löschen", "Clear All": "Alles löschen",
"Take Screenshot": "Einen Screenshot machen", "Take Screenshot": "Screenshot aufnehmen",
"Quick Save": "Schnellspeichern", "Quick Save": "Schnellspeichern",
"Quick Load": "Schnell laden", "Quick Load": "Schnell laden",
"REWIND": "ZURÜCKSPULEN", "REWIND": "ZURÜCKSPULEN",
"Rewind Enabled (requires restart)": "Rücklauf aktiviert (Neustart erforderlich)", "Rewind Enabled (requires restart)": "Zurückspulen aktiviert (Neustart erforderlich)",
"Rewind Granularity": "Granularität zurückspulen", "Rewind Granularity": "Zurückspulgeschwindigkeit",
"Slow Motion Ratio": "Zeitlupenverhältnis", "Slow Motion Ratio": "Zeitlupengeschwindigkeit",
"Slow Motion": "Zeitlupe", "Slow Motion": "Zeitlupe",
"Home": "Heim", "Home": "Zurück",
"EmulatorJS License": "EmulatorJS-Lizenz", "EmulatorJS License": "EmulatorJS-Lizenz",
"RetroArch License": "RetroArch-Lizenz", "RetroArch License": "RetroArch-Lizenz",
"SLOW MOTION": "ZEITLUPE", "SLOW MOTION": "ZEITLUPE",
"A": "A", "A": "A",
"B": "B", "B": "B",
"SELECT": "WÄHLEN", "SELECT": "SELECT",
"START": "START", "START": "START",
"UP": "HOCH", "UP": "HOCH",
"DOWN": "RUNTER", "DOWN": "RUNTER",
@ -140,12 +140,12 @@
"L": "L", "L": "L",
"R": "R", "R": "R",
"Z": "Z", "Z": "Z",
"STICK UP": "Bleiben Sie dran", "STICK UP": "STICK NACH OBEN",
"STICK DOWN": "HALTE DICH", "STICK DOWN": "STICK NOCH UNTEN",
"STICK LEFT": "LINKS STEHEN", "STICK LEFT": "STICK LINKS",
"STICK RIGHT": "HALTEN SIE SICH NACH RECHTS", "STICK RIGHT": "STICK RECHTS",
"C-PAD UP": "C-PAD nach oben", "C-PAD UP": "C-PAD HOCH",
"C-PAD DOWN": "C-PAD NACH UNTEN", "C-PAD DOWN": "C-PAD RUNTER",
"C-PAD LEFT": "C-PAD LINKS", "C-PAD LEFT": "C-PAD LINKS",
"C-PAD RIGHT": "C-PAD RECHTS", "C-PAD RIGHT": "C-PAD RECHTS",
"MICROPHONE": "MIKROFON", "MICROPHONE": "MIKROFON",
@ -171,83 +171,83 @@
"COLOR": "FARBE", "COLOR": "FARBE",
"B/W": "S/W", "B/W": "S/W",
"PAUSE": "PAUSE", "PAUSE": "PAUSE",
"OPTION": "MÖGLICHKEIT", "OPTION": "EINSTELLUNGEN",
"OPTION 1": "OPTION 1", "OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2", "OPTION 2": "OPTION 2",
"L2": "L2", "L2": "L2",
"R2": "R2", "R2": "R2",
"L3": "L3", "L3": "L3",
"R3": "R3", "R3": "R3",
"L STICK UP": "L BLEIB DURCH", "L STICK UP": "L STICK NACH OBEN",
"L STICK DOWN": "L HALTE DICH", "L STICK DOWN": "L STICK NACH UNTEN",
"L STICK LEFT": "L STICK LINKS", "L STICK LEFT": "L STICK LINKS",
"L STICK RIGHT": "L HALTE NACH RECHTS", "L STICK RIGHT": "L STICK RECHTS",
"R STICK UP": "R HALTEN SIE SICH AUF", "R STICK UP": "R STICK NACH OBEN",
"R STICK DOWN": "R HALTEN SIE SICH NACH UNTEN", "R STICK DOWN": "R STICK NACH UNTEN",
"R STICK LEFT": "R STICK LINKS", "R STICK LEFT": "R STICK LINKS",
"R STICK RIGHT": "R STICK NACH RECHTS", "R STICK RIGHT": "R STICK RECHTS",
"Start": "Start", "Start": "Start",
"Select": "Wählen", "Select": "Select",
"Fast": "Schnell", "Fast": "Schnell",
"Slow": "Langsam", "Slow": "Langsam",
"a": "A", "a": "a",
"b": "B", "b": "b",
"c": "C", "c": "c",
"d": "D", "d": "d",
"e": "e", "e": "e",
"f": "F", "f": "F",
"g": "G", "g": "g",
"h": "H", "h": "h",
"i": "ich", "i": "i",
"j": "J", "j": "J",
"k": "k", "k": "k",
"l": "l", "l": "l",
"m": "M", "m": "m",
"n": "N", "n": "n",
"o": "Ö", "o": "o",
"p": "P", "p": "p",
"q": "Q", "q": "q",
"r": "R", "r": "r",
"s": "S", "s": "s",
"t": "T", "t": "t",
"u": "u", "u": "u",
"v": "v", "v": "v",
"w": "w", "w": "w",
"x": "X", "x": "x",
"y": "j", "y": "y",
"z": "z", "z": "z",
"enter": "eingeben", "enter": "ENTER",
"escape": "Flucht", "escape": "ESC",
"space": "Raum", "space": "Leertaste",
"tab": "Tab", "tab": "Tab",
"backspace": "Rücktaste", "backspace": "Rücktaste",
"delete": "löschen", "delete": "ENTF",
"arrowup": "Pfeil nach oben", "arrowup": "Pfeil nach oben",
"arrowdown": "Pfeil nach unten", "arrowdown": "Pfeil nach unten",
"arrowleft": "Pfeil nach links", "arrowleft": "Pfeil nach links",
"arrowright": "Pfeil nach rechts", "arrowright": "Pfeil nach rechts",
"f1": "f1", "f1": "F1",
"f2": "f2", "f2": "F2",
"f3": "f3", "f3": "F3",
"f4": "f4", "f4": "F4",
"f5": "f5", "f5": "F5",
"f6": "f6", "f6": "F6",
"f7": "f7", "f7": "F7",
"f8": "f8", "f8": "F8",
"f9": "f9", "f9": "F9",
"f10": "f10", "f10": "F10",
"f11": "f11", "f11": "F11",
"f12": "f12", "f12": "F12",
"shift": "Schicht", "shift": "Shift",
"control": "Kontrolle", "control": "strg",
"alt": "alt", "alt": "alt",
"meta": "Meta", "meta": "Meta",
"capslock": "Feststelltaste", "capslock": "capslock",
"insert": "einfügen", "insert": "einf",
"home": "heim", "home": "pos1",
"end": "Ende", "end": "ende",
"pageup": "Seite nach oben", "pageup": "bild hoch",
"pagedown": "Bild nach unten", "pagedown": "bild runter",
"!": "!", "!": "!",
"@": "@", "@": "@",
"#": "#", "#": "#",
@ -282,15 +282,15 @@
"RIGHT_STICK_Y": "RIGHT_STICK_Y", "RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "LINKER TRIGGER", "LEFT_TRIGGER": "LINKER TRIGGER",
"RIGHT_TRIGGER": "RIGHT_TRIGGER", "RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "EIN KNOPF", "A_BUTTON": "A_BUTTON",
"B_BUTTON": "B_BUTTON", "B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON", "X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON", "Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "START KNOPF", "START_BUTTON": "START",
"SELECT_BUTTON": "AUSWAHLKNOPF", "SELECT_BUTTON": "SELECT",
"L1_BUTTON": "L1_TASTE", "L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON", "R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_TASTE", "L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON", "R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON", "LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON", "RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",

View file

@ -0,0 +1,302 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Chạy lại",
"Pause": "Tạm dừng",
"Play": "Chơi",
"Save State": "Lưu State",
"Load State": "Nạp State",
"Control Settings": "Cài đặt điều khiển",
"Cheats": "Gian lận xíu",
"Cache Manager": "Bộ nhớ đệm",
"Export Save File": "Xuất tệp lưu",
"Import Save File": "Nhập tệp lưu ",
"Netplay": "Chơi qua mạng",
"Mute": "Tắt âm",
"Unmute": "Mở âm",
"Settings": "Cài đặt",
"Enter Fullscreen": "Toàn màn hình",
"Exit Fullscreen": "Thoát toàn màn hình",
"Context Menu": "Menu chuột phải",
"Reset": "Đặt lại",
"Clear": "Xoá",
"Close": "Đóng",
"QUICK SAVE STATE": "LƯU NHANH",
"QUICK LOAD STATE": "NẠP NHANH",
"CHANGE STATE SLOT": "ĐỔI NHANH",
"FAST FORWARD": "TIẾN NHANH ",
"Player": "Người chơi",
"Connected Gamepad": "Bảng điều khiển đã kết nối",
"Gamepad": "Bảng điều khiển ",
"Keyboard": "Bàn phím",
"Set": "Đặt",
"Add Cheat": "Thêm mật mã",
"Create a Room": "Tạo phòng",
"Rooms": "Các phòng",
"Start Game": "Bắt đầu chơi",
"Loading...": "Đang nạp...",
"Download Game Core": "Tải xuống nhân trò chơi",
"Decompress Game Core": "Giải nén nhân trò chơi",
"Download Game Data": "Tải xuống dữ liệu trò chơi",
"Decompress Game Data": "Giải nén dữ liệu trò chơi ",
"Shaders": "Shaders",
"Disabled": "Vô hiệu",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT chế độ dễ",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "hiện",
"hide": "ẩn",
"Fast Forward Ratio": "Tỷ lệ tiến nhanh",
"Fast Forward": "Tiến nhanh",
"Enabled": "Cho phép",
"Save State Slot": "Lưu trạng thái thẻ",
"Save State Location": "Lưu trạng thái vị trí",
"Download": "Tải về",
"Keep in Browser": "Giữ ở trình duyệt",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Thấp",
"High": "Cao",
"Very High": "Rất cao",
"None": "Không gì",
"Player 1": "Game thủ 1",
"Player 2": "Game thủ 2",
"Both": "Cả hai",
"SAVED STATE TO SLOT": "SAVED STATE TO SLOT",
"LOADED STATE FROM SLOT": "LOADED STATE FROM SLOT",
"SET SAVE STATE SLOT TO": "SET SAVE STATE SLOT TO",
"Network Error": "Mạng bị lỗi",
"Submit": "Gửi đi",
"Description": "Mô tả",
"Code": "Mã",
"Add Cheat Code": "Thêm mã gian lận",
"Leave Room": "Rời phòng",
"Password": "Mật khẩu",
"Password (optional)": "Mật khẩu (tùy chọn)",
"Max Players": "Người chơi tối đa",
"Room Name": "Tên phòng",
"Join": "Tham gia",
"Player Name": "Tên người chơi",
"Set Player Name": "Đặt tên người chơi",
"Left Handed Mode": "Chế độ tay trái",
"Virtual Gamepad": "Bàn phím ảo",
"Disk": "Đĩa",
"Press Keyboard": "Bàn phím",
"INSERT COIN": "THÊM XU",
"Remove": "Loại bỏ",
"SAVE LOADED FROM BROWSER": "SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "SAVE SAVED TO BROWSER",
"Join the discord": "Tham gia thảo luận",
"View on GitHub": "Xem trên GitHub",
"Failed to start game": "Thất bại khởi động game",
"Download Game BIOS": "Tải Game BIOS",
"Decompress Game BIOS": "Giải nén Game BIOS",
"Download Game Parent": "Tải Game cha",
"Decompress Game Parent": "Giải nén Game cha",
"Download Game Patch": "Tải vá Game ",
"Decompress Game Patch": "Giải nén Game vá",
"Download Game State": "Tải trạng thái Game",
"Check console": "Kiểm tra log console",
"Error for site owner": "Lỗi sở hữu trang chủ",
"EmulatorJS": "EmulatorJS",
"Clear All": "Xóa hết",
"Take Screenshot": "Chụp màn hình",
"Quick Save": "Lưu nhanh",
"Quick Load": "Nạp nhanh",
"REWIND": "REWIND",
"Rewind Enabled (requires restart)": "Cho phép quay lui (cần khởi động lại)",
"Rewind Granularity": "Rewind Granularity",
"Slow Motion Ratio": "Tỷ lệ chuyển động chậm",
"Slow Motion": "chuyển động chậm",
"Home": "Nhà",
"EmulatorJS License": "Giấy phép EmulatorJS",
"RetroArch License": "Giấy phép RetroArch ",
"SLOW MOTION": "CHUYỂN ĐỘNG CHẬM",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "UP",
"DOWN": "DOWN",
"LEFT": "LEFT",
"RIGHT": "RIGHT",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "STICK UP",
"STICK DOWN": "STICK DOWN",
"STICK LEFT": "STICK LEFT",
"STICK RIGHT": "STICK RIGHT",
"C-PAD UP": "C-PAD UP",
"C-PAD DOWN": "C-PAD DOWN",
"C-PAD LEFT": "C-PAD LEFT",
"C-PAD RIGHT": "C-PAD RIGHT",
"MICROPHONE": "MICROPHONE",
"BUTTON 1 / START": "BUTTON 1 / START",
"BUTTON 2": "BUTTON 2",
"BUTTON": "BUTTON",
"LEFT D-PAD UP": "LEFT D-PAD UP",
"LEFT D-PAD DOWN": "LEFT D-PAD DOWN",
"LEFT D-PAD LEFT": "LEFT D-PAD LEFT",
"LEFT D-PAD RIGHT": "LEFT D-PAD RIGHT",
"RIGHT D-PAD UP": "RIGHT D-PAD UP",
"RIGHT D-PAD DOWN": "RIGHT D-PAD DOWN",
"RIGHT D-PAD LEFT": "RIGHT D-PAD LEFT",
"RIGHT D-PAD RIGHT": "RIGHT D-PAD RIGHT",
"C": "C",
"MODE": "MODE",
"FIRE": "FIRE",
"RESET": "RESET",
"LEFT DIFFICULTY A": "LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "RIGHT DIFFICULTY B",
"COLOR": "COLOR",
"B/W": "B/W",
"PAUSE": "PAUSE",
"OPTION": "OPTION",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK UP",
"L STICK DOWN": "L STICK DOWN",
"L STICK LEFT": "L STICK LEFT",
"L STICK RIGHT": "L STICK RIGHT",
"R STICK UP": "R STICK UP",
"R STICK DOWN": "R STICK DOWN",
"R STICK LEFT": "R STICK LEFT",
"R STICK RIGHT": "R STICK RIGHT",
"Start": "Start",
"Select": "Select",
"Fast": "Fast",
"Slow": "Slow",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "enter",
"escape": "escape",
"space": "space",
"tab": "tab",
"backspace": "backspace",
"delete": "delete",
"arrowup": "arrowup",
"arrowdown": "arrowdown",
"arrowleft": "arrowleft",
"arrowright": "arrowright",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "shift",
"control": "control",
"alt": "alt",
"meta": "meta",
"capslock": "capslock",
"insert": "insert",
"home": "home",
"end": "end",
"pageup": "pageup",
"pagedown": "pagedown",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "LEFT_STICK_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "LEFT_TRIGGER",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "A_BUTTON",
"B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "START_BUTTON",
"SELECT_BUTTON": "SELECT_BUTTON",
"L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
{ "current_version": 401.1 } { "current_version": 401.2 }

View file

@ -1,6 +1,4 @@
<br> <br>
<div align = center> <div align = center>
# Contributors # Contributors
@ -14,7 +12,9 @@
***Main Contributor*** ***Main Contributor***
<a href="https://github.com/ethanaobrien" target="_blank">**![Badge Ethan GitHub]**</a> <a href="https://github.com/ethanaobrien" target="_blank">**![Badge Ethan GitHub]**</a>
<a href="https://ethanthesleepy.one" target="_blank">**![Badge Ethan Website]**</a>
<br> <br>
<br> <br>
@ -23,9 +23,11 @@
### Co-Owner ### Co-Owner
***Various Fixes & Additions*** ***Maintainer, Along with Various Fixes and Additions***
<a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a> <a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a>
<a href="https://allancoding.is-a.dev/" target="_blank">**![Badge Allan Website]**</a>
<br> <br>
<br> <br>
@ -43,6 +45,16 @@
<br> <br>
<br> <br>
![Michael Avatar]
***External Project Maintainer***
<a href="https://github.com/michael-j-green" target="_blank">**![Badge Michael GitHub]**</a>
<a href="https://www.mrgtech.net/" target="_blank">**![Badge Michael Website]**</a>
<br>
<br>
![Archiver Avatar] ![Archiver Avatar]
@ -56,20 +68,18 @@
<br> <br>
<br> <br>
<a href="https://github.com/n-at" target="_blank" title="n-at - Alexey Nurgaliev">![Avatar Alexey]</a>&nbsp; <a href="https://github.com/n-at" target="_blank" title="n-at - Alexey Nurgaliev">![Avatar Alexey]</a>&nbsp;
<a href="https://github.com/Grey41" target="_blank" title="Grey41 - Grey Hope">![Avatar Grey]</a>&nbsp; <a href="https://github.com/Grey41" target="_blank" title="Grey41 - Grey Hope">![Avatar Grey]</a>&nbsp;
<a href="https://github.com/imneckro" target="_blank" title="ImNekro - ck-oneman">![Avatar Nekro]</a>&nbsp; <a href="https://github.com/imneckro" target="_blank" title="ImNekro - ck-oneman">![Avatar Nekro]</a>&nbsp;
<a href="https://github.com/rwv" target="_blank" title="rwv - seedgou">![Avatar seedgou]</a>&nbsp; <a href="https://github.com/rwv" target="_blank" title="rwv - seedgou">![Avatar seedgou]</a>&nbsp;
<a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea">![Avatar incredibleIdea]</a>&nbsp; <a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea">![Avatar incredibleIdea]</a>&nbsp;
<a href="https://github.com/E-Sh4rk" target="_blank" title="E-Sh4rk - Mickaël Laurent" width="95px"><img src="https://github.com/E-Sh4rk.png?size=95" width="95px"></a>&nbsp; <a href="https://github.com/E-Sh4rk" target="_blank" title="E-Sh4rk - Mickaël Laurent"><img src="https://github.com/E-Sh4rk.png?size=95" width="95px"></a>&nbsp;
<a href="https://github.com/cheesykyle" target="_blank" title="CheesyKyle - Kyle Steffel">![Avatar Kyle]</a>&nbsp; <a href="https://github.com/cheesykyle" target="_blank" title="CheesyKyle - Kyle Steffel">![Avatar Kyle]</a>&nbsp;
<a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita">![Avatar andrigamerita]</a>&nbsp; <a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita">![Avatar andrigamerita]</a>&nbsp;
<a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Protektor">![Avatar Protektor]</a>&nbsp; <a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Protektor">![Avatar Protektor]</a>&nbsp;
<a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Priyansh Prajapat">![Avatar Priyansh]</a>&nbsp; <a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Priyansh Prajapat">![Avatar Priyansh]</a>&nbsp;
<a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01">![Avatar debuggerx01]</a>&nbsp; <a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01">![Avatar debuggerx01]</a>&nbsp;
<a href="https://github.com/eric183" target="_blank" title="eric183 - ericKuang">![Avatar ericKuang]</a>&nbsp; <a href="https://github.com/eric183" target="_blank" title="eric183 - ericKuang">![Avatar ericKuang]</a>&nbsp;
<a href="https://github.com/michael-j-green" target="_blank" title="michael-j-green - Michael Green">![Avatar Michael]</a>&nbsp;
<a href="https://github.com/gantoine" target="_blank" title="gantoine - Georges-Antoine Assi">![Avatar gantoine]</a>&nbsp; <a href="https://github.com/gantoine" target="_blank" title="gantoine - Georges-Antoine Assi">![Avatar gantoine]</a>&nbsp;
</div> </div>
@ -100,35 +110,30 @@
[Avatar debuggerx01]: https://github.com/debuggerx01.png?size=95 [Avatar debuggerx01]: https://github.com/debuggerx01.png?size=95
[Avatar Michael]: https://github.com/michael-j-green.png?size=95
[Avatar gantoine]: https://github.com/gantoine.png?size=95 [Avatar gantoine]: https://github.com/gantoine.png?size=95
<!----------------------------------{ Ethan }-----------------------------------> <!----------------------------------{ Ethan }----------------------------------->
[Badge Ethan GitHub]: https://img.shields.io/badge/Ethan_O'_Brien-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white [Badge Ethan GitHub]: https://img.shields.io/badge/Ethan_O'_Brien-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Ethan Website]: https://img.shields.io/badge/ethanthesleepy.one-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKTSURBVEhLtdVbaM5hHMDxlzmvHNoyzbHEZlphyanckRslh0SK2sUutms3btyhKBdiEgoX5GK5IOdQIo0UEW2hOZ/mkOOcvt/1PH9v75937zK/+vTufd49p9//9zz/zP+OovBZSAzACAzFD3xFl9ErfP4tirEQyzAVfWF8Qwv24TA+o1vhaqfjPL4HP+GqHdy/3YXtrXARg1BQjMRGvMcHnMQLOGATjsCBn+IYXsL/24bRyBsDsQVu+TVWwvS8ggPNx1g8xhssxgxcgrs7irw7mQcH78AiWARbw/dm9IOxAabJT9M5GabKne1Cb6RiCK7Df9qOSajBRTiYO5sQLICTXsM0VGATPuEd3GkqGuDgskJu4A4+wgnuhzbdghPodmizj2my/w70RxKWa1xpT7iAUUhyZeWMgZVTj5nBWhhWUmzTLGyGcRCxfTZMkwfSlCcxBU9g6VXZQLir1XBF5j/3UK6Cvx3o/PY7fI7P4DlKdpDd2XqPEX93oNww10budWO7/TrHjAO0wx/6oAyWnuJ9U4rYJmu9BIZVE9s9Rx42D94XJCv3jvEhm6orMFWGuZwDD9ZlxJ3Yz3KthpV2E4YL9Nrw4K1AG5JYD9PjIP9qN+KhTMIqsgLcWi1cvSt0R3ayuoYHlbDi7mFiaKvDW5ger5g/xjo4wXN4x7jlPfD5HEe8rp3MSXfCvDvJ1dB2GqnVx7B298MT6urWYDm82Jx0LtzZXbjaJTDnZ+Dgp+BlmDdM1Qm4agdx5Q/D90bsDX/7AD2xTuyzOwt3UlAMhgfIEnSw+PBNX/YLR95V5zAeqcg9ndnhGfFWXIpxKIdXin1c9SM8gCs/BAskFfkmiOEB8kU/LLCPO/OF5Iuo2+/jHoxM5hef3tZ5zF6TlgAAAABJRU5ErkJggg==
[Ethan Avatar]: https://avatars.githubusercontent.com/u/77750390?s=90 'Ethan O\'Brien' [Ethan Avatar]: https://avatars.githubusercontent.com/u/77750390?s=90 'Ethan O\'Brien'
<!---------------------------{ ElectronicsArchiver }---------------------------> <!---------------------------{ ElectronicsArchiver }--------------------------->
[Badge Archiver GitHub]: https://img.shields.io/badge/ElectronicsArchiver-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white [Badge Archiver GitHub]: https://img.shields.io/badge/ElectronicsArchiver-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Archiver Marked]: https://img.shields.io/badge/-49a2d5.svg?style=for-the-badge&logo=GitHub&logoColor=white [Badge Archiver Marked]: https://img.shields.io/badge/-49a2d5.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Archiver Avatar]: https://avatars.githubusercontent.com/u/85485984?s=90 'ElectronicsArchiver - トトも' [Archiver Avatar]: https://avatars.githubusercontent.com/u/85485984?s=90 'ElectronicsArchiver - トトも'
<!----------------------------------{ Allan }----------------------------------> <!----------------------------------{ Allan }---------------------------------->
[Badge Allan GitHub]: https://img.shields.io/badge/allancoding-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white [Badge Allan GitHub]: https://img.shields.io/badge/allancoding-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Allan Website]: https://img.shields.io/badge/allancoding.isa.dev-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAATCAYAAACKsM07AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALJSURBVEhLtZVNSFRRGIbfc2emctLUimmV4KIWBbNpUf4lZAYRBBH0syioTZA/1cKKcVGkbqQkCKJNGRlRVLpwMSiWlakhakaaWv7kIFqZVKhDznjv13vGASWTGdCel4d75zuHc+6ZOeeODdGjaAF101ZdiIZoJ9CDn6M+6qDbaDuNiBG+RiKPjg4C1Z1ABe/1g53QDZGIZoIc+pODV1lKVTmVul8P3GZtNT2mOyyFU/QkB181oFT1gGGItl+pB5zEzrZ8ekR3XAz93XqU0pcFbKBptHI7kJmh1J5QNUydSHUH8Ia3egIv/aXr8xERqKKiIsnP1w+y/HBsoLS0lBP9Hzwej9iys7MvB1MDaJJGeMWLFJWKErMYKUYqcs3TSFCJeCQP0SFv4UQMcq0cDDPXrTIEGI95EVvUVtyVO6ixatAoDaiQexhkpur9s7uo1qpFuVWOdmlDkOlHH3ziwxPrMSqtpygzr2JIhjAogzikDiOByVK78VyewWTOmnnolm7csm7iPaPHWMFoQiv4kTIOUQKdFmlBl3TiA7qwSW3Gd4whQ2XCpVxYyejV+Jg+fIKL6WWu2IoxKl/gVm5uLTt6pAfjzLr69VD6Nygo0G+AOV6+8CMYFPj9FpKSHPD5gtwRbKDpO5143eAPtcXFGpgOCPsCu7KccLn0zp2jsLAQ9kAggImJiXBplslJP9rbfmNkJIi0dCeGPgcxPDyD+HgDlsTgXcc0vn2dgV2/NIhp8gXlTkRMTLgQRo+tHA7HNRouzcFN4LIsy22z2eoyLSs1WWRHuClEr2G8alaq1TTNvYZhNPEsLTgHQb20CJynB/j+ie0zjIZ5J9nLmv4Vj1N92hfln0f4Lzy06yNQbzcML5c2pUT2JwMHWV9Lb+hOS6WQ7hsD4vhH4OT9UXpGN0QimhVodL9LtJmuoRtpGV1W9CQl9ELoU1QAfwCDI3HISCyhigAAAABJRU5ErkJggg==
[Allan Avatar]: https://avatars.githubusercontent.com/u/74841470?s=90 'Allancoding - Allan Niles' [Allan Avatar]: https://avatars.githubusercontent.com/u/74841470?s=90 'Allancoding - Allan Niles'
<!----------------------------------{ BinBashBanana }----------------------------------> <!----------------------------------{ BinBashBanana }---------------------------------->
[Badge BinBashBanana GitHub]: https://img.shields.io/badge/BinBashBanana-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white [Badge BinBashBanana GitHub]: https://img.shields.io/badge/BinBashBanana-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge BinBashBanana Website]: https://img.shields.io/badge/binbashbanana.github.io-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA3lBMVEVHcEwiIgAYGAqfngcdHhIVFRHHyZkAAAAbGxMfGQVub1TR0Ak+Py05PBnb2QohIBeblnJ2d1tiYkthYQCOkG60swiamQciHBQoKBySk3BLSwIpLhEtMBlPSBJgXgOpqAe4LiBLDAqoqoJ3d1tlYgXBw5SzsgiDgwWio3wsLB+kowiSkQdrblVMTDheWUOkpn6dmwZ/fQWYmwc6CQkeJQKfoHmNjAZBTgMjJwRESQI6RQRmVEBiDw1sRSB0GhaQOzCBexOEhF13YyfU1qPkaCnOPiHEwgm1tAiRkAiurQs+wUq/AAAAQ3RSTlMABCP9GhL8ASoKcvtKIf5D/o5YLqTK6FY5ukIyedNR/P19zlpt+cOMzVLg4FFXcsKmu/JYbtTt48ySw9Ka/vv+9DT+PQB0UwAAAKhJREFUGBlNwQUSgkAABdAP7LK7tIXd3d0tYNz/Qs4wKr6HEDEY5YhQOVPIcBk/xtDmPJ9m+JBs06a8y/HBhDGvHqppwhAS2tI5+X5lP07GBQAzq6rOOQgqjuepMQYkm9nB9XI7FkdaR60JIKZRiPLrOWUg9ThDSOpZj76MCGtbd6WBPyRlKW4OfxIpXXFLEiKJll5ebfOE4Muc6LN1cbfBj1TKCboovAFtNA6G3DFC7wAAAABJRU5ErkJggg== [Badge BinBashBanana Website]: https://img.shields.io/badge/binbashbanana.github.io-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA3lBMVEVHcEwiIgAYGAqfngcdHhIVFRHHyZkAAAAbGxMfGQVub1TR0Ak+Py05PBnb2QohIBeblnJ2d1tiYkthYQCOkG60swiamQciHBQoKBySk3BLSwIpLhEtMBlPSBJgXgOpqAe4LiBLDAqoqoJ3d1tlYgXBw5SzsgiDgwWio3wsLB+kowiSkQdrblVMTDheWUOkpn6dmwZ/fQWYmwc6CQkeJQKfoHmNjAZBTgMjJwRESQI6RQRmVEBiDw1sRSB0GhaQOzCBexOEhF13YyfU1qPkaCnOPiHEwgm1tAiRkAiurQs+wUq/AAAAQ3RSTlMABCP9GhL8ASoKcvtKIf5D/o5YLqTK6FY5ukIyedNR/P19zlpt+cOMzVLg4FFXcsKmu/JYbtTt48ySw9Ka/vv+9DT+PQB0UwAAAKhJREFUGBlNwQUSgkAABdAP7LK7tIXd3d0tYNz/Qs4wKr6HEDEY5YhQOVPIcBk/xtDmPJ9m+JBs06a8y/HBhDGvHqppwhAS2tI5+X5lP07GBQAzq6rOOQgqjuepMQYkm9nB9XI7FkdaR60JIKZRiPLrOWUg9ThDSOpZj76MCGtbd6WBPyRlKW4OfxIpXXFLEiKJll5ebfOE4Muc6LN1cbfBj1TKCboovAFtNA6G3DFC7wAAAABJRU5ErkJggg==
[BinBashBanana Avatar]: https://avatars.githubusercontent.com/u/51469593?s=90 'BinBashBanana' [BinBashBanana Avatar]: https://avatars.githubusercontent.com/u/51469593?s=90 'BinBashBanana'
<!----------------------------------{ Michael }---------------------------------->
[Badge Michael GitHub]: https://img.shields.io/badge/michaeljgreen-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Michael Website]: https://img.shields.io/badge/www.mrgtech.net-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAe1BMVEVHcEwUFhkUFhkUFhkUFhkUFhkUFhkqKioTFRkTFhkVFxocHBwVFxkRESIYGBgVFxr///8YGh35+fkhIyY6PD7y8vL8/Pzc3d1maGpKTE5dXmC/v8DNzs6HiInU1dWrrK3j5OSam5wnKSwsLjBxcnR9foCAgYLq6urp6upDOJtqAAAAD3RSTlMA+e3V54a0Bm9NpRHaDxUPtKeMAAABIElEQVQYGVXBB3KkQBAAwQYGtyupehye9Ub/f+FBcFKgTFkd67zI0gSSNCvy+iibsjL8YapSFuWBjQ/BszmUIlKxuj8np+qm151VJXI0gO2+1bXn88npu7OAOUoN2NnFOViw/ajNbIFacqBrLoGNvarrgFwKuL914D9rR33foZAMXnqy/Lq1+oRMUpj0ys7QTJBKgnf6YG9ynkQgaNOz99QAAkHjjb1OA0iCd/HG3uw8iaQwusCOb0cw8gEPndm56gMyKcC3MfDDX5vWQyE52D62gc1w0tgDudQsuhhfwdrbMKrGjkUtX4ZFf2rcpY2NNqeehfkUqVj54Xxx7nIePKtKRMoDG7tgcyhlUVaGP0xVyuazzovMJJCkH0Vef8niH/cwItH/Rh67AAAAAElFTkSuQmCC
[Michael Avatar]: https://avatars.githubusercontent.com/u/84688932?s=90 'michael-j-green - Michael Green'

View file

@ -1,6 +1,6 @@
{ {
"name": "@emulatorjs/emulatorjs", "name": "@emulatorjs/emulatorjs",
"version": "4.0.11", "version": "4.0.12",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/EmulatorJS/EmulatorJS.git" "url": "https://github.com/EmulatorJS/EmulatorJS.git"