![image](http://runserver.net/temp/solitaire/game.png)
Эта история началась чуть более года назад с появлением у моей супруги современного смартфона. Она попросила найти пасьянс «Косынку», такой же как был когда-то на настольной Windows. Просмотрев десяток программ, я был неприятно удивлен — почти везде было неудобное управление, спорные картинки карт, море дополнительных наворотов вроде 250 пасьянсов в одном, установки фотографии на рубашку и блекджека с блудницами. В результате, выбрали один из более-менее годных вариантов и на какое-то время об этом забыли.
Пролетел год и я начал писать программы для мобильных. При этом ребром стал вопрос кросс-платформенности, отладки in-app покупок, подготовки контента под разные платформы. Была мысль сделать для пробы пера «Тетрис» или очередной калькулятор, но все же в качестве «велосипеда» я выбрал «Косынку». Идейным стрежнем проекта стало максимально точное повторение старого, доброго пасьянса из набора игр Windows.
Контент
![image](http://runserver.net/temp/solitaire/jump.png)
Для рубашки была выбрана самая приятная (на мой взгляд) картинка с пляжем и пальмой с ручной прорисовкой. Получилось очень узнаваемо — взгляд на картинке не задерживается, хотя если всмотреться, то разница очевидна.
![image](http://runserver.net/temp/solitaire/deck.jpg)
Геймплей
![image](http://runserver.net/temp/solitaire/wine.png)
Код
Бизнес логику программы я написал на чистой Java 1.6, без использования сторонних библиотек, Android, Swing и пр. Для Android эта часть собирается в виде отдельной библиотеки и подключается к GUI проекту без особых проблем, а вот для других ОС я решил идти нестандартным путем и не заниматься портированием «в лоб» на другие языки. После некоторой обработки напильником проект Sharpen смог преобразовать этот код в чистый C#, что открыло путь к реализации под iOS c помощью MonoTouch, а в будующем и для Windows Phone 7/8. Простейшие юнит-тесты показали, что логика работы не изменилась, трансляция прошла успешно. В среде MonoTouch я без особых нюансов реализовал отображение GUI, отладил игру на эмуляторе и iPod Touch и отправил на одобрение в iTunes Store. Настройки программы я реализовал с помощью внешнего биндинга к KGN.InAppSettings, споткнувшись о некоторые мелочи вроде отсутствия поддержки thumb для внешних библиотек.
Проблемы
![image](http://runserver.net/temp/solitaire/logo.png)
High-definition
![image](http://runserver.net/temp/solitaire/ld-hd.png)
На эту работу было потрачено немало усилий, потому было логично выпустить отдельно HD версию, а заодно добавить внутреигровую покупку в обычную версию. С реализацией In-App Purchases под MonoTouch оказалось не все просто, а чтобы смотрелось это органично, я решил избавиться от KGN.InAppSettings и сделать единый интерфейс для настроек и покупок. Технические детали я тут описывать не буду, но набралось их немало, включая мартышкин труд по созданию собственных Settings, идентичных системным, борьба с отсутствием документации к StoreKit для Mono, разные баги с отладкой покупок и пр.
Профит
Игра не стала шедевром, не попала в топы, да и наврядли окупит стоимость разработки и работу дизайнера, но все же теперь у меня на всех устройствах (включая и смартфон, с которого все началось) есть «Косынка», максимально похожая на оригинал, ставший родным еще со времен Windows 3.1. Опыт написания портируемого кода на Java и переноса его на C# оказался просто бесценным — подобным методом моей командой портировано уже несколько крупных Android проектов на iOS, а за счет отладки на небольшой игре получилось неплохо изучить подводные грабли MonoTouch и вообще разработки под iOS, а заодно написать некое количество полезных библиотек. Может кто-то и посмеется над этой историей, но как по мне, «велосипед» вышел весьма годным, а время было потрачено совсем не зря.
Post Scriptum
Я специально избегал углубления в подробности портирования и работы с MonoTouch, потому что каждая из них достойна отдельного топика. Рано или поздно соберусь с силами и выложу на суд общественности свой класс для In-Game Settings, менеджер покупок и пр.
Ссылки на проект я не выкладываю, чтобы не посчитали рекламой.
Если кому нужен обновленный скрипт генерации карт, пишите на scanwords@runserver.net, он является derivative work от GPL проекта, потому выложу без проблем.