skull armada dev history - падение и взлет

продолжу описывать историю разработки, что-ли.. когда-нить/кому-нить будет интересно.
написать надо много, потому как за целый год =)
но начну наверное с конца, как я обычно люблю, скажу что примерно должно получиться в итоге:
Во первых, сама игра это смесь походовой стратегии и рпг. Игрок (в бою) управляет напрямую только одним или несколькими персонажами. Т.е. как в обычных рпг - можно их перемещать, кастовать всякие спелы, использовать предметы и т.д. Отличием от рпг будет то, что герой сможет таскать с собой армии (предположительно 100-500 юнитов). Юниты в армии будут объединяться в отряды, причем в один отряд можно будет закинуть совсем разношерстных юнитов (например отряд из 3-х юнитов - пехотинец, лучник и всадник. Хотя эффективность таких отрядов наверняка будет маленькой), главное, что юниты будут действовать синхронно во время хода отряда, и будут исполнять общий приказ. Например, оставаться на месте, стрелять (кто может) или ломиться вперед.
Есть 2 варианта развития игры - один из них включает в себя второй.
Первый вариант предусматривает большой рандомно генерируемый мир, активно живущий по своим законам (или хотя бы хорошо симулирующий =] как в серии замечательной космической стрелялки-стратегии X (последняя представительница - X-treat)). Территориально мир будет поделен на большие и не очень государства и "нейтральные" земли, социально - кроме королевств будут разные силы, типа орденов, кланов, гильдий и "нейтральных" наемных армий со своими генералами, которые за плату предлагают свои военные услуги. Главный герой будет как раз одним из таких наемников со своей армией.
Впрочем, будет предусмотрен сценарий, в котором ГГ(главнй герой) будет начинать один, вместо армии имея кучу золота, которые можно будет потратить на наемников (в ближайшем логове наемников %]), отличных от тех, которые предлагаются в начале, или на покупку артефактов (хотя в бою в нашей игре все равно один в поле воин будет не очень силен.. вот 10 героев с разными магиями против 100-200 воинов - возможно =]) [Вообще баланс будет fuzzy насколько это возможно. Так у самого жалкого крестьянина с 5 жизнями 5 атакой и 5 повреждением будет шанс замочить рыцаря в сияющих доспехах с 50 жизнями.. очень маленький, конечно, но все таки.]
Игра будет центрирована вокруг 1 героя, который будет главным, (абсолютная) смерть которого будет приводить к гейм оверу, независимо от того, есть еще подконтрольные герои или нет. + permadeath как в рогаликах, т.е. никаких сохраненок (кроме скаминга, и, может, такой.. э.. магии)
..впрочем, расписывать диздок я здесь не собираюсь %)
грубо говоря, это будет такая смесь kings bounty (только с рандомными картами и выбором за какого короля сражаться, или вообще "грабить корованы" за самого себя %]) и dominions серии. [Вы играли в dominions? Эту великолепную игру. Очень рекомендую. Последняя часть - Domionions 3: the Awakening. Не помню, пиарил я ее раньше или нет, но наверняка еще буду пиарить.] Это такая tbs, где вы выступаете в роли бога, и.. ..хотя я отвлекаюсь =). Так вот, те кто играли в доминионс могли бы намного проще "войти" в геймплей игры. [Я так понимаю, если кто-то до сюда дочитал, то может оказаться как-то заинтересован =)]
Возвращаясь к варианту - я тут примерно подсчитал, что для полной реализации всех фишек игры, если все условия разработки останутся на том же уровне (т.е. без финансирования и работа не будет отнимать много времени), понадобится еще лет 10. шанс удачного завершения ~10% =), потому как меня эта игра уже заебет или в меня врежется метеорит. (астральный, в астрального меня).
Поэтому, есть второй вариант, который можно было б завершить года за (N), может меньше. Этот вариант почти полностью входит в разработку первого варианта (т.е. по его завершению можно будет продолжить разрабатывать первый вариант). Игра будет представлять из себя череду боев с незначительным interaction на глобальной карте, которая сделает игру слегка нелинейной. Наподобии Warhammer: Dark Omen..
теперь немного истории разработки. Последний пост на эту тему был написан аж год назад =0. в нем я поведал о том, что сделал просчет-атаку-убийство-удаление юнитов. Дальше я собирался делать файрбол. На нем, собственно, тогда все и остановилось, причем так, что доделал я его буквально недавно. Хотя, конечно, сам он в этом не виноват, но все по порядку.
в конце августа я то ли переустанавливал систему, то ли что-то запорол, вобщем, понял, что потерял диск со своей VS 6.0, на которой делал игру. На дворе был 2006, и пираты уже год как продавали VS.net 2005, а некрософт выпустила в мир споры своего free VS 2005 express. Найти версию студии 5летней давности было почти нереально. Я решил, что рано или поздно это должно было сдучиться, от прогресса не убежишь и все такое. В свою способность разобраться с другим компилятором или ИДЕ я не верил (хотя вообще-то, с ИДЕ - верил), а уж с обоими сразу - и подавно.
короче, купил.
сначала игра не компилилась, выдавая кучи ошибок. потом я долго плевался от студии, от манагедности, от ее жирности (блять, 2гб!!)), от того что эта сука ставит мне .нет фреймворк и сотен копий каких-то килобайтных повторяющихся манифестов... не знаю, как-то я это пережил и продолжил разработку. В принципе, ко всему привыкаешь. Единственная положитеьная черта визуал студии - дебаггер. С помощью него я нашел одну ошибку, которую так найти было б сложно.. хотя, с debug_new, с которым я недавно познакомился, может, и не так сложно =).
так прошел месяц. В конце сентября меня стали атаковать баги: неожиданно я понял, что фпс игры упал на 20 (я как-то писал об этом). Начал судорожно искать причины. 10 фпс нашел, 10 - нет. Я продолжал искать, как вдруг, однажды, когда я попытался включить релиз-версию, у меня вылез месадж-бокс с надписью "Приложение не было запущено, поскольку оно некорректно настроено. Повторная установка приложения может решить данную проблему". Таких ерроров я раньше не видел ни разу, и мессаджбоксов таких в игру не вставлял, вирусы были явно не при делах, так как более старые (от 6-й студии) версии запускались нормально, а идею о переустановке своего собственного приложения я как-то не очень понимал. Дебаг версия, кстати, запускалась без проблем, только вместо 500-400кб весила 1.5метра %).
Я сразу же понял, что во всем виноваты фашистско-индусские технологии некрософта: .нет, манифесты, сишарп и манагед =). Я только не мог понять, как эта зараза могла попасть в мою девственно чистую с++ среду? даже, почти что С среду..
это был тяжелый удар.. несколько дней позже, по чьему-то совету на irc канале #gamedev `а, я разобрал файл .vcproj, пытаясь найти компонент, который есть в релиз версии и нет в дебаге. Через пару минут что-то там было найдено (щас смотрел - хз, филькина грамота какая-то. кажется это был EnableCOMDATFolding="2" в свойствах линкера). "Даже не знаю, что может делать компонент с таким дурацким названием =)" - сказал мне чел, который мне помогал (у меня на имена всякие и ники плохая память), и предложил его просто вручную стереть из файла. Я согласился, но это было уже последней каплей в наших relations with microsoft visual studio 2005 .net.. Я не отрицаю, что я мог сам каким-то хреном врубить эту фигню, но ИМАО виновата все равно студия - думаю, не стоит давать программеру возможность врубать какую-то опцию, которая может сломать экзешник, когда он просто ищет способы сделать так, чтобы релиз версия весила не 400кб, а хотяб 200 =). Ну даже, допустим, опции должны много чего разрешать (совсем не по некрософтски), пусть даже какой-нить новичок может себе что-то запороть. Но не хотят же они мне таким образом сказать, что я новичок =)).. примерно так..
я решил, что скал армаду, как проект, пока заморожу, до лучших времен, когда буду лучше знать С, опенгл (надо было все таки его разбирать =/) и другие компиляторы.. может даже под линукс буду делать. =).. а временно решил заняться (просто я не могу без дела какого-то сидеть).. впрочем я не решил сам чем заняться, потому, что на геймдев канале в то время как раз пошла лихорадка о Dwarf Fortress. Не буду здесь много про него рассказывать - просто скажу, что это рогалик (аскии тайлы на директХ), с рандомным миром, очень большой детализацией, необычной системой боя (это вообще пиздец, никогда не забуду, как я один раз задушил кабана в степи, или один раз мы с пьяницами пошли на кладбище, так они сражались таким образом - выхватывали зомби, один хватал за одну руку, другой за другую, а третий мочалил беднягу кулаками по корпусу). Рогалик на стадии еще беты (был, во всяком случае тогда), но поиграть уже можно. Там еще есть другой режим (стратегия (аскии, кстати тоже, лол)) - крепость гномов, который почти полностью доделан, но это уже никак к посту не относится.. [..а еще какая там музыка, мм..]
так вот, как раз тогда я впервые познакомился с рогаликами, как жанром (ах, если б я знал о таком жанре 10 лет назад, когда все только начиналось =/). Я начал активно изучать новую для себя тему. После дворф фортреса была мория, зангбанд, нетхак, омега, кровл, и может что-то еще..
хотя кровла не было, это я уж слегка приврал =)), но все остальное - было.
..Но, больше всего, был ADOM.
кто не знает что такое адом, я скажу адом - это пиздец. не такой пиздец, каким мог бы быть (и будет, скорее всего) дворф фортрес, и не такой шизофренический (в хорошем смысле слова, конечно) пиздец как нетхак, но все таки. Игры, которые могли бы затянуть настолько, что в них продолжаешь поигрывать по сей день, или которые оставили широкий след в памяти, можно пересчитать по пальцам. Сначала было немного сложно, конечно привыкать к буковкам на черном экране =), к управлению на 3 клавиатуры, и к тому чтобы играть на верхнем ряде цифр вместо нумпада (у ноутбуков нет нумпада). Потом были пара сотен загубленных персонажей и пару месяцев я вообще почти ничего не помню =)) =Р. Хаос вирма в огненной башне, я, кстати, так и не смог завалить, хотя ни монстры в библиотеке, ни король скелетов, ни стальные големы для меня не представляли опасности.. [shamed]
Короче, уже через 3 дня после инциндента со 2005-й студией у меня уже появилось желание попробовать себя в рогалике. Тем более, я думал, что это все легко, непринужденно, и вообще все силы уходят только на интересность и разнообразие самой игры. о, наивный _я почти год назад_ =)). Я считал что за 2 недели уже смогу что-нить такое забацать играбельное..
дальше я около недели изучал все пути, по которым можно было бы делать рогалик. Главное, я хотел, чтобы он обязательно шел под дос (честно говоря, сейчас я уже хз зачем =]). Потом удивился, что в визуал студии, оказывается, отсутствует компиляция под дос (лол). Так уж получилось, что судьба сама подтолкнула меня к смене компилятора, поэтому с этой тз вся эта хрень с рогаликами была очень полезна (я уж не говорю о том, что можно было отвлечься от скал армады). К тому же в процессе работы над рогаликами я узнал очень много важного касательно работы с различными генерациями, и улучшил свой скил в С =).
Так вот, насчет компилятора - был вариант с борландовским турбо С++, однако ж, слава богу, судьба спасла меня от него тем, что Томас Бискуп создал страницу с qhack, которая поведала мне о волшебном мире DJGPP и pdcurses =)). джгпп - это порт гцц под дос, если кто не знает. потом было долгое разбирательство, как с гцц, так и с досом. У джгпп есть собственный редактор, но он досовский 20х80 текстовый, типа у как у турбо С. С таким раскладом можно было тем же турбо С и пользоваться, поэтому стоял выход либо кодить в текстовом редакторе, потом хитрым бат файлом (лол, я еще тогда не знал про ограничение количества символов аргумента к файлу) все компилить, либо скачать какой-нить иде, не заточенный конкретно под что-то одно. Я выбрал code::blocks, скачал его в октябре, поставил и сразу понял - это - оно! до сих пор пользуюсь тем билдом, лень скачивать новые =)), хотя пора бы уже
В то время я не знал, поставится ли джгпп под код блокс. Однако, код блокс оказалось довольно универсальным иде, так что я довольно легко их совместил (были пара затруднений, но ответы на них нашлись на форуме код блокса), используя шаблон минГВ.
в манах от джгпп я прочитал о minGW - виндосовском порте гцц. Для эксперимента решил скачать и его, установил в код блокс, и решил на всякий случай проверить, сможет ли он скомпилировать skull armad`у, написанную на визуал с++ и для визуал с++. Я был уверен, что не сможет - что некрософт расставит в "своей" реализации с++ какие-нить "послабления", которые, с одной стороны, облегчат кодинг, а с другой, сделают переход на другие компиляторы как можно более геморным.. Действительно, сначала пришлось исправлять большое количество мелочей, пока гцц не принял исходники (с, правда, парой десятков ворнингов =]]). Компилятор сдался, однако затем уже линкер стал жаловаться на библиотеку d3dx9.lib, которая входила в стандартную поставку DX_SDK, и походу была откомпилена конкретно под vc++, поэтому пришлось поставить d3dx9d.lib. Экзешник был создан, и я просто охренел от его размера - 100кб против ~400кб от визуал студии. Он, правда, потребовал d3dx9d.dll в свою очередь, так что запустить экзешник я еще не мог. Как ни странно, найти подходящуюю дллку с таким названием в стандартных поставках директХ не удалось, но я нашел похожий файл в игре Galactic Civilisations 2, вытащил его оттуда причесалпереименовал и всунул в рабочую папку. Игра запустилась, и показала тот же фпс и перфоманс =) (я боялся, что игра может замедлиться). Таким образом, с одной стороны, размер игры увеличился на 1.5мб (500кб в архиве), но с другой, учитывая, что с обновлениями придется слать только 100кб против 400 (уже, кстати, 183), получается, что эта дллка себя окупает с торицей за несколько "патчей" <=)..
кстати, code::blocks занимает 30 метров, minGW - 80 метров, при этом выполняя ту же функцию (для меня, во всяком случае), что и визуал студия, занимающая в ~20 раз больше. К тому же они не устанавливают мне компонентов, которые не дают программе запускаться, и не ставят неизвестно чем забитый .нет фреймворк. А хваленый мсдн оказался вообще какой-то невменяемой хренью, из которой у меня ни разу не получилось вытянуть нормального ответа на свои запросы. Неудивительно, что у меня появилось желание от них избавиться =). Не буду рассказывать подробно, но.. короче пришлось переустанавливать систему =)) =Р..
я опять решил продолжить делать skull armad`у, однако судьба распорядилась иначе. Через несколько компиляций и небольших исправлений, экзешник категорически перестал запускаться. Была явно какая-то проблема утечки памяти. Причем, дебаггер был абсолютно бесполезен, так как под дебаггером все запускалось отлично и без запинок =Ъ..
Пришлось расставлять ловушки в виде мессадж боксов, чтобы найти хотя бы примерно место, где могла быть утечка (т.е. если до этого сообщения доходит, значит такое-то количество кода уже пройдено и там ошибки нет). Однако, ловушки не помогали - при попытке сжать тиски сверху и снизу (передвигая месаджбоксы), ошибка выпархивала как бабочка и перемещалась либо наверх, либо вниз по коду. По сообщениям от access violation тоже ничего не было понятно.
Это был крах, настоящий и полный - у меня к тому времени не было опыта работы с такими багами, к тому же я находился в новой, почти не знакомой мне среде, и под новым, также неизведанным компилятором..
Собственно, оправившись от шока (лол) нужно было решить что делать дальше. Все ошибки со скал армадой меня уже порядком подзаебали к тому времени, поэтому терпения и сил вступать в бой с неизвестным ликом не было. У меня была мысль, что дебаггер визуал студии поможет найти ошибку, но желания возвращаться к нему уже не было. К тому же, в какой-то мере это означало сдачу некрософту. =/
Решив, что причиной последней ошибки была неопытность, как практическая, так и теоретическая в С++, я решил, что нужно каким-то образом развивать свои знания. Затем, я решил, что прежде чем изучать С++, неплохо бы сначала в совершенстве овладеть С. Осталось только найти подходящую платформу для "изучения С". Долго искать не пришлось - это был рогалик под дос, к которому было уже все готово =))..
В дальнейшем, думал я, после того, как я почувствую себя гуру с++, возьму исходники skull armada, и перепишу их все заново - и так я точно, учитывая какой я буду крутой кодер, смогу избежать той баги =). Причем перепишу все под опенГЛ, и все будет мультиплатформенным, а если ОпенАЛ (звуковая библиотека) пашет под дос, то еще и под него порт сделаю %)..
[я еще до сих пор думаю, как было б неплохо перейти на опенГЛ.. но хз]
собственно, потом пошла разработка рогалика. Сначала pdcurses, потом fov, потом pathfinding (был выдернут из skull armada), потом я понял, что досовские программы имеют ограничение на количество знаков, и что выдать компилятору в аргументах 12 файлов сразу не получится, и зачем нужен make..
потом я разбирался с make (это был один из самых напряжных дней в моей жизни=]).. мне не хотелось создавать и менять makefile каждый раз для нового проекта (как будто у меня было бы куча проектов под дос =] омг) или добавления нового сорса или хедера, поэтому хотелось создать что-то универсальное. Через три дня у меня был 150-строчный makefile, написанный специально под код блокс, который позволял мне управлять код блоксом и джгпп так, словно проблем с большим количеством файлов не было, и все действия, как раньше, проводились через кнопки интерфейса. Единственный недостаток был в том, что при добавлении/удалении хедеров из сорсов приходилось делать ребилд вместо обычного билда.
---
разработку рогалика я описывать не буду - у меня было несколько постов на эту тему, к тому же я собираюсь еще вернуться к его разработке..
---
так прошел октябрь, декабрь, новый год =), январь, февраль, март, ап.. стоп.. март..
В конце марта у меня уже был доделан лос, генерация подземелий, переход между этажами, может быть еще что-то. В то время я как раз занимался тем, что создавал себе небольшую дебаг-консольку, и сделал взаимодействие с картой в виде открывания дверей. Я уже 5 месяцев кодил на чистом С и уже четко знал где проходят различия между плюсами и чистым С и понял еще, что чистый С мне очень нравится (раньше я считал так - что это просто обрезанный С++, а, типа, если есть тоже самое, только больше, то зачем нужен С?), наверное даже больше чем С++.. к тому же я уже чувствовал себя крутым кодером С, а рогалик мне начинал надоедать.
Мне пришла дерзкая идея попробовать реанимировать skull armada. В этот раз я решил попробовать другую тактику, до которой, почему-то, не додумался в прошлый раз. За день или два бага была локализована, всмысле конкретно строчкиек возникновения, и ликвидирована.. если честно, я до сих пор не могу понять, почему, и как оно происходило именно таким образом, и, наверное, даже не буду говорить в чем было дело.. Просто теперь я всегда пользуюсь snprintf() вместо sprintf(); =)
Потом, я доделал файрбол, сделав ему передвижение по дуге (омфг физика и математика лол), потом сделал спец атаку у командира и начал работать над внешним видом. хотел уже тогда даже сделать небольшую демку.. но передумал, решил ввести более обширную магию и больше юзер-френдлиности %)
вот как это к тому времени выглядело:

потом была кровавая борьба за фпс, мипмапы, разные приукрашательства, переработка системы частиц и их эмиттеров, много разных багов, статусы юнитов (отравлен, заморожен)..
Потом я показывал демку некоторым друзьям. Никто из них не был просветлен доминионсами, а идеалом пошаговых стратегий (точнее, их боевых режимов) были heroes, age of wonders, disciples и т.д., где юнитов на поле было мало. Здесь же юниты стояли сгруппированные, как в RTS. Короче у многих первым движением было выделить драгом отряд, чтобы ткнуть им поскорее в противоположную сторону.
[Стереотипность геймплея ведет к стереотипности "играния", которая в свою очередь к стереотипности ожиданий, которая ведет к созданию игр со стереотипным геймплеем =////.. замкнутый круг мокретинго..]
Вторая проблема была в том, что все пытались выделить юнитов по их изображению (механика игры такова, что выделять юнитов нужно кликая на квадрат поля под ними), а то, что при этом выделялся один из следующих за ним юнитов вводило их в некий когнитивный диссонанс. Пришлось натянуть мультитекстурой поверх на ландшафт "сетку" (сначала была шахматная сетка как на скриншоте на самом верху), и один квад, на который указывает курсор, "подсвечивать". Однако, в толпе под ногами сложно было увидеть, на какого юнита указывает курсор. Пришлось также подсвечивать и юнита.
Потом было решено, что неплохо бы еще и сделать так, чтобы интерфейс можно было убрать. Основной смысловой нагрузкой интерфейса являются 1) кнопки доступа ко всяким меню - для них будут шорткаты на клаве; 2) лог битвы - но и без него можно спокойно обойтись, либо он может обойтись без рамки; и, 3) главная функция была в том, чтобы показывать характеристики юнитов (к примеру, сколько осталось жизней). В то время я как раз занимался "всплывающими подсказками" - типа tooltips (как в разных приложениях, знаете, наведешь на какую-нить кнопку, подождешь чучуть и показывается такой небольшой прямоугольник с текстом, описывающий назаначение кнопки). В какой-то игре такие тултипы можно было вызывать сразу, наведя на элемент и нажав Tab. В игре я решил ввести такую же технологию с юнитами. Т.е. стало можно узнать характеристики юнита, наведя на него и нажав Tab, и интерфейс теперь по желанию можно убрать, вытянув еще ~10фпс %)
а примерно так все сейчас выглядит, + "tooltip" юнита с его характеристиками:

последний месяц я более плотно занимался GUI. Так, сделал, например, отдачу приказов отрядам и несколько разных магий. Большую часть, правда, провел занимаясь дебагом последствий магии =)).
Скоро в свой лытдыбр выложу ссылку на демку.. =)