Но хочется именно во fceux!
Сделал для последней версии
https://github.com/TASVideos/fceux.
Что делатьЗайти в Config -> Map Hotkeys. В самом низу назначить для команды Toggle Screen Mirroring клавишу, например End. Во время игры при нажатии этой клавиши будет отзеркален экран и переставлены кнопки влево/вправо для 4 контроллеров. Если при выходите из эмулятора оставить отзеркаленный режим, то кнопки останутся переставленными - это недоработка (
UPD: Исправлено).
Как сделать сборку для новой версииЯ использовал
https://ci.appveyor.com/ для сборки со скриптом, который "патчит" исходный код. Пока исходный код не изменится кардинально, патч будет работать для новых версий.
Что было изменено в коде:
### src/fceu.cpp
// В конец функции
void FCEUI_Emulate(uint8 **pXBuf, int32 **SoundBuf, int32 *SoundBufSize, int skip) {
// добавить
extern int screenMirroring;
if (screenMirroring) {
for (int y = 0; y < 256; y++) {
for (int x = 0; x < 256; x++) {
XBuf[y * 256 + x] = XBackBuf[y * 256 + 255 - x];
}
}
}
### src/input.h
// Вместо EMUCMD_MAX
EMUCMD_TOOL_MIRRORING, EMUCMD_MAX
### src/input.cpp
// Вместо #include "drivers/win/taseditor.h"
#include "drivers/win/taseditor.h"
#include "drivers/win/input.h"
// Вместо static void DebuggerStepInto(void);
static void DebuggerStepInto(void);
static void ScreenMirroring(void);
// После "Debugger - Step Into", EMUCMDFLAG_TASEDITOR }, добавить
{ EMUCMD_TOOL_MIRRORING, EMUCMDTYPE_MISC, ScreenMirroring, 0, 0, "Toggle Screen Mirroring", EMUCMDFLAG_TASEDITOR },
// Добавить в конец
int screenMirroring = 0;
void ScreenMirroring(void)
{
screenMirroring ^= 1;
extern ButtConfig GamePadConfig[4][12];
for (int i = 0; i < 4; i++)
swap(GamePadConfig[i][6], GamePadConfig[i][7]);
}
### src/drivers/win/main.cpp
// Вместо SaveConfig(TempArray);
extern ButtConfig GamePadConfig[4][12];
extern int screenMirroring;
for (int i = 0; screenMirroring && i < 4; i++)
swap(GamePadConfig[i][6], GamePadConfig[i][7]);
SaveConfig(TempArray);
Настройка AppveyorЗарегистрироваться в
https://ci.appveyor.com.
Projects -> New project, слева Git, ввести в Clone URL:
https://github.com/TASVideos/fceux.gitУ выбранного проекта:
Settings -> Artifacts, Add, ввести в Path to artifact: vc\fceux.zip
Settings -> Build -> Script, PS, вставить скрипт:
(Get-Content src\input.h) -replace "EMUCMD_MAX","EMUCMD_TOOL_MIRRORING, EMUCMD_MAX" | Set-Content src\input.h
(Get-Content src\input.cpp) -replace "#include `"drivers/win/taseditor.h`"","#include `"drivers/win/taseditor.h`"`r`n#include `"drivers/win/input.h`"" | Set-Content src\input.cpp
(Get-Content src\input.cpp) -replace "static void DebuggerStepInto\(void\);","static void DebuggerStepInto(void);`r`nstatic void ScreenMirroring(void);" | Set-Content src\input.cpp
(Get-Content src\input.cpp) -replace "Debugger - Step Into`", EMUCMDFLAG_TASEDITOR },","Debugger - Step Into`", EMUCMDFLAG_TASEDITOR },`r`n { EMUCMD_TOOL_MIRRORING, EMUCMDTYPE_MISC, ScreenMirroring, 0, 0, `"Toggle Screen Mirroring`", EMUCMDFLAG_TASEDITOR }," | Set-Content src\input.cpp
Add-Content src\input.cpp "int screenMirroring = 0;`r`nvoid ScreenMirroring(void)`r`n{`r`n screenMirroring ^= 1;`r`n extern ButtConfig GamePadConfig[4][12];`r`n for (int i = 0; i < 4; i++)`r`n swap(GamePadConfig[i][6], GamePadConfig[i][7]);`r`n}"
(Get-Content src\fceu.cpp) -replace "if \(movieSubtitles\)","extern int screenMirroring;`r`n if (screenMirroring) {`r`n for (int y = 0; y < 256; y++) {`r`n for (int x = 0; x < 256; x++) {`r`n XBuf[y * 256 + x] = XBackBuf[y * 256 + 255 - x];`r`n }`r`n }`r`n }`r`n if (movieSubtitles)" | Set-Content src\fceu.cpp
(Get-Content src\drivers\win\main.cpp) -replace "SaveConfig\(TempArray\);","extern ButtConfig GamePadConfig[4][12];`r`n extern int screenMirroring;`r`n for (int i = 0; screenMirroring && i < 4; i++)`r`n swap(GamePadConfig[i][6], GamePadConfig[i][7]);`r`n SaveConfig(TempArray);" | Set-Content src\drivers\win\main.cpp
cd vc
msbuild vc14_fceux.sln /p:Configuration=PublicRelease /p:Platform="win32" /t:rebuild
$a = Start-Process -FilePath .\archive.bat -Wait -passthru;$a.ExitCode
Не забывайте нажимать Save.
Вкладка Current build -> New build. Ждёте сборки, если всё успешно, то в Artifacts сможете скачать fceux.zip.
ПримечанияСкрипт повторяет поведение официальной сборки
https://ci.appveyor.com/project/zeromus/fceux, с добавлением патча через замену кода.
По-хорошему следовало настроить автоматическую сборку после коммита, но я не знаю как.
--------
Исправил сохранение переставленных кнопок влево/вправо.