29 марта 2009 г.

cPRG: Равные возможности низким и высоким уровням

На самом деле неочень равные, но думается что в предложенном варианте 2 новичка смогут убить многих "папок", если те будут по одиночке и среагируют неверно.

В данной системе предполагается 3-4 класса способностей. Когда на цели используется один класс способностей, цель становится более уязвима к другому классу способностей. Если переключатся с использования способностей одного класса, на способности другого класса, пользователь становится очень слабым. Поэтому два игрока использующие способности 2х разных классов сильнее одного.

Дополнительно все способности делятся на 2-3 степени мощности, например Regular, Superior, Uber. Superior и Uber можно использовать редко и очень редко, но их использование не ослабляет пользователя(как бы просто не учитывается) если до/после них используются способности других классов.

Например для фэнтезийной реализации. Огонь, вода, воздух, земля. Огонь повышает чувствительность к воде, вода к огню; воздух к земле, земля к воздуху. Дополнительно они делятся на деструктивные и созидательные. Созидательные повышают чувствительность сильнее деструктивных. Некоторые комбинации элементов дают дополнительные эффекты: огонь помогающий земле(заклинания быстрее и наносят больше урона), земля помогающая воде(замедляет цель и больше урона), вода -- воздуху("холод", т.е. замедляет и...), воздух -- огню(больше площади и больше урона).

Мощности способностей с уровнем не усиливаются. Новые способности конечно появляются, но лишь потому, что изначальна всех выбрать было нельзя. С уровнем уменьшается "штраф" при использовании способностей разного класса.

Т.е. изначально игрок выбирает по 3 Regular способности из 2х эллементов элемента, и по одной из 2х других элементов. Также получает 2 Superior способности из любых элементов.

Так же можно добавить вездесущие 2 "элемента": смерть и жизнь. Но сделать их трудно доступными, требующими больших затрат и накладывающими на игрока какие-то неприятные ограничения.

В результате получаем игру где 2 не прокачанных персонажа имеют большие шансы убить прокачанного.

18 марта 2009 г.

Контроллеры, идеи и т.п.

Давайте придумывать дурацкие "манипуляторы"/контроллеры и что угодно, что пока не запатентовали, вдруг этот список когда-то кому-то поможет;)

Управление пульсом. Просто одевается датчик или на палец, или на запястье, и что-то им управляется, например сложность игры/скорость тренажера, что угодно

Управление в "поле" лазеров. Просто стоит много лазеров излучающих, желательно, в невидимом диапазоне, и датчиков лазеров. Мы в этом "поле" вожим, руками, чем угодно, и соотв. обрабатываем данные датчиков => получаем данные о движениях в поле => управляем чем-то на компе

несколько ЭМ излучателей, несколько приемников, проводящая перчатачка с резонатором, и сложная задача решения всего этого(можно в изолированной камере, можно сделать перчатку с 4+ приёмниками и триангулировать)

2-3 камеры и аццкие расчеты, после чего управляйте чем угодно.

"Сисечка". Наполненный жидкостью, но крепкий шарик(пол-шарика). Внутри 6+ датчиков давления. Определяем куда надавил пользователь и управляем чем-то

"Пальчики" Просто две "палочки" соединенные суставом с датчиком. Одеваются на пальцы, сгибание и разгибание - ивенты этого "манипулятора.

Планшет на основе резонансных фотоэлементах и лазерной указки. Берём кучу фотоэлементов реагирующих на определенный спектр произвольной ширины(что значительно дешевле фотоэлементов для камер), желательно из невидимого диапазона, на всякий случай покрываем свето-фильтром. Берем лазерную указку с излучением в соотв. диапазоне, с как-можно более тонким лучем, и желательно как-можно менее мощной, что бы светила только в миллиметре от себя. Получаем планшет чувствительный к силе нажатия и частично наклону пера. Разрешений можно добиться бешеных, только перу батарейки нужны=(

Управление мыслями, Управление специальным чипом иплантированным в мозг/руку/другую часть тела/взглядомjv

Все до безумия просто, кое-что даже забавно, но ведь могут и такое запатентовать, а то и уже запатентовали!

Ваши предложения?

14 марта 2009 г.

Мото-РПГ(или мото-десматч?) игроидея

Общая идея

Игроки ездят та тяжелых «мотоциклах» с большими скоростями. Колёса широкие, да и сам мото-танк тоже достаточно широк и устойчив, поэтому мотоциклом назвать его можно с натяжкой. На мотоциклах есть несколько пушек(3 слота) с помощью которых они пытаются разнести в клочья своих соперников. Также у мотоциклистов есть симбионты, благодаря которым у них появляются некие сверх-способности, в основном завязанные на манипулировании временем. Частота использования сверх-способностей будет напрямую зависеть от экстремальности езды. также будет возможность объединятся с напарником в одну боевую машину(один при этом является водителем, второй стрелком; водитель может стрелять одной пушечкой; некоторые пушки в таком режиме имеют полное поле обстрела, ими управляет стрелок)

Управление мотоциклом

Самое обыкновенное — 4 кнопки плюс блокировка колёс, плюс стрельба
Стрельба из пушек управляется с мышки: стрелять левой пушкой — ЛКМ, правой — ПКМ, носовой — ЦКМ, Всеми — зажать все кнопки(ну ли как в MechWarrior можно навешивать на каждую кнопку свой набор орудий, например на ЛКМ центральные и левые, на ПКМ — по аналогии). Прицел управляется мышкой, поворачивается относительно движения мотоцикла; два варианта управления прицелом: когда прицел всегда в центре, и когда поворот прицела на один угол поворачивает камеру на в 2 раза меньший угол (думаю пушки не будут поворачиваться на угол больший 45˚)

Управление способностями

Есть 2 вида способностей: свои и симбионта.
Свои — не очень сильные, но используются часто. Т. е. «уровень» персонажа определяет насколько его способности сильны, а использовать их можно бесконечно, раз в 10 сек.
Симбионта — значительно сильнее, но использовать можно редко. «Уровень» персонажа определяет количество «энергии»(маны) симбионта, а использовать их можно пока есть эта энергия, но обычно её хватает на 1-2 способности. Восстанавливается энергия «адреналином», т. е. от больших скоростей, ухода от столкновений, боевого ража, падений/полётов, повреждения противника, уничтожения противника. Кроме этого, большинство этих способностей требует для применения, что бы ваша текущая скорость была не ниже определённого значения
Всего в бою можно использовать 4 способности: 2 свои и 2 симбионта. Вообще на выбор доступно больше. Возможно стоит дать возможность менять 2 способности(одну свою и одну симбионта) прямо во время "гонки".
Если и менять, то лишь когда игрок не получает энергию от «адреналина». Выбираются прокруткой списка из, максимум, 3х способностей.
Итого 4 кнопки на способности(6 если с прокруткой), 5 кнопок для езды, и вся мышка для стрельбы.

11 марта 2009 г.

Xmonad KDE tray icons

При использовании Trayer, есть в Xmonad такая неприятная вещь, как непонимание некоторых "докнутых" KDE приложений. например Amarok1.4, kkbswitch, kvpnc, kxneur. Это проблема решается, но прийдется использовать stalonetray, а настраивать его чуточку дольше чем trayer. А именно: надо самостоятельно задать его геометрию.

~/.stalonetrayrc:
geometry 168x24+1512-1026 no_shrink true background black

У меня он в правом верхнем углу. Координаты и размеры нашел с помощью скриншота и Gimp, "-1023" это высоты экрана минус высота треера. Ну и еще я запретил ему рости, ибо слева от него я держу xmobar

Так же в конфиге xmonad.hs я его игнорирую и копирую на все раб. пространства:
toAll = ["stalonetray"] myIgnores = ["stalonetray"] mymyManageHook = composeAll . concat $ [ [ className =? c --> doF (W.shift "1") | c <- first] , [ className =? c --> doF (W.shift "2") | c <- second] , [ className =? c --> doF (W.shift "3") | c <- third] , [ className =? c --> doF (W.shift "4") | c <- fourth] , [ className =? c --> doF (W.shift "9") | c <- ninth] , [ className =? c --> doF (copyToAll) | c <- toAll] , [ className =? c --> doFloat | c <- myFloats] , [ wmrole =? r --> doFloat | r <- myFloats] , [ className =? c --> doCenterFloat | c <- myCntrFloats] , [ className =? c --> doIgnore | c <- myIgnores] , [ composeOne [ isFullscreen -?> doFullFloat, transience]] ] myManageHook = mymyManageHook <+> manageMenus <+> manageDialogs main = do xmproc <- spawnPipe "/usr/bin/xmobar ~/.xmonad/xmobar.conf" xmonad $ defaultConfig { modMask = mod4Mask -- hooks, layouts , layoutHook = myLayouts , manageHook = myManageHook , startupHook = setWMName "LG3D" , logHook = dynamicLogWithPP $ xmobarPP { ppOutput = hPutStrLn xmproc , ppTitle = xmobarColor "green" "" . shorten 80 } }
Запускаю его в xinitrc

2 марта 2009 г.

Обработка фотографий текста

Здесь я предложу несколько вариантов решения этой задачи. Основная проблема фотографий это неравномерность освещенности страницы, когда в центре яркость больше, а по краям меньше, или что-либо подобное. Так же часто необходимо повысить контрастность текста по сравнению со страницей
При обычной коррекции Уровней некоторые части изображения получаются засвечены, а некоторые наоборот слишком тёмные
Все методы более или менее решают эту проблему. В качестве материала для обработки я взял эту страничку(Предварительно обрезав всё лишнее):

В скобках приведены английские названия инструментов, а также использованные в данном случае настройки

Метод с делением слоёв

  1. Создать новый слой с копией изображения
  2. Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна
    (Filters -> Blur -> Gaussian blur: Blur radius - 100)
  3. Назначить режим этого слоя в деление(Layers window: Mode - Divide)
  4. Свести слои (Layers -> merge)

Метод с детектированием краёв

  1. Размыть фон по гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters - > Blur -> Selective Gaussian blur: Delta - 19; Radius - 15)
  2. Выделите края настраиваемым методом Лапласа (Filters -> Edge-detect -> Edge...: Algorithm: Laplace; Amount: 2)
  3. Если хотите, инвертируйте цвет картинки


Долгий метод с отдельной коррекцией яркости

  1. Размыть фон по Гауссу. Подобрать дельту так что бы текст не размывался, Радиус размытия думаю больше 10 ставить не стоит.(Filters - > Blur -> Selective Gaussian blur: Delta - 19; Radius - 15)
  2. Создать новый слой с копией изображения
  3. Размыть новый слой по Гауссу до относительной равномерности, когда текст уже почти не оставляет следов, но разница яркости в углах и центре заметна (Filters -> Blur -> Gaussian blur: Blur radius - 100) (Filters -> Blur -> Gaussian blur: Blur radius - 100)
  4. Назначить режим этого слоя в Яркость и поставить плотность 50% (Layers window: Mode - Value; Opacity: 50)
  5. Свести слои (Layers -> merge)
  6. Обработайте картинку: Color -> Auto -> Stretch HSV

Относительной читабельности можно добиться и с помощью пакета ImageMagic

convert ./1_original.jpg -colorspace gray \( +clone -blur 10x65535 \) -compose subtract -composite -threshold 50% ./im4.jpg


Автоматизация

Murkt разобрался в Python-Fu и написал скрипт которым можно это всё автоматизировать. Пишем в консоль(Filters -> Python-Fu -> Console) следующее:

from gimpfu import * def textify_divide(img): ly2 = img.active_layer.copy() img.add_layer(ly2) pdb.plug_in_gauss_rle(img, ly2, 100, 1, 1) ly2.mode = DIVIDE_MODE img.flatten() def textify_edges(img, radius=10, max_delta=25, amount=2): ly = pdb.gimp_image_get_active_layer(img) pdb.plug_in_sel_gauss(img, ly, radius, max_delta) pdb.plug_in_edge(img, ly, amount, 1, 5) pdb.gimp_invert(ly)

Теперь можно из этой же консоли обработать все открытые изображения с помощью команды:

[textify_edges(x) for x in gimp.image_list()]
Еще можно попытаться использовать прочие возможности Python-Fu, как открытие файлов и т.п.:

image = pdb.file_jpeg_load(filename, raw_filename) image = pdb.file_png_load(filename, raw_filename)