74 lines
No EOL
3.1 KiB
TypeScript
74 lines
No EOL
3.1 KiB
TypeScript
import { PluginContextType, PluginType } from "@/bun/types/typesc.schema";
|
|
import desc from './package.json';
|
|
import { config } from "@/bun/api/app";
|
|
import path from "node:path";
|
|
import toml, { TomlTable } from 'smol-toml';
|
|
import fs from 'node:fs/promises';
|
|
import bin from './eeprom.bin' with { type: 'file' };
|
|
|
|
export default class XEMUIntegration implements PluginType
|
|
{
|
|
emulator = 'XEMU';
|
|
|
|
load (ctx: PluginContextType)
|
|
{
|
|
ctx.hooks.games.emulatorLaunchSupport.tap({ name: desc.name, emulator: this.emulator }, (ctx) =>
|
|
{
|
|
return { id: desc.name, supportLevel: "full", capabilities: ["batch", "fullscreen", "saves", "states"] };
|
|
});
|
|
|
|
ctx.hooks.games.emulatorLaunch.tapPromise({ name: desc.name, emulator: this.emulator }, async (ctx) =>
|
|
{
|
|
const args: string[] = [];
|
|
|
|
if (config.get('launchInFullscreen'))
|
|
{
|
|
args.push("-full-screen");
|
|
}
|
|
|
|
if (ctx.autoValidCommand.metadata.romPath)
|
|
{
|
|
args.push("-dvd_path");
|
|
args.push(ctx.autoValidCommand.metadata.romPath);
|
|
}
|
|
|
|
const configPath = path.join(config.get('downloadPath'), 'storage', this.emulator, 'xemu.toml');
|
|
let configFile: { general: TomlTable & { misc: TomlTable; }, sys: TomlTable & { files: TomlTable; }; } = { general: { misc: {} }, sys: { files: {} } };
|
|
if (await Bun.file(configPath).exists())
|
|
{
|
|
configFile = toml.parse(await Bun.file(configPath).text()) as any;
|
|
}
|
|
|
|
configFile.general.misc ??= {};
|
|
configFile.general.misc.skip_boot_anim = true;
|
|
configFile.general.show_welcome = false;
|
|
configFile.general.games_dir = path.join(config.get('downloadPath'), 'roms', 'xbox');
|
|
configFile.sys.mem_limit = '128';
|
|
const biosFolder = path.join(config.get('downloadPath'), "bios", this.emulator);
|
|
if (await fs.exists(biosFolder))
|
|
{
|
|
const biosPaths = (await fs.readdir(biosFolder));
|
|
const flash = biosPaths.find(f => f.endsWith('.bin') && !f.includes('mcpx'));
|
|
const bootrom = biosPaths.find(f => f.endsWith('.bin') && f.includes('mcpx'));
|
|
const hardDrive = biosPaths.find(f => f.endsWith('qcow2'));
|
|
if (flash) configFile.sys.files.flashrom_path = path.join(biosFolder, flash);
|
|
if (bootrom) configFile.sys.files.bootrom_path = path.join(biosFolder, bootrom);
|
|
if (hardDrive) configFile.sys.files.hdd_path = path.join(biosFolder, hardDrive);
|
|
}
|
|
|
|
if (!ctx.dryRun)
|
|
{
|
|
const eepromPath = path.join(config.get('downloadPath'), "storage", this.emulator, 'eeprom.bin');
|
|
await Bun.write(eepromPath, await Bun.file(bin).arrayBuffer());
|
|
configFile.sys.files.eeprom_path = eepromPath;
|
|
|
|
await Bun.write(configPath, toml.stringify(configFile));
|
|
args.push("-config_path");
|
|
args.push(configPath);
|
|
}
|
|
|
|
|
|
return args;
|
|
});
|
|
}
|
|
} |