Uzix 21.06.2010 20:59

Linux GamesЭмуляция древних консолей

Многие из нас в 90-е годы имели приставку типа Денди или Сега. Не открою америку, если скажу, что на любом компьютере старше 486sx можно путем программной эмуляции погамать в любимые игрушки. Сейчас я хочу рассмотреть эту тему подробнее. Итак, что нам нужно (для определенности будем дальше работать с консолью NES (ака Денди), но аналагично и для других приставок):

Эмулятор
Это - наш главный инструмент, как скальпель для хирурга и как vim для программиста :) От выбора эмулятора зависит то, насколько комфортно нам будет играть и будет ли вообще игра доставлять удовольствие. Для Linux выбор эмуляторов не так широк как хотелось бы, но для неискушенного пользователя вполне хватит. Мною был выбран Mednafen в первую очередь за универсальность. Он поддерживает кучу различных консолей начиная от всеми известной Денди и заканчивая экзотическим Watara Supervision. Но к сожалению в этом списке пока нет Сеги и Супер Нинтендо :( (может быть кто желает помочь автору с этими консолями?). Главной недостаток и в то же время главное достоинство этого эмулятора - отсутствие какого-либо графического интерфейса в стандартной поставке. С данным вопросом мы разберемся во второй части статьи, а пока опробуем его. Запускаем из консоли, параметром указываем РОМ с игрой, скачанный предварительно с любого из сотен сайтов по этой тематике.
thumb.png
Первый вопрос, который хочется задать: а что тут с управлением? По системным кнопкам информацию можно получить через F1. Из интересных комбинаций тут у нас alt+s для включения возможностей прокрутки назад (о! как этого нехватало на железной Денди, особенно в Battletoads!) и alt+shift+1 для настройки кнопок первого джойстика Денди. Нас попросят по очереди нажать на клавиатуре или джойстике кнопки, соответствующие кнопкам джойстика Денди. Всего на одну кнопку Денди можно назначить до четырех кнопок джоя/клавиатуры. Я назначил стрелки на крестовину, Z и X на A и B, Space на Select и Enter на Start, также задал и соответствующие кнопки железно джойстика Денди, подключенного через переходник на LPT.
С управлением разобрались, теперь второй вопрос на повестке дня - графика. Действительно, умолчальные настройки выглядят весьма непривлекательно. Чтобы подкорректировать их нам придется залезть в конфигурационный файл ~/.mednafen/mednafen.cfg. Пару слов о формате файла: большинство настроек задается отдельно для каждой консоли в виде "консоль.подсистема.параметр значение". Я рассмотрю настройку для Денди(NES), но для других консолей все аналогично. Нас интересует один блок настроек, далее я его приведу с комментариями?
;Разрешение в полноэкранном режиме - ширина
nes.xres 1280
;Разрешение в полноэкранном режиме - высота
nes.yres 800
;Ширина в оконном режиме = 256*это_число
nes.xscale 2.2
;высота в оконном режиме = 240*это_число (или 224 в зависимости от игры)
nes.yscale 2
;Ширина в полноэкранном режиме = 256*это_число
nes.xscalefs 3.4
;высота в полноэкранном режиме = 240*это_число (или 224 в зависимости от игры)
nes.yscalefs 3
;Использовать т.н. scanlines - число - это их процент на экране. Эмулирует вид как на старых телевизорах. вобщем легче посмотреть чем объяснить.
nes.scanlines 8
;Растягивать на весь экран в полноэкранном режиме - тогда параметры nes.xscalefs и nes.yscalefs не используются. ИМХО - на ЖК мониторах лучше смотрится нерастянутое изображение.
nes.stretch 0
;Биллинейная интерполяция - сильно замыливает изображение, рекомендуется только если программные фильтры процессор не вытягивает а scanlines не нравятся
nes.videoip 0
;Программные фильтры. Тут на вкус и цвет. В ассортименте none, scale2x, hq2x, nn2x, nny2x. вместо 2х можно 3х и 4х - тогда изображение будет контрастнее на больших разрешениях и загрузка процессора больше.
nes.special scale2x
;Фильтр OpenGL, чтобы работало нужно параметр "video sdl" заменить на "video gl". варианты: ipxnoty, ipynotx, ipsharper, ipxnotysharper, ipynotxsharper, scale2x (3x/4х/6х/8х)
nes.pixshader none
Все, можно было бы играть, но через консоль запускать неудобно. Нужен комфорт :) И в этом нам поможет...

