Игры на Familiar 0.8.2 c окружение Opie 1.2.0

автор: Урманов Марат




Начну с того, что в Familiar на H5550 сущ. проблема с драйвером jotpad’а которая решается только частично. Проблема заключается в следующем. H5550 имеет четыре сенсора NW, NE, SE, SW и пятый по середине. С центральным нет никаких проблем. Нажатия же N, E, S, W эмулируется соседними сенсорами. Т.е если нажимается N, то оба сенсора NW и NE должны показывать нажатие и генерировать одно прерывание (по которому определяется что нажата N).

Физически расположены так:

button button
button
button button

Драйвер пытается эмулировать так:
up
left action right
down

Но часто (в результате неправильной эмуляции драйвером ядра) также генерируется еще два прерывания одно показывает что нажато NW, а другое что нажата NE. В первом ошибочном случае получится что мы нажали UP и LEFT, а во втором, что UP и LEFT а потом UP и RIGHT (или UP, LEFT и RIGHT). Сущ. патч ядра который частично решает эту проблему, но не полность (см. Компиляция ядра iPAQ H5550). Если пересобирать ядро не хочется то можете заменить модуль h5400_asic.o из каталога /lib/modules/2.4.19-rmk6-pxa1-hh37/kernel/arch/arm/mach-pxa на скомпилированный мной модуль h5400_asic.o в котором эта проблема решена. Не забудьте после замены модуля выполнить dempod.24 и перезагрузиться. Резюмирую сказанное отмечу, что играть в игры (до решения проблемы окончательно) которые требуют абсолютно точного позиционирования не получиться. В пример поставлю известную игру “Snake” - играть точно не сможете. Но в играх где допустимо иногда неправильно нажатая кнопка играть можно. Например, я играю в известную игру “Aladdin” c платформы Super Nintendo и играется я вам скажу очень комфортно. Вообщем ставим пропатченное ядро и вперед, не тратя время. Теперь я раскажу о том как установить эмулятор Super Nintendo и запустить игру на примере все той же игры “Aladdin”. Ставим как обычно эмулятор snes9x из Familiar feed, и в инете стягиваем образ игры “Aladdin”. Пытаемся запустить:

root@h5550:~# snex9x –nosound aladdin.smc

но у нас ничего не получается, экран мельтешит, рябит и ничего не показывает. На самом деле это решается просто. Создаем скриптик aladdin.sh следующего содержания:

#!/bin/sh
export QWS_DISPLAY=Transformed:Rot270:0
snes9x -nosound /path/to/image/ALADDIN.SMC &

root@h5550:~# chmod a+x aladdin.sh

и запускаем. Уже лучше, не правда ли? Теперь возникла проблема входа в игру, так как непонятно где кнопка Action. И вот здесь нам надо сделать remapping кнопок. Начнем с теории. При нажатии какой-либо кнопки мы проходим по следующему пути:

1. Keypress and kernel -> 2. opie core libs -> 3. SDL library -> snes emulator -> Game

В библиотеке SDL remapping кнопок iPAQ следующий:

* Record button = Shift
* Card = Alt
* Calendar = "y"
* Home (task???) = Enter
* Mail = ESC

Т.е когда мы нажимаем кнопку Mail библиотека SDL передает в эмулятор кейкод ESC. Вот здесь и начинается самое интересное. Будем делать rempaping в эмуляторе. Для этого в нем предусмотрена переменная S9XKEYS которая маппит указанные в ней кейкоды SDL на эмуляцию джойстика: Quit,A,B,X,Y,L,R,START,SELECT,LEFT,RIGHT,UP,DOWN,L+U,L+D,R+U,R+D


А теперь переходим к практике:
мы нажимаем кнопку Mail, в библиотеке SDL ей присваивается значение ESC, смотрим кейкоды SDL (приложение 1) и находим, что кейкод для ESC = 27. Далее в переменную S9XKEYS записываем код 27:

S9XKEYS=27

Это будет означать что мы при нажатии Mail сэмулировали кнопку джойстика Quit. Идем дальше. Нажимаем кнопку Calendar, в библиотеке SDL ей присваивается значение "y" , в переменной S9XKEYS маппим ее на кнопку виртуального джойстика A:

S9XKEYS=27, 121

Думаю идея понятна. Для запуска игры “Aladdin” добавляем remapping в ранее созданный скрипт aladdin.sh:

#!/bin/sh
export QWS_DISPLAY=Transformed:Rot270:0
export S9XKEYS=27,121,308
snes9x -nosound /media/ram/games/snes9x/ALADDIN.SMC &

Запускаем и наслаждаемся игрой. Да кстати не забудьте перед запуском сделать rotate экрана, а то для того чтобы пойти влево нужно будет нажимать joypad вверх))) По поводу сохранения - после того как пройдете три уровня узнаете пароль на следующий, четвертый, и сможете сразу переходить на него в начале игры вводя пароль в меню, ну или поищите пароли в инете. Нужно еще сказать что если запущен эмулятор snes9x и наладонник входит в режим засыпания, то он оттуда потом не выйдет, поможет только reset (как исправить пока не знаю)
Сущ. также эмулятор scummvm который тоже работает. Делаем типа того:

