Пост очень длинный (по меркам Пикабу), отчасти связан с воспоминаниями детства, отчасти связан с программированием, ну и вообще каша кашная, так что в связи с тем, что основная моя часть подписчиков из «Строительство и ремонта», прошу обратить внимание, что про строительство тут ни слова, ну и собственно забить на чтение по желанию.
Итак, шли далекие девяностые годы, тогда я жил на краю земли, в славном городе воинской славы Владивостоке… на берегу Японского моря, с жудчайшим климатом и своими особенностями бытия. Тогда мне было чуть больше 11 лет, я был еще совсем маленький, но уже смышленый паренек. Родители были в разводе, доходы населения были на дне, а страна в упадке, тем более, что до другого конца планеты никому не было дела. Так и жили, каждый развлекал себя как мог. Эпоха дэнди и сеги подошла к концу, играть в песочнице уже было скучно… основной радостью и счастьем было дождаться выходных. Кто из тех краев, наверное, помнит такое великолепное место, как ДКЖД (дворец культуры железнодорожников). Тогда, в эпоху безнаказанности пиратства, это было единственное место, где утром в выходные продавались компакт диски. Там всегда можно было найти самую свеженькую игру или последнюю версию Windows. Продавцы стояли прямо на улице, особые VIP располагались внутри, там продавалось все… Именно здесь я покупал свои первые книги по программированию, книги про 3D MAX и весь софт, у каждого был «свой» продавец, тогда любой знал заветные слова «Седьмой волк» и «Фаргус», это было прекрасное время… К сожалению, не нашел фото тех времен, но судя по интернету за эти годы в архитектуре ничего не изменилось…
Фото из интернета - вот эта лестница, все проходы и вся улица радиусом в 500 метров были заставлены импровизированными столами из листов фанеры, а на них лежали миллионы дисков. Уже потом, в более поздние времена ярмарка стала ежедневной и перебралась чуть выше, в то самое здание, которое все знают по пожару Сбербанка 2006 года, но это уже совсем другие времена… а воспоминания мои связанны именно с прекрасной порой ДКЖД.Нашел еще такое фото
Принцип тот же, после волны начала борьбы с пиратством и открытия повсеместных точек торговли дисками, ярмарка превратилась в ярмарку канцелярии, а затем и вовсе исчезла. На фото канцелярия, но также лежали диски.
Суть жизни в те времена сводилась к тому, что в будни ты ходишь в школу, а на выходные можно к папе, у него был персональный компьютер и можно было играть все выходные на пролет, и уж так свезло, что жил он на в то время конечной остановке автобуса, кажется 35, как сейчас помню, и шел этот автобус прямо от дома до ДКЖД. Утро субботы всегда начиналось с поездки на ярмарку в поисках чего-то свеженького и интересного. Жена у него была молодая, посвящала себя учебе, театральной деятельности еще чему то, в общем в выходные ее особо то и не было, или не знаю, как там у них было устроено, но батя проводил выходные со мной у компьютера, много кока колы, еда, комп с 14 дюймовым лучевым монитором… и вперед, на встречу счастью.Я уж не знаю, почему во мне так теплы воспоминания именно тех дней, почему из всех 30 с лишним лет жизни запомнились именно эти годы, возможно был такой период, возможно стечение обстоятельств, а может быть просто так устроен мозг, в общем не важно.
Многие и многие дни, месяцы, годы были проведены у компьютера, мы могли не спать сутками или проиграть во что-то до утра, вся вселенная заканчивалась за порогом маленькой однокомнатной квартирки. Позже появился второй компьютер, мы узнали прекрасное слово LAN, это еще в те времена, когда провод вставлялся из компьютера одной сетевой карты в другую переворачивая жила, когда настройка сети по сложности была подобна строительству дома на даче…
Тогда не было интернета, не было сотовой связи, не было ничего… лишь ты и компакт диск. Все было не так просто, как сейчас, это не запустить msi файл и нажать next, next… в те времена чтобы установить игру или какой-то софт, нужно было установить кучу разных драйверов, последний Direct X и еще массу всего, все это необходимо было сделать в определенной последовательности и часто в процессе попросту слетала винда и ловился Blue screen… уровень знаний о компьютерах, их устройстве, внутреннем устройстве операционки рос в геометрической прогрессии, хочешь чтобы что то заработало, нужно знать и понимать все.. У одноклассников я был в почете, они ждали неделями, что я приду и помогу что-то установить… эхх… ностальгия.
Мой пост не об этом, собственно вы наверняка до сих пор не поняли, что это за поток сознания и воспоминаний и зачем все это, но с вашего позволения я продолжу.
Итак, шел 97-98 год, к тому времени уже был пройден этап Warcraft II, Red Alert, Civilization II и прочих гигантов индустрии… При этом они были пройдены вдоль и поперек, в том же Red Alert был всячески отредактирован INI файл… был период экономических стратегий, таких как капитализм, многое было, но однажды утром, в очередной раз мы поехали на «ярмарку волшебства» и увидели его… ему и посвящен мой пост, его величество Империализм…
Забегая вперед, я уж не знаю, чем он мне так понравился, почему он так «зашел», но он на долгие годы стал нашей любимой игрой. Там были баги, он вылетал на этапе «голосования», стабильность сетевой игры была совсем ни о чем, но черт возьми… это лучшее, во что я когда-либо играл. Геймплей затягивал все больше и больше, «ручные» бои, демократия, ресурсы, исследования, а газета… она была как настоящая… Империализм, ты навсегда засел в моей душе.
Жизнь шла, вышла вторая часть, но там упор сделан на захват земель «нового света», что по мне было не совсем интересно, так как весь геймплей был не подвластен игроку, правила диктовал сценарий, согласно которому ты не сможешь развивать свою империю, если у тебя нет ресурсов нового света.
Долго ждали третью часть, но к сожалению, так и не дождались… Компания была поглощена кем то, потом закрыта и еще что то, в общем уже на так важно. Шли годы, я взрослел, правильнее даже сказать старел, но периодически у меня возникает какое-то желание отдохнуть от реалий жизни и выключиться из этого мира, в эти моменты как не странно я вспоминаю именно его. Игра столь старая, что она уже не запускается на современных операционках, она настолько устарела, что разрешение 640 на 480 смотрится настолько убого, что режет глаз…. Но все-таки, иногда, раз в пару лет, я снова и снова разворачиваю виртуалочку, ставлю любимый империализм и наслаждаюсь…
За эти годы я прошел долгий карьерный путь, основная часть из которого была связанна с программированием, и в те самые моменты, когда я возвращался из мира фантазий и моя гейм сессия оканчивалась, всегда были мысли, ну какого хрена так? Неужели я один, кому она так засела?
Почему кто-то не подхватит отличную идею и не продолжит серию империализма? Почему кто-то просто не сделает этот шедевр современным?
В какие-то годы появился сайт старых игр GOG Games, я наивно полагал, что они «переписывают» старые игры, но купив их версию, я обнаружил тот же самый баг с «голосованием», все что они делают, это лишь меняют библиотеки оригинальной игры на более совместимые с современными OS. Я был крайне расстроен, но такова жизнь…
Обычно, когда что-то становится старым и не нужным, люди это выкидывают, раз в годик я «гуглю», не появились ли исходники в сети, но к сожалению, нет. Ни себе ни людям, вроде, как и прошло уже 22 года, а исходники так и не опубликовали, права наверняка уже утеряны и никому это не нужно. Что ж, наверняка из 7 миллиардов человек ни я один живу с такими мыслями… и действительно, какое-то время назад, сообщество энтузиастов (https://remake.twelvepm.de/) решило создать игру с нуля. Были активные переписки, шла какая-то разработка, есть даже главное окно и редактор карт, но в 2015 году все загнулось.
Я не очень понял, почему они пошли по пути создать все с нуля, возможно там была какая-то глубина мысли, они сразу стали немного уходить в сторону и делать «лучше». В итоге все остановилось на редакторе карт, нескольких плохо перерисованных текстурах местности и все…
Кто-то даже записал ролик на YouTube (https://www.youtube.com/watch?v=Yt3FJyVsr_g) типа дайте знать ребятки, когда закончите, очень жду… но… проект умер.
Собственно, подумав какое-то время, прикинув свои силы и возможности, а также необходимые навыки я подумал, а почему бы не сделать то что нравится самому? Хочешь сделать мир лучше, начни с себя)
Сказано сделано) Точнее не сделано, а первый "шажочек" в эту сторону сделан…С чего собственно начинается классический империализм? Правильно, с круто сгенерированной карты. Я могу долго расписывать как я сотни раз нажимал на кнопку генерации карты, могу написать здесь все что я выяснил, все закономерности того, как она строится, могу расписать как искал алгоритмы построения в интернете, но не думаю, что вам это интересно. Если коротко, то цель такова:
Генерируется она меньше чем за 0.5 секунды, что крайне удивительно. Я долго пытался повторить алгоритм и добиться такого же результата, ну как долго, общей сумме, наверное, часов 10, но вовремя понял, что это все равно будет «китайская» подделка, а мне нужен оригинал. 500 строчек кода выкинуто в помойку (карта генерируется, но около 30 секунд и не учитывает совсем уж всех "фишек"), идем дальше.
Так как исходников нет, то пойдем по самому сложному пути. Вся надежда на то, что это довольно существенная часть игры, алгоритм должен быть вынесен куда-то отдельно? Ну по крайней мере это логично. Как же я ошибался… есть один единственный .exe файл в котором содержится все, абсолютно весь код, размер файла чуть превышает 3 мегабайта.
Так же есть файлы расширения .gob, очевидно ресурсы. Очень странное расширение, переименовываем в .dll и:
Сразу возникает вопрос, зачем ребята из Open Source’а перерисовывали все… для прототипа можно было взять и отсюда. Ну ладно.
В общем, пересмотрев все библиотеки понял, что кода там нет. Тогда нам прямой путь к реиндженирингу… Сложно, кропотливо, но подъемно (в дальней перспективе).На сегодняшний день на рынке есть два более-менее живых решения, это IDA Pro и OllyDbg. По моему скромному субъективному мнению, обе замерли в развитии где-то в начале 2000 годов. Кто не знает, собственно эти программы лишь инструмент, они дизассемблируют до уровня кода ассемблера, очень хреново отображают массивы данных и позволяют дебагером прогуляться по коду. В свое время IDA заявила, что хватит это терпеть, теперь у нас будет все хорошо, мы научились вам выдавать идеальный С код вместо ассемблера (сайт кому интересно http://www.idasoft.ru). Естественно вариант С кода был предпочтительнее, и я решил опробовать сие чудо.
На выходе с imperialism.exe он сгенерил мне 300 тыс. строк кода:
Но вроде бы и не так страшно… Компилироваться данный файл естественно не стал выдав чуть более 3000+ ошибок. Можно конечно заморочится и исправить каждую, но вот незадача, под некоторые методы есть хэдеры, а тела нет :( То есть говорить о полноценном коде не приходится, некоторые методы остаются черной лошадкой.
Качество декомпиляции тоже под большим вопросом (не сильно отличается от обфускации):
Ну то есть конечно, если бы были все методы, если бы «это» можно было запустить в дебагере, бери спокойненько переименовывай, переписывай и на выходе когда-то получиться что-то нормальное, но с учетом кривости работы Hex Rays это не представляется возможным…Ладно, посмотрели на прекрасный (по сравнению с ассемблером) Си код, забыли, и пошли в дебри ассемблера.
Я определил для себя довольно четкую точку входа, из главного меню нажимая «Начать игру на случайной карте», перед открытием основного окна генерируется карта, то есть точно дергается функционал, который меня интересует.
Казалось бы... клик мышки, подгрузка ресурсов с адреса, зацепится чтобы найти методы можно на многое, но нет… Ни один из вариантов не срабатывал. В общем если не описывать рутину нескольких вечеров, то удалось зацепится на обращение к области памяти, куда складывается надпись «Play new game on Random map…», далее была трассировка, состоящая более чем из 200 тыс. вызовов методов за несколько секунд, был найден подходящий и по нему уже началась аналитика. Для анализа памяти пришлось использовать OllyDbg, потому как именитый IDA Pro этого не умеет…
Далее, от наиболее часто встречающегося в трассировке метода вышел на метод вызова главной родительской функции:
А теперь предстоит кропотливая работа интерпретации всего этого в читабельный вид). Задача реинжиниринга состоит в «переименовании» методов в человеческий вид, описании каждой из строчек (что она делает) и складывании «пазла» алгоритма у себя в голове. Очень много «магии», очень много странных чисел, например, построение карты состоит из цикла, который отрабатывает 6480 раз:
Каждая итерация совершает «действие» 5 раз с клеткой карты выше, ниже, правее, левее и с самой собой…
В настоящий момент по мере свободного времени описываю все что есть внутри касательно построения карты приблизительно так (комменты справа):
То есть на понятный для себя Си’видный код, пока на этом все…
В далеко идущих планах полностью переписать игру на каком-то высокоуровневом языке типа C# «как есть», используя существующие ресурсы, затем портировать ее мобильные устройства (Xamarin) при этом перерисовав графику на современный уровень сохранив тот же стиль, ну то есть категорично не устраивает качество под разрешение 640х480.
Не знаю, насколько это легально с точки зрения прав на игру, но вроде как полное повторение идеи не запрещено, тем более игра 1997 года.
Ну и собственно к чему я все это? Кто дочитал до конца (а таких явно немного), вопрос к вам, есть ли у меня единомышленники? Может сделать какой-то аналог Imperialism Remake (того, что загнулся в 2015 году), есть ли у кого-то желание помочь? В дальней перспективе есть мысли сделать игру платной на мобильных платформах под IOS и Android без внутри игровых покупок, то есть купил один раз и наслаждайся, нет глупых «купи монет».
Понимаю, что Пикабу не самое подходящее для этого места, но ведь тут собираются разные люди))) Хабр я разлюбил с недавних пор...
Всем, кто дочитал до конца спасибо! Как будет готова генерация карты, будет следующая часть статьи… Очень жду ваших комментариев и мыслей по этому поводу.