Каталог
Я бы выделил две категории эмуляторщиков - первые долго бродят по различным онлайн каталогам игр, затем скачивают и запускают понравившуюся игру. С этим все понятно - кликнул на игре, запустился эмулятор и играй. Вторые же как правило скачивают полный набор Good* (реже No-Intro) с целью получить все и сразу. Вот тут здорово помогут каталогизаторы. В свое время я использовал QuickPlay - всем он хорош, но только для Windows. Отсутствие каталога в любимой ОС здорово усложнило задачу - нужно было зайти в папку с архивами, найти нужный, найти файл в нем и наконец запустить игру. Но вскоре чудом (учитывая неразрекламированность проекта) был найден Gelide.
thumb.png
На офсайте можно скачать готовые пакеты под Debian, хотя не так давно мне приходилось компилировать вручную.
Итак, главное его умение - показывать список игр, разделенный по консолям (есть и другие фильтры). Как дополнительные плюшки - он может показывать некоторую полезную информацию о ROM'е и фотки картриджа. Последних у меня не оказалось, поэтому все кроме списка игр, консолей эмуляторов было благополучно убрано. Дальше нам надо добавить наш GoodNES (предварительно найденный и скачанный на просторах сети) в каталог. Тут есть несколько вариантов - в контекстном меню пункта "Nintendo NES" выбираем "Edit" и в открывшемся окне поле "Roms Directory" задаем путь до нашего распакованного ГудНЕСа. Другой вариант - распаковываем прямо в ~/.gelide/Nintendo Nes/roms/. Но так как у меня была необходимость играть и в других ОС, то я выбрал вариант символических ссылок (замечу, что это удобно еще и при перемещении нашей коллекции в другое место - достаточно обновить симлинки и не надо беспокоиться о настройках Gelide).
Итак, GoodNES распакован, теперь нужно в контекстном меню нашей приставки выбрать пункт "Refresh" и вауля - в основной части окна появились наши заветные игры. Однако тут нас ждет большой облом - Mednafen не понимает архивы! Тут можно опустить руки, бросить все и пойти старым путем - запускать игры через файловый менеджер. Но нас-то такими мелочами не остановишь :) По-быстрому был написан скрипт-оболочка для наших эмуляторов:
(Маленькое отступление: в архивах GoodNES с игрой кладется куча разных версий РОМа в т.ч. графических хаков, овердампов , бэддампов и т.д. Естественно, брать первый попавшийся не получится т.к. вполне можем запустить нерабочий РОМ о чем узнаем при зависании где нибудь на последнем уровне :) )
1
2
3
4
5
6
7
8
9
#!/bin/sh

# Name: emu-arc
# Author: Uzix (uzix@jabber.org)
# Description: Script for run ROM's from GoodMerged-archives