#!/bin/sh
export QWS_DISPLAY=Transformed:Rot270:0
scummvm -g normal --aspect-ratio monkey2

Игра запускается, но я не играл поэтому ничего больше сказать не могу. Пробуйте.

Приложение 1. Кейкоды для SDL

SDLK_BACKSPACE = 8,
SDLK_TAB = 9,
SDLK_CLEAR = 12,
SDLK_RETURN = 13,
SDLK_PAUSE = 19,
SDLK_ESCAPE = 27,
SDLK_SPACE = 32,
SDLK_EXCLAIM = 33,
SDLK_QUOTEDBL = 34,
SDLK_HASH = 35,
SDLK_DOLLAR = 36,
SDLK_AMPERSAND = 38,
SDLK_QUOTE = 39,
SDLK_LEFTPAREN = 40,
SDLK_RIGHTPAREN = 41,
SDLK_ASTERISK = 42,
SDLK_PLUS = 43,
SDLK_COMMA = 44,
SDLK_MINUS = 45,
SDLK_PERIOD = 46,
SDLK_SLASH = 47,
SDLK_0 = 48,
SDLK_1 = 49,
SDLK_2 = 50,
SDLK_3 = 51,
SDLK_4 = 52,
SDLK_5 = 53,
SDLK_6 = 54,
SDLK_7 = 55,
SDLK_8 = 56,
SDLK_9 = 57,
SDLK_COLON = 58,
SDLK_SEMICOLON = 59,
SDLK_LESS = 60,
SDLK_EQUALS = 61,
SDLK_GREATER = 62,
SDLK_QUESTION = 63,
SDLK_AT = 64,
/*
Skip uppercase letters
*/
SDLK_LEFTBRACKET = 91,
SDLK_BACKSLASH = 92,
SDLK_RIGHTBRACKET = 93,
SDLK_CARET = 94,
SDLK_UNDERSCORE = 95,
SDLK_BACKQUOTE = 96,
SDLK_a = 97,
SDLK_b = 98,
SDLK_c = 99,
SDLK_d = 100,
SDLK_e = 101,
SDLK_f = 102,
SDLK_g = 103,
SDLK_h = 104,
SDLK_i = 105,
SDLK_j = 106,
SDLK_k = 107,
SDLK_l = 108,
SDLK_m = 109,
SDLK_n = 110,
SDLK_o = 111,
SDLK_p = 112,
SDLK_q = 113,
SDLK_r = 114,
SDLK_s = 115,
SDLK_t = 116,
SDLK_u = 117,
SDLK_v = 118,
SDLK_w = 119,
SDLK_x = 120,
SDLK_y = 121,
SDLK_z = 122,
SDLK_DELETE = 127,
/* Arrows + Home/End pad */
SDLK_UP = 273,
SDLK_DOWN = 274,
SDLK_RIGHT = 275,
SDLK_LEFT = 276,
SDLK_INSERT = 277,
SDLK_HOME = 278,
SDLK_END = 279,
SDLK_PAGEUP = 280,
SDLK_PAGEDOWN = 281,

/* Function keys */
SDLK_F1 = 282,
SDLK_F2 = 283,
SDLK_F3 = 284,
SDLK_F4 = 285,
SDLK_F5 = 286,
SDLK_F6 = 287,
SDLK_F7 = 288,
SDLK_F8 = 289,
SDLK_F9 = 290,
SDLK_F10 = 291,
SDLK_F11 = 292,
SDLK_F12 = 293,
SDLK_F13 = 294,
SDLK_F14 = 295,
SDLK_F15 = 296,

/* Key state modifier keys */
SDLK_NUMLOCK = 300,
SDLK_CAPSLOCK = 301,
SDLK_SCROLLOCK = 302,
SDLK_RSHIFT = 303,
SDLK_LSHIFT = 304,
SDLK_RCTRL = 305,
SDLK_LCTRL = 306,
SDLK_RALT = 307,
SDLK_LALT = 308,
SDLK_RMETA = 309,
SDLK_LMETA = 310,
SDLK_LSUPER = 311, /* Left "Windows" key */
SDLK_RSUPER = 312, /* Right "Windows" key */
SDLK_MODE = 313, /* "Alt Gr" key */
SDLK_COMPOSE = 314, /* Multi-key compose key */

/* Miscellaneous function keys */
SDLK_HELP = 315,
SDLK_PRINT = 316,
SDLK_SYSREQ = 317,
SDLK_BREAK = 318,
SDLK_MENU = 319,
SDLK_POWER = 320, /* Power Macintosh power key */
SDLK_EURO = 321, /* Some european keyboards */
SDLK_UNDO = 322, /* Atari keyboard has Undo */

Copyright (C) 2003-2005 Marat Urmanov <my-ipaq@narod.ru>