Merge branch 'main' into fail-early-when-core-requirements-not-met

This commit is contained in:
Michael Green 2025-12-16 00:44:08 +11:00 committed by GitHub
commit f01f10b2c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 110 additions and 49 deletions

View File

@ -128,6 +128,8 @@
config.browserMode = window.EJS_browserMode;
config.shaders = Object.assign({}, window.EJS_SHADERS, window.EJS_shaders ? window.EJS_shaders : {});
config.fixedSaveInterval = window.EJS_fixedSaveInterval;
config.disableAutoUnload = window.EJS_disableAutoUnload;
config.disableBatchBootup = window.EJS_disableBatchBootup;
let systemLang;
try {

View File

@ -99,8 +99,8 @@
"Press Keyboard": "اضغط على لوحة المفاتيح",
"INSERT COIN": "إدراج عملة",
"Remove": "يزيل",
"SAVE LOADED FROM BROWSER": "وفر محملًا من المتصفح",
"SAVE SAVED TO BROWSER": "تم الحفظ في المتصفح",
"LOADED STATE FROM BROWSER": "حالة تحميل من المتصفح",
"SAVED STATE TO BROWSER": "الحالة المحفوظة في المتصفح",
"Join the discord": "انضم إلى الفتنة",
"View on GitHub": "عرض على جيثب",
"Failed to start game": "فشل بدء اللعبة",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "কীবোর্ড টিপুন",
"INSERT COIN": "মুদ্রা প্রবেশ করান",
"Remove": "অপসারণ",
"SAVE LOADED FROM BROWSER": "ব্রাউজার থেকে লোড সংরক্ষণ করুন",
"SAVE SAVED TO BROWSER": "ব্রাউজারে সংরক্ষণ করুন",
"LOADED STATE FROM BROWSER": "ব্রাউজার থেকে লোড করা অবস্থা",
"SAVED STATE TO BROWSER": "রাষ্ট্র ব্রাউজারে সংরক্ষিত হয়",
"Join the discord": "বিরোধে যোগ দিন",
"View on GitHub": "GitHub এ দেখুন",
"Failed to start game": "খেলা শুরু করতে ব্যর্থ",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Taste drücken",
"INSERT COIN": "MÜNZE EINWERFEN",
"Remove": "Entfernen",
"SAVE LOADED FROM BROWSER": "SPEICHERSTAND VOM BROWSER GELADEN",
"SAVE SAVED TO BROWSER": "SPEICHERSTAND IM BROWSER GESPEICHERT",
"LOADED STATE FROM BROWSER": "GELADENER STATUS VOM BROWSER",
"SAVED STATE TO BROWSER": "STATUS IM BROWSER GESPEICHERT",
"Join the discord": "Treten Sie dem Discord bei",
"View on GitHub": "Auf GitHub ansehen",
"Failed to start game": "Das Spiel konnte nicht gestartet werden",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Πατήστε Πληκτρολόγιο",
"INSERT COIN": "ΕΙΣΑΓΕΤΕ ΝΟΜΙΣΜΑ",
"Remove": "Αφαιρώ",
"SAVE LOADED FROM BROWSER": "ΑΠΟΘΗΚΕΥΣΗ ΦΟΡΤΩΜΕΝΟΥ ΑΠΟ ΤΟ BROWSER",
"SAVE SAVED TO BROWSER": "ΑΠΟΘΗΚΕΥΣΗ ΑΠΟΘΗΚΕΥΤΗΚΕ ΣΤΟ BROWSER",
"LOADED STATE FROM BROWSER": "ΦΟΡΤΩΘΗΚΕ ΚΑΤΑΣΤΑΣΗ ΑΠΟ ΤΟ BROWSER",
"SAVED STATE TO BROWSER": "ΑΠΟΘΗΚΕΥΤΗΚΕ ΚΑΤΑΣΤΑΣΗ ΣΤΟ BROWSER",
"Join the discord": "Συμμετάσχετε στη διχόνοια",
"View on GitHub": "Προβολή στο GitHub",
"Failed to start game": "Απέτυχε η έναρξη του παιχνιδιού",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Press Keyboard",
"INSERT COIN": "INSERT COIN",
"Remove": "Remove",
"SAVE LOADED FROM BROWSER": "SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "SAVE SAVED TO BROWSER",
"LOADED STATE FROM BROWSER": "LOADED STATE FROM BROWSER",
"SAVED STATE TO BROWSER": "SAVED STATE TO BROWSER",
"Join the discord": "Join the discord",
"View on GitHub": "View on GitHub",
"Failed to start game": "Failed to start game",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Presionar Teclado",
"INSERT COIN": "INSERTE MONEDA",
"Remove": "Eliminar",
"SAVE LOADED FROM BROWSER": "GUARDAR CARGADO DESDE EL NAVEGADOR",
"SAVE SAVED TO BROWSER": "GUARDAR GUARDADO EN EL NAVEGADOR",
"LOADED STATE FROM BROWSER": "ESTADO CARGADO DESDE EL NAVEGADOR",
"SAVED STATE TO BROWSER": "ESTADO GUARDADO EN EL NAVEGADOR",
"Join the discord": "Únete al Discord",
"View on GitHub": "Ver en GitHub",
"Failed to start game": "Error al iniciar el juego",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "صفحه کلید را فشار دهید",
"INSERT COIN": "سکه درج کنید",
"Remove": "حذف کردن",
"SAVE LOADED FROM BROWSER": "ذخیره بارگذاری شده از مرورگر",
"SAVE SAVED TO BROWSER": "ذخیره در مرورگر ذخیره شد",
"LOADED STATE FROM BROWSER": "وضعیت بارگیری شده از مرورگر",
"SAVED STATE TO BROWSER": "وضعیت در مرورگر ذخیره شد",
"Join the discord": "به دیسکورد discord بپیوندید",
"View on GitHub": "در GitHub مشاهده کنید",
"Failed to start game": "شروع بازی ناموفق بود",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Appuyez sur le clavier",
"INSERT COIN": "INSÉRER UNE PIÈCE",
"Remove": "Retirer",
"SAVE LOADED FROM BROWSER": "SAUVEGARDE CHARGÉE À PARTIR DU NAVIGATEUR",
"SAVE SAVED TO BROWSER": "SAUVEGARDE ENREGISTRÉE DANS LE NAVIGATEUR",
"LOADED STATE FROM BROWSER": "ÉTAT CHARGÉ À PARTIR DU NAVIGATEUR",
"SAVED STATE TO BROWSER": "ÉTAT ENREGISTRÉ DANS LE NAVIGATEUR",
"Join the discord": "Rejoindre le serveur Discord",
"View on GitHub": "Afficher sur GitHub",
"Failed to start game": "Échec au démarrage du jeu",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "कीबोर्ड दबाएँ",
"INSERT COIN": "सिक्का डालें",
"Remove": "निकालना",
"SAVE LOADED FROM BROWSER": "ब्राउज़र से लोड किया गया सेव करें",
"SAVE SAVED TO BROWSER": "ब्राउज़र में सहेजा गया सहेजें",
"LOADED STATE FROM BROWSER": "ब्राउज़र से लोड किया गया राज्य",
"SAVED STATE TO BROWSER": "राज्य को ब्राउज़र में सहेजा गया",
"Join the discord": "कलह में शामिल हों",
"View on GitHub": "GitHub पर देखें",
"Failed to start game": "गेम प्रारंभ करने में विफल",

View File

@ -100,8 +100,8 @@
"Press Keyboard": "Premi Tastiera",
"INSERT COIN": "INSERISCI GETTONE",
"Remove": "Rimuovi",
"SAVE LOADED FROM BROWSER": "SALVATAGGIO CARICATO DA BROWSER",
"SAVE SAVED TO BROWSER": "SALVATAGGIO SALVATO SU BROWSER",
"LOADED STATE FROM BROWSER": "STATO CARICATO DAL BROWSER",
"SAVED STATE TO BROWSER": "STATO SALVATO NEL BROWSER",
"Join the discord": "Entra nel Discord",
"View on GitHub": "Vedi su Github",
"Failed to start game": "Avvio del gioco fallito",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "キーボードを押す",
"INSERT COIN": "コインを入れる",
"Remove": "削除",
"SAVE LOADED FROM BROWSER": "ブラウザからセーブをロードしました。",
"SAVE SAVED TO BROWSER": "ブラウザにセーブを保存しました。",
"LOADED STATE FROM BROWSER": "ブラウザからのロード状態",
"SAVED STATE TO BROWSER": "状態をブラウザに保存",
"Join the discord": "Discordに参加",
"View on GitHub": "GitHub で見る",
"Failed to start game": "ゲームの開始に失敗しました",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Pencet Keyboard",
"INSERT COIN": "INSERT COIN",
"Remove": "Mbusak",
"SAVE LOADED FROM BROWSER": "Simpen dimuat saka BROWSER",
"SAVE SAVED TO BROWSER": "SAVE disimpen menyang BROWSER",
"LOADED STATE FROM BROWSER": "NEGARA YANG DIMUAT DARI BROWSER",
"SAVED STATE TO BROWSER": "NEGARA TERSIMPAN KE BROWSER",
"Join the discord": "Melu discord",
"View on GitHub": "Deleng ing GitHub",
"Failed to start game": "Gagal miwiti game",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "키보드를 누르세요.",
"INSERT COIN": "동전을 넣으세요.",
"Remove": "제거",
"SAVE LOADED FROM BROWSER": "브라우저에서 세이브를 불러왔습니다.",
"SAVE SAVED TO BROWSER": "브라우저에 세이브가 저장되었습니다.",
"LOADED STATE FROM BROWSER": "브라우저에서 로드된 상태",
"SAVED STATE TO BROWSER": "브라우저에 저장된 상태",
"Join the discord": "디스코드에 참가하기",
"View on GitHub": "GitHub에서 보기",
"Failed to start game": "게임을 시작하지 못했습니다.",

View File

@ -105,8 +105,8 @@
"Press Keyboard": "Pressione uma tecla",
"INSERT COIN": "Insira uma ficha",
"Remove": "Remover",
"SAVE LOADED FROM BROWSER": "SAVE STATE CARREGADO DO BROWSER",
"SAVE SAVED TO BROWSER": "SAVE STATE ARMAZENADO NO BROWSER",
"LOADED STATE FROM BROWSER": "ESTADO CARREGADO DO NAVEGADOR",
"SAVED STATE TO BROWSER": "ESTADO SALVO NO NAVEGADOR",
"Join the discord": "Participar do discord",
"View on GitHub": "Ver no GitHub",
"Failed to start game": "Falha ao iniciar o jogo",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Apasă Tastatură",
"INSERT COIN": "INSERT COIN",
"Remove": "Înlăturare",
"SAVE LOADED FROM BROWSER": "SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "SAVE SAVED TO BROWSER",
"LOADED STATE FROM BROWSER": "STARE ÎNCĂRCATĂ DIN BROWSER",
"SAVED STATE TO BROWSER": "STARE SALVATĂ ÎN BROWSER",
"Join the discord": "Alăturăte pe Discord",
"View on GitHub": "Vezi în GitHub",
"Failed to start game": "Pornirea jocului a eșuat",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Нажмите кнопку на клавиатуре",
"INSERT COIN": "ВСТАВЬТЕ МОНЕТУ",
"Remove": "Удалить",
"SAVE LOADED FROM BROWSER": "ЗАГРУЖЕНО ИЗ БРАУЗЕРА",
"SAVE SAVED TO BROWSER": "СОХРАНЕНО В БРАУЗЕРЕ",
"LOADED STATE FROM BROWSER": "ЗАГРУЖЕННОЕ СОСТОЯНИЕ ИЗ БРАУЗЕРА",
"SAVED STATE TO BROWSER": "СОХРАНЕННОЕ СОСТОЯНИЕ В БРАУЗЕРЕ",
"Join the discord": "Присоединяйтесь к discord",
"View on GitHub": "Посмотреть на GitHub",
"Failed to start game": "Не удалось запустить игру",

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Klavyeye Basın",
"INSERT COIN": "JETON ATINIZ",
"Remove": "Kaldır",
"SAVE LOADED FROM BROWSER": "KAYIT TARAYICIDAN YÜKLENDİ",
"SAVE SAVED TO BROWSER": "KAYIT TARAYICIYA KAYDEDİLDİ",
"LOADED STATE FROM BROWSER": "TARAYICIDAN YÜKLENEN DURUM",
"SAVED STATE TO BROWSER": "TARAYICILARA KAYDEDİLDİ DURUM",
"Join the discord": "Discord'a katıl",
"View on GitHub": "Github'da görüntüler",
"Failed to start game": "Oyun başlatılamadı",

View File

@ -100,8 +100,8 @@
"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",
"LOADED STATE FROM BROWSER": "TRẠNG THÁI ĐÃ TẢI TỪ TRÌNH DUYỆT",
"SAVED STATE TO BROWSER": "TRẠNG THÁI ĐÃ LƯU VÀO TRÌNH DUYỆT",
"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",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "按键盘",
"INSERT COIN": "投币",
"Remove": "消除",
"SAVE LOADED FROM BROWSER": "已从浏览器加载状态",
"SAVE SAVED TO BROWSER": "已将状态保存到浏览器",
"LOADED STATE FROM BROWSER": "浏览器加载状态",
"SAVED STATE TO BROWSER": "已将状态保存至浏览器",
"Join the discord": "加入discord",
"View on GitHub": "在GitHub上查看",
"Failed to start game": "无法开始游戏",

View File

@ -164,6 +164,22 @@ class EJS_GameManager {
}
return cfg;
}
writeBootupBatchFile() {
const data = `
SET BLASTER=A220 I7 D1 H5 T6
@ECHO OFF
mount A / -t floppy
SET PATH=Z:\\;A:\\
mount c /emulator/c
c:
COMMAND.COM
IF EXIST AUTORUN.BAT AUTORUN.BAT
`;
const filename = "BOOTUP.BAT";
this.FS.writeFile("/" + filename, data);
return filename;
}
initShaders() {
if (!this.EJS.config.shaders) return;
this.mkdir("/shader");

View File

@ -4,16 +4,16 @@ class EmulatorJS {
"atari5200": ["a5200"],
"vb": ["beetle_vb"],
"nds": ["melonds", "desmume", "desmume2015"],
"arcade": ["fbneo", "fbalpha2012_cps1", "fbalpha2012_cps2"],
"arcade": ["fbneo", "fbalpha2012_cps1", "fbalpha2012_cps2", "same_cdi"],
"nes": ["fceumm", "nestopia"],
"gb": ["gambatte"],
"coleco": ["gearcoleco"],
"segaMS": ["smsplus", "genesis_plus_gx", "picodrive"],
"segaMD": ["genesis_plus_gx", "picodrive"],
"segaGG": ["genesis_plus_gx"],
"segaCD": ["genesis_plus_gx", "picodrive"],
"segaMS": ["smsplus", "genesis_plus_gx", "genesis_plus_gx_wide", "picodrive"],
"segaMD": ["genesis_plus_gx", "genesis_plus_gx_wide", "picodrive"],
"segaGG": ["genesis_plus_gx", "genesis_plus_gx_wide"],
"segaCD": ["genesis_plus_gx", "genesis_plus_gx_wide", "picodrive"],
"sega32x": ["picodrive"],
"sega": ["genesis_plus_gx", "picodrive"],
"sega": ["genesis_plus_gx", "genesis_plus_gx_wide", "picodrive"],
"lynx": ["handy"],
"mame": ["mame2003_plus", "mame2003"],
"ngp": ["mednafen_ngp"],
@ -26,7 +26,7 @@ class EmulatorJS {
"3do": ["opera"],
"psp": ["ppsspp"],
"atari7800": ["prosystem"],
"snes": ["snes9x"],
"snes": ["snes9x", "bsnes"],
"atari2600": ["stella2014"],
"jaguar": ["virtualjaguar"],
"segaSaturn": ["yabause"],
@ -1315,6 +1315,11 @@ class EmulatorJS {
}, 0);
});
this.addEventListener(window, "beforeunload", (e) => {
if (this.config.disableAutoUnload) {
e.preventDefault();
e.returnValue = "";
return
}
if (!this.started) return;
this.callEvent("exit");
});
@ -2146,7 +2151,7 @@ class EmulatorJS {
if (stateUrl) URL.revokeObjectURL(stateUrl);
if (this.getSettingValue("save-state-location") === "browser" && this.saveInBrowserSupported()) {
this.storage.states.put(this.getBaseFileName() + ".state", state);
this.displayMessage(this.localization("SAVE SAVED TO BROWSER"));
this.displayMessage(this.localization("SAVED STATE TO BROWSER"));
} else {
const blob = new Blob([state]);
stateUrl = URL.createObjectURL(blob);
@ -2162,7 +2167,7 @@ class EmulatorJS {
if (this.getSettingValue("save-state-location") === "browser" && this.saveInBrowserSupported()) {
this.storage.states.get(this.getBaseFileName() + ".state").then(e => {
this.gameManager.loadState(e);
this.displayMessage(this.localization("SAVE LOADED FROM BROWSER"));
this.displayMessage(this.localization("LOADED STATE FROM BROWSER"));
})
} else {
const file = await this.selectFile();
@ -2864,7 +2869,7 @@ class EmulatorJS {
{ id: 17, label: this.localization("RIGHT D-PAD LEFT") },
{ id: 16, label: this.localization("RIGHT D-PAD RIGHT") },
];
} else if (["segaCD", "sega32x"].includes(this.getControlScheme())) {
} else if (["segaMD", "segaCD", "sega32x"].includes(this.getControlScheme())) {
buttons = [
{ id: 1, label: this.localization("A") },
{ id: 0, label: this.localization("B") },
@ -3072,6 +3077,31 @@ class EmulatorJS {
{ id: 17, label: this.localization("STICK LEFT") },
{ id: 16, label: this.localization("STICK RIGHT") },
];
} else if ("psx" === this.getControlScheme()) {
buttons = [
{ id: 9, label: this.localization("\u25B3") }, // △
{ id: 1, label: this.localization("\u25A1") }, // □
{ id: 0, label: this.localization("\uFF58") }, //
{ id: 8, label: this.localization("\u25CB") }, // ○
{ id: 2, label: this.localization("SELECT") },
{ id: 3, label: this.localization("START") },
{ id: 4, label: this.localization("UP") },
{ id: 5, label: this.localization("DOWN") },
{ id: 6, label: this.localization("LEFT") },
{ id: 7, label: this.localization("RIGHT") },
{ id: 10, label: this.localization("L1") },
{ id: 11, label: this.localization("R1") },
{ id: 12, label: this.localization("L2") },
{ id: 13, label: this.localization("R2") },
{ id: 19, label: this.localization("L STICK UP") },
{ id: 18, label: this.localization("L STICK DOWN") },
{ id: 17, label: this.localization("L STICK LEFT") },
{ id: 16, label: this.localization("L STICK RIGHT") },
{ id: 23, label: this.localization("R STICK UP") },
{ id: 22, label: this.localization("R STICK DOWN") },
{ id: 21, label: this.localization("R STICK LEFT") },
{ id: 20, label: this.localization("R STICK RIGHT") },
];
} else {
buttons = [
{ id: 0, label: this.localization("B") },

View File

@ -170,6 +170,9 @@
if (["d64"].includes(ext))
return "vice_x64sc"
if (["md", "sg", "smd", "gen"].includes(ext))
return "segaMD"
if (["nds", "gba", "gb", "z64", "n64"].includes(ext))
return ext
@ -205,9 +208,19 @@
"Commodore VIC20": "vice_xvic",
"Commodore Plus/4": "vice_xplus4",
"Commodore PET": "vice_xpet",
"DOSBOX-PURE": "dosbox_pure"
}
if (enableThreads) {
coreValues["DOSBOX-PURE"] = "dosbox_pure";
coreValues["PlayStation Portable"] = "ppsspp";
}
for (let core in coreValues) {
if (core.toLowerCase() === ext) {
resolve(core)
}
}
const cores = Object.keys(coreValues).sort().reduce(
(obj, key) => {
obj[key] = coreValues[key];