em-dosbox и 50 подарков на новый год
Некоторые вещи с годами становятся только лучше. Например, классические игры, разработанные в эпоху DOS завораживают. Каждая из них — штучный продукт сделанный с большой любовью. К сожалению DOS платформа ушла в прошлое и вместе с ней уходят замечательные продукты. Вернуть их в современный мир — это ли не настоящий подарок? Как? Очень просто! Интересующийся читатель, конечно же, помнит о проекте emscripten, благодаря которому C++ код может быть преобразован в JavaScript для работы в браузере. Именно с его помощью для браузера были адаптированы игры DOOM, Dune 2, TTD, X-COM и множество других. Однако этот путь долог и труден. На один проект может уйти до полугода. А если хочется все и сразу? Есть ли другой путь?
em-dosboxЕсть другой путь — использовать DosBox. Действительно, зачем портировать каждый проект по отдельности, когда можно портировать всю DOS платформу (если быть точным, эмулятор MS-DOS). Эту гениальную идею воплотил Boris Gjenero в проекте em-dosbox. Это порт DosBox в JavaScript выполненный с помощью emscripten.Итак, сейчас я расскажу, как перенести «почти любую» DOS программу в браузер.
Ингредиенты:
Браузер em-dosbox (dosbox.js) Программа корректно работающая в DosBox Во время работы браузер загружает dosbox.js и пакет данных с программой (обычно это бинарный файл с упакованной директорией исходной программы). Скрипт dosbox.js есть ни что иное, как DosBox портированный в JavaScript, выполняясь он эмулирует платформу DOS с запущенной в ней программой.
Компиляция dosbox.js Все просто. Клонируем репозиторий em-dosbox и компилируем с помощью autotools и make git clone git@github.com: dreamlayers/em-dosbox.git cd em-dosbox ./configure make В случае успеха в папке src появится dosbox.html и dosbox.jsПовышение производительности em-dosbox Добавляем к dosbox_LDFLAGS в src/Makefile.am опцию --memory-init-file 0. Эта опция отключает генерацию файла памяти, который используется для ускорения загрузки. В нашем случае этот файл будет размером порядка тридцати мегабайт, что не применимо для браузера. dosbox_LDFLAGS = -s TOTAL_MEMORY=67108864 --pre-js pre.js --memory-init-file 0 В файле src/dosbox.cpp рекомендую выполнить замену emscripten_set_main_loop (em_main_loop, 100, 1); на emscripten_set_main_loop (em_main_loop, 0, 1); Эта правка позволит увеличить производительность на порядок. Но нужно учесть, что целевая программа должна быть достаточно умна и способна выполняться с одинаковой скоростью вне зависимости от производительности компьютера, иначе ваша программа будет работать слишком быстро.Для ускорения работы эмулятора добавьте строки в функцию main в файле src/gui/sdlmain.cpp:
#ifdef EMSCRIPTEN EM_ASM («SDL.defaults.copyOnLock = false; SDL.defaults.discardOnLock = true; SDL.defaults.opaqueFrontBuffer = false;»); #endif Упаковка программы em-dosbox поставляется со скриптом позволяющим упаковать директорию с программой в бинарный файл, который может быть использован совместно с dosbox.js. Например, что бы получить пакетный файл игры Dune 2, достаточно выполнить: #python src/packager.py <имя пакета> <путь до директории> <исполняемый файл> python src/packager.py dune2 ~/dune2 dune2.exe В случае успеха буду созданы файлы dune2.html и dune2.data. HTML файл создается по шаблону dosbox.html (напомню, он лежит в папке src).Изменение настроек dosbox По умолчанию, dosbox будет запущен со стандартной конфигурацией. Что бы её изменить просто создайте в папке с программой файл dosbox.conf. И измените скрипт сборки следующим образом: #86 строка f.write («Module['arguments'] = [ '-conf', './dosbox.conf', './» + EXECUTABLE + »' ];\n\n») Запуск Итак, мы имеем три файла: program.html program.data dosbox.js Разместив их на сервере мы сможем запустить программу в браузере.
Счастливого нового года.50 новогодних подарков.
Список адаптированных игр С помощью em-dosbox были адаптированы для браузера следующие игры: Abuse, Alley Cat, Another World, Arcade Volleyball, Arkanoid, Battle Chess, Budokan: The Martial Spirit, CD-Man, Colorado, Dangerous Dave in the Haunted Mansion, DeathTrack, Digger, Disney’s Duck Tales: The Quest for Gold, Doom, Doom 2, Dune 2, Dyna Blaster, Earthworm Jim 2, Fire & Forget II, Goblins 1–3, Golden Axe, Heretic: Shadow of the Serpent Riders, Incredible Machine, The, IndyCar Racing, Krypton Egg, Lamborghini: American Challenge, Lode Runner, Lost Vikings, The, Metal Mutant, Micro Machines, Mine Bombers, Mortal Kombat, Pac-Man, Prehistorik, Prehistorik 2, Prince of Persia, Scorched Earth: The Mother of All Games, SimCity, Stunts, Supaplex, Test Drive, Tetris, Tower Toppler, Tyrian 2000, Ugh!, WarCraft: Orcs & Humans, Wings of Fury, Winter Supersports 92, Wolfenstein 3D, Xonix.