sel_rom () {
IFS="" ARC_ALLFILES=`7z l -slt "$ARC_PATH" | grep 'Path = ' | gawk -F ' = ' '{print $2}'`
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<t><!' | grep '(U' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<T' | grep '\<!' | grep '(J' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<T' | grep '\<!' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | grep -v '\<o' | grep '(U' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | grep -v '\<o' | grep '(J' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | grep -v '\<o' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | grep '(U' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | grep '(J' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\<b' | grep -v '\<T' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\<b' | grep '(U' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\<b' | grep '(J' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\<b' | head -n1`<br />test -z "$ARC_FILE" &&\<br /> ARC_FILE=`echo $ARC_ALLFILES | head -n1`<br />test -z "$ARC_FILE" &&\<br /> echo E: Could not find any file in archive. &&\<br /> exit 4<br />}<br /><br />ARC_PATH=$1<br />ARC_EMU=$2<br />ARC_NAME=`echo "${ARC_PATH}" | gawk -F'/' '{print $NF}'`<br />ARC_TYPE=`echo "${ARC_NAME}" | gawk -F'.' '{print $NF}'`<br />ARC_FILE='/dev/null'<br />echo I: Archive patch: ${ARC_PATH}<br />echo I: Archive name: ${ARC_NAME}<br />echo I: Archive type: ${ARC_TYPE}<br /><br />if < ! -r "${ARC_PATH}" >; then<br /> echo E: Archive not readable<br /> exit 1<br />fi<br /><br />case "${ARC_TYPE}" in<br /> 7z|zip|rar)<br /> if < ! -x "`which 7z`" >; then<br /> echo E: 7z archiver not found. Please, install it.<br /> exit 2<br /> fi<br /> sel_rom<br /> 7z e -y -o"${HOME}" "${ARC_PATH}" "${ARC_FILE}"<br /> ;;<br /> *)<br /> echo E: Unrecognized archive type<br /> ARC_FILE="${ARC_NAME}"<br /> ln -fs "`pwd`/${ARC_PATH}" "${HOME}/${ARC_FILE}"<br /> ;;<br />esac<br /><br />ARC_FTYPE=`echo "${ARC_FILE}" | gawk -F'.' '{print $NF}'`<br />echo I: Selected file: ${ARC_FILE}<br />echo I: Selected file type: ${ARC_FTYPE}<br />if < ! -x "`which "${ARC_EMU}"`" >; then<br /> case "${ARC_FTYPE}" in<br /> nes|fds|sms|gg|gb|gbc|gba|ws|wsc|pce|ngp|ngc)<br /> for i in mednafen; do<br /> test -x "`which $i`" && ARC_EMU="$i"<br /> done<br /> ;;<br /> bin|smd)<br /> for i in dgen gens; do<br /> test -x "`which $i`" && ARC_EMU="$i"<br /> done<br /> ;;<br /> smc)<br /> for i in bsnes snes9x zsnes; do<br /> test -x "`which $i`" && ARC_EMU="$i"<br /> done<br /> ;;<br /> esac<br />fi<br />if < -z "${ARC_EMU}" >; then<br /> echo E: Could not find suitable emulator<br /> exit 3<br />fi<br />echo I: Selected emulator: ${ARC_EMU}<br />xdg-screensaver suspend `xwininfo -root |grep id\: | awk '{print $4}'`<br />"${ARC_EMU}" "${HOME}/${ARC_FILE}"<br />xdg-screensaver resume `xwininfo -root |grep id\: | awk '{print $4}'`<br />rm "${HOME}/${ARC_FILE}"<br />exit 0<br /></code><br />Что он делает? Он смотрит содержимое архива с помощью 7z, выбирает наилучший РОМ (функция sel_rom), распаковывает его, ищет подходящий эмулятор и запускает все это. Помещаем скрипт в /usr/local/bin/ и даем ему +x. Теперь нужно добавить скрипт в Gelide в качестве эмулятора. Для этого вызываем контекстное меню во фрейме с эмуляторами и жмем "Add". Заполняем примерно так:<br /><a href="http://rghost.ru/1949088.view"><img src="http://rghost.ru/1949088/thumb.png" alt="thumb.png" /></a><br />Готово! Теперь можно и поиграть! выбираем любимую игру, выбираем скрипт emu-arc и... В БОЙ! :-)<br /><br />P.S. Не злоупотребляйте сохранениями :)<br />P.P.S. Если будет необходимость, добавлю описание настройки dgen (эмулятор сеги) и zsnes (супер нинтендо)<br />P.P.P.S. Первый пост.</t>



Тэги: games игры эмуляция
+ 16 -
Похожие Поделиться

Zereal 21.06.2010 21:11 #
Написано здорово, но Вас не затруднит воспользоваться тегом /cut? :))
Uzix 21.06.2010 21:12 #
Извиняюсь, исправил.
Zereal 21.06.2010 21:13 #
спасибо :)
K900 21.06.2010 21:28 #
Ну не знаю, насколько это Ъ, но все это легко делается через GUI. Кстати, все Good-утилиты в имя лучшего рома вставляют ""
Uzix 21.06.2010 21:35 #
Вставляют, но не для всякой игры есть . Или наоборот - их может быть несколько.
K900 21.06.2010 21:29 #
Честно, это все легко делается через GUI. Но если уж на то пошло, то "ложим скрипт" попрошу исправить
vyazovoi 22.06.2010 09:46 #
Тысяча чертей! Отличный каталог, спасибо!
inst 22.06.2010 11:33 #
Автор, спасибо за статью.

Я где-то в интернете читал о том, что играть в SEGA можно по сети. Если не ошибаюсь, речь шла об эмуляторе Gens, причём скорее всего о версии под офтопик, ибо у себя в Ubuntu я не вижу никаких настроек связанных с сетью.

Скажите, вам что-нибудь известно по поводу игры по сети?
K900 22.06.2010 12:45 #
Гуглить в стороны Kaillera, сам никогда не пробовал
Uzix 22.06.2010 15:09 #
К сожалению Linux-версия Gens не поддерживает игру по сети т.к. в Gens она реализована через Kaillera, который для Linux недоступен. А вот в Mednafen вполне можно поиграть по сети, нужно только установить сервер.
mutantcornholio 22.06.2010 21:39 #
mednafen поддерживает игру по сети. Автор, случайно, это не ковырял?
Uzix 23.06.2010 14:57 #
Случайно ковырял. качаем Mednafen Server отсюда, распаковываем, собираем, запускаем. В mednafen нажимаем T, вводим /server 127.0.0.1. Второй игрок вводит айпишник сервера. Вроде все. РОМы должны быть одинаковыми.
devl547 23.06.2010 13:39 #
OMG! Обоина из Win9x
sandros10 06.09.2010 10:49 #
Непонятно как менять клавиши, в какой последовательности они меняются и почему 24 варианта, где прыжок?