DOOM Classic и Wolfenstein 3D в исходниках



    id Software — компания известная скорее всего всем посетителям Хабрахабра, ведь они стоят за такими монстрами, как: Dangerous Dave, Commander Keen, Wolfenstein, Doom, Heretic, HeXen и т.д. Некоторое время назад, выступая на QuakeCon'е, Джон Кармак обещал выпустить исходные коды Doom 3, но пока что этого не произошло.

    Зато сегодня ZeniMax — компания. которой теперь принадлежит id Software (а так же Bethesda), выпустила обновления для Doom Classic и Wolfenstein 3D для iPhone, добавив в них поддержку Retina Display и универсальность (теперь в них можно играть, как на iPhone, так и на iPad), а так же, как это обычно принято в обновлениях, исправив некоторое количество ошибок.

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

    Ссылки в iTunes Store на Doom Classic [$6.99] и Wolfenstein 3D [$1.99].
    Ссылки на исходные коды Doom Classic и Wolfenstein 3D.

    UPDATE 1: В исходных кодах содержится, собственно, только код; нет звуков и графики.
    UPDATE 2: Судя по второму комментарию, даже в id Software работают люди, которым свойственно писать странный код.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 74

      0
      This source release does not contain any game data, the game data remains subject to the original EULA and applicable law.

      Хм… Что впрочем и не удивительно
        +11
        wolf_actor_ai.c, 300 строк одинакового кода:
        case en_mecha:
        	Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/084.wav" ), 1, ATTN_NORM, 0 );			
        	break;
        
        case en_hitler:
        	Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/044.wav" ), 1, ATTN_NORM, 0 );
        	break;
        
        // ...
        
        case en_will:
        	Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/072.wav" ), 1, ATTN_NORM, 0 );
        	break;
        
        case en_death:
        	Sound_StartSound( NULL, 1, CHAN_VOICE, Sound_RegisterSound( "sfx/090.wav" ), 1, ATTN_NORM, 0 );
        	break;
        


        Интересно, у них не было ни малейшего желания сделать хотя-бы так?
        case en_mecha:
        	Play_Sound( "sfx/084.wav" );
        	break;
        
        case en_hitler:
        	Play_Sound( "sfx/044.wav" );
        	break;
        
        // ...
        
        case en_will:
        	Play_Sound( "sfx/072.wav" );
        	break;
        
        case en_death:
        	Play_Sound( "sfx/090.wav" );
        	break;
        


        Или это была такая оптимизация? Тогда неужели звуки проигрываются так часто, что она имеет смысл? +1 вызов функции в секунду — это разве критично на фоне того, сколько ресурсов тратится на сообственно проигрывание этой функции? Я, конечно, в Си не особо силён, но всё-таки интересно услышать аргументы по этому поводу.
          +31
          Возможно этот код сгенерировал какой-нибудь софт, в котором они делали модели.
          • UFO just landed and posted this here
            +6
            иногда не стоит переделывать то что и так работает…
              +4
              А почему бы и нет? Я в исходники не заглядывал, но подозреваю что Sound_StartSound — какая-то универсальная функция для работы со звуком, которая в различных ситуациях может принимать различные аргументы. Видимо, так уж получилось что в wolf_actor_ai.c все эти аргументы были одинаковы. Чтож в этом плохого-то? Зачем городить какую-то промежуточную прослойку? А если они могли поменяться? Вдруг на en_death было бы решено поставить не ATTN_NORM а что-нибудь другое? Добавлять в промежуточный Play_Sound еще одино значение? Можно конечно, но зачем?..

              Повторюсь, в исходники я не заглядывал, просто высказал свое предположение :)
                +1
                В этом как раз скрытый смысл уменьшения дублирования: если мы можем все завернуть в функцию PlaySound, значит, эти звуки примерно одинаковы, одинаково выполняются — это важная метаинформация разработчику, которая не всегда осознанно выполняется. И если для какого-то звука нужно будет поменять какое-то значение аргумента, это будет не просто так — условно, вместо CHAN_VOICE будет CHAN_MUSIC, и тогда мы сделаем функции PlayVoice / PlayMusic — опять же все гораздо понятнее.

                А когда все делается через одну универсальную функцию с большим количеством аргументов (не говоря про «magic numbers»), вся эта логика скрывается за кодом, и приходится ее же вычислять в уме.
                  0
                  Это сейчас легко рассуждать. А в то время языки 90-х вели себя крайне странно, и порой впадали в метафизику.
                  Из вашего примера, вполне возможно, что оптимизированный вариант как раз переставал работать после третьего раза. Нечто с похожим я встречался в 90-х и никто из профи не мог мне дать внятный ответ.
                  В моем случае, был вариант подключения к графической карте. В учебниках рекомендовали оптимизированный вариант из одной строки. На деле он срабатывал через раз. Опытным путем я пришел к выводу, что код из 5 строк является надежным и всегда его использовал. Чем вызывал удивление у тех, кто видел мой код.
                +1
                Оправданий нет. Просто Copy/Paste :)
                  0
                  Предложите свой вариант реализации без copy/paste. Вам нужно сделать ф-ю, которая проигрывает нужный звук по его id (enum).
                    +4
                    Табличку (массив) сделать не судьба?
                      0
                      Компилятор сделает табличку. Но согласен, что выглядит некрасиво.
                        0
                        У этого варианта тоже есть минусы. Если сделать массив, то нужно будет всегда следить, чтобы индексы не съехали (чтобы кто-то в центр значений enum или наоборот в массив не вставил новое значение например). Можно сделать и массив структур/хеш, но нужно будет реализовывать/использовать поиск, что может подойти для офисного приложения, но неоптимально для игры. Ну и кол-во строк остается практически то же самое. Учитывая остальные минусы, не ясно, чем это лучше. Хотя, конечно, это вариант без copy/paste :)
                          0
                          Всё там отлично с индексами enum'ов, надо просто знать язык, на котором пишешь, а не как обычно. Пример без всяких извращённых поисков и хэшей, не имеющий проблем с модификацией enum'а:

                          enum myenum {
                          value_a,
                          value_b
                          };

                          char *myvalues[] = {
                          [value_a] = "123",
                          [value_b] = "456"
                          }

                          Это тот же самый язык Си, если что.
                            0
                            Хм, не знал что так можно. Тогда да, так лучше видимо…
                            +1
                            Даже если использовать не C99, а старый добрый C89, то вопрос на корню решается функцией инициализации на три строчки:

                            typedef struct mypair mypair_t;

                            struct mypair {
                            int id;
                            char *path;
                            };

                            enum values {
                            value_a,
                            value_b
                            last_value
                            };

                            mypair_t source[] = {
                            { value_a, "123" },
                            { value_b, "456" }
                            { -1, NULL }
                            };

                            char *cache[last_value];

                            void init() {
                            for (int i = 0; i < last_value; i++)
                            cache[source[i].id] = source[i].path;
                            }


                            И как бы всё. Дальше init преобразуется в init_array_cache(mypair_t *ptr, char *cache) и пишется:

                            init_array_cache(sound_spec, sound_cache);
                            init_array_cache(video_spec, video_cache);
                              0
                              Хотя корректнее в цикле там будет проверять не индекс, а source[i].path != NULL. Это я спросони ступил, прошу прощения.
                          • UFO just landed and posted this here
                              0
                              Это решение хуже, имхо, т.к. названия звуков/файлов ничем не хуже переменных или методов — им тоже нужны осмысленные названия.
                              0
                              char* soundFile = dbSounds[id]; // en_mecha, en_hitler, etc
                              PlaySound( soundFile );
                            +4
                            Да даже если оптимизировали, можно было хотя бы макросами заменить.
                              0
                              Видимо именно говнокод, оправданий нет, но, возможно, писал кто-то из новичков и так и пропустили, не исправляя, раз работает нормально.
                                0
                                Капец!
                                Мэппинг туда так и просится.
                                +1
                                на N900 это бесплатно =)
                                  +1
                                  Не бесплатно. За звук и графику надо платить.
                                  0
                                  интересно, что использованная gpl2+ не совместима с эппловскими правилами и продавать или выкладывать в магазине приложений имеют право только владельцы кода. в общем-то, довольно справедливо
                                    +11
                                    Почему у фашиста на обложке Wolfenstein 3D в руках M16 интересно)
                                      +2
                                      Вы раскрыли всю подноготную американцев! :)
                                        0
                                        Это и так всем известно — дед Буша сотрудничал с Гитлером, и узники Аушвица работали на него.
                                        +1
                                        Судя по длине ствола — скорее таки М4 без ручки
                                          +1
                                          Я думаю художник вряд ли запаривался в детализацией оружия, в любом случае непонятно откуда оно у фашистов)
                                            +3
                                            С трупо подобрал, когда патроны закончились.
                                              0
                                              в таком случае у художника очень хорошая фантазия, да и на вооружении ее не было, если конечно действие в игре происходит в 40-е)
                                          • UFO just landed and posted this here
                                            +1
                                            Хах… id Software толсто тролит
                                              0
                                              M16A2
                                                0
                                                Ствол коротковат.
                                                  +6
                                                  Сверху вниз: M16A1, M16A2, M4, M16A4
                                                  image
                                                  Всё таки на М4 больше похоже
                                                    +1
                                                    Не, все-таки A2. См. телескопический приклад, подствольная рукоятка — это отличает A2 от M4.
                                                    Ствол только короткий нарисовали.
                                                      0
                                                      Подствольная рукоятка — снимается. А вот приклад — да, другой.
                                                      • UFO just landed and posted this here
                                                          +4
                                                          Художник курит что-то забористое
                                                    0
                                                    А вот граната (у фашиста на заднем плане) похожа на немецкую Stielhandgranate.
                                                    ЗЫ ну и куда же без американских джинсов
                                                      0
                                                      Джинсы во время Второй Мировой уже были, чего не скажешь о винтовке.
                                                    • UFO just landed and posted this here
                                                      +1
                                                      Интересно, а WADы от десктопного дума пойдут?
                                                        0
                                                        Как-то ковырял айфоновскую версию Дума, и ЕМНИП, там действительный обычный WAD с дополнительным отдельным архивом «high-res» звуков
                                                        +1
                                                        А кто там на заднем плане рукой машет на картинке «DOOM»?
                                                          0
                                                          Второй игрок?
                                                            +7
                                                            Это Пахомыч, обедать зовет.
                                                            +1
                                                            Прохожий. Кричит «Чувак! ты там мобилу обронил»
                                                            • UFO just landed and posted this here
                                                            +35
                                                            Тематический портал… срач по поводу версии винтовки. Fuck yeah.
                                                              0
                                                              Вот интересно, тут недавно писали что размашистые и подробные комментарии это признак новичка в программировании, а тут код откомментирован по самое нехочу чем то вроде этого:

                                                              // A proportional drop in lighting sounds like a better idea, but
                                                              // this linear drop seems to look nicer. It's not like Doom's
                                                              // lighting is realistic in any case...


                                                              Это что то говорит о качестве программистов в ID?
                                                                +1
                                                                Вообще-то на комменты код скупноват. Иногда встречаются, но я бы не сказал, что он серьёзно закомментирован.
                                                                  0
                                                                  там по разному в разных местах, например, iphone_render.c (из doom) весь покрыт комментариями
                                                                  +6
                                                                  В комментарии написано не как сделано, а почему. Так что все ок
                                                                    0
                                                                    Не надо обобщать :) Размашистые коментарии могут также говорить о том, что код специально готовили для ознакомления людьми разного профессионального уровня. Вполне возможно, что перед открытием они как раз и провели такую «комментизацию» и, возможно, рефакторинг.
                                                                      +12
                                                                      комментарий новичка
                                                                      a += 4; // к переменной а добавляем 4

                                                                      комментарий профессионала
                                                                      i = 0x5f3759df — (i >> 1); //первое приближение 1/sqrt()
                                                                      0
                                                                      Господа, вы забыли, что с недавних пор на ftp.idsoftware.com/idstuff/doom3/source/ давно лежат исходники Doom3. и поверьте, там код не менее странен.
                                                                        +5
                                                                        Вообще то это SDK а не исходники игры.
                                                                          +4
                                                                          Исходники Doom 3 выложат после выхода RAGE. В октябре.
                                                                            +1
                                                                            Извиняюсь, немного поторопился.
                                                                          0
                                                                          У меня лежат исходники Doom'а под названием linuxdoom. Судя по внутренностям, это самые натуральные исходники самого натурального Doom'a, открытые когда-то давно. Копирайты соответствующие. Сейчас скачал предложенные исходники, пусть будет много версий, хороших и разных.
                                                                            +1
                                                                            Зачем они Вам? Внукам показывать? ;)
                                                                              +1
                                                                              Да нет, что вы. :) Внукам я сам Doom покажу, а исходники меня интересуют исключительно с программистской точки зрения. Не только just for fun, но и самообразование. В общем, мне интересно их устройство. Понимаете, в вакууме Сети много сферических исходников самых разнообразных программ. Их можно изучать, а некоторые — даже нужно, только удовольствия бывает маловато. Другое дело, когда изучаешь исходники того, что давно живет в сердце (Doom), — чувство удивительное просто.
                                                                              +2
                                                                              Ну вот они все тут общедоступные ftp.idsoftware.com/idstuff/source/
                                                                              +3
                                                                              Не знаю, что там нового открыли, но читал исходники Doom еще год назад, как минимум. Вот неплохое ревью: fabiensanglard.net/doomIphone/index.php
                                                                                +1
                                                                                Это очень хорошее ревью.
                                                                                0
                                                                                Столько мусора запаковали и ncb файл(благодаря которому размер исходников вульфа в 5 раз вырос), и svn-вские файлики…
                                                                                  +2
                                                                                  Интересно. Doom для iOS занимает 113 Мб.
                                                                                  Помнится оригинальный Doom на нескольких дискетах умещался.
                                                                                    0
                                                                                    Самое простое объяснение, приходящее в голову: есть ли в iOS поддержка midi? Т.е. в каком формате там музыка например?
                                                                                      0
                                                                                      А пройдитесь архиватором по iOS-игре. Возможно, и поместится на несколько дискет — наверняка поленились запаковывать ресурсы.
                                                                                        0
                                                                                        Там вся музыка в mp3. +Звуки в 22kHz 16bit (в оригинальном думе 11kHz 8bit)

                                                                                      Only users with full accounts can post comments. Log in, please.