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

Хм… Что впрочем и не удивительно
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 вызов функции в секунду — это разве критично на фоне того, сколько ресурсов тратится на сообственно проигрывание этой функции? Я, конечно, в Си не особо силён, но всё-таки интересно услышать аргументы по этому поводу.
Возможно этот код сгенерировал какой-нибудь софт, в котором они делали модели.
Хабрахабр умеет изобретально ругать начинающих за их говнокод, и не менее изобретательно оправдывать говнокод, написанный профессионалами.
иногда не стоит переделывать то что и так работает…
А почему бы и нет? Я в исходники не заглядывал, но подозреваю что Sound_StartSound — какая-то универсальная функция для работы со звуком, которая в различных ситуациях может принимать различные аргументы. Видимо, так уж получилось что в wolf_actor_ai.c все эти аргументы были одинаковы. Чтож в этом плохого-то? Зачем городить какую-то промежуточную прослойку? А если они могли поменяться? Вдруг на en_death было бы решено поставить не ATTN_NORM а что-нибудь другое? Добавлять в промежуточный Play_Sound еще одино значение? Можно конечно, но зачем?..

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

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

enum myenum {
value_a,
value_b
};

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

Это тот же самый язык Си, если что.
Хм, не знал что так можно. Тогда да, так лучше видимо…
Даже если использовать не 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);
Хотя корректнее в цикле там будет проверять не индекс, а source[i].path != NULL. Это я спросони ступил, прошу прощения.
НЛО прилетело и оставило эту надпись здесь.
Это решение хуже, имхо, т.к. названия звуков/файлов ничем не хуже переменных или методов — им тоже нужны осмысленные названия.
char* soundFile = dbSounds[id]; // en_mecha, en_hitler, etc
PlaySound( soundFile );
Да даже если оптимизировали, можно было хотя бы макросами заменить.
Видимо именно говнокод, оправданий нет, но, возможно, писал кто-то из новичков и так и пропустили, не исправляя, раз работает нормально.
Капец!
Мэппинг туда так и просится.
на N900 это бесплатно =)
Не бесплатно. За звук и графику надо платить.
интересно, что использованная gpl2+ не совместима с эппловскими правилами и продавать или выкладывать в магазине приложений имеют право только владельцы кода. в общем-то, довольно справедливо
Почему у фашиста на обложке Wolfenstein 3D в руках M16 интересно)
Вы раскрыли всю подноготную американцев! :)
Это и так всем известно — дед Буша сотрудничал с Гитлером, и узники Аушвица работали на него.
Судя по длине ствола — скорее таки М4 без ручки
Я думаю художник вряд ли запаривался в детализацией оружия, в любом случае непонятно откуда оно у фашистов)
С трупо подобрал, когда патроны закончились.
в таком случае у художника очень хорошая фантазия, да и на вооружении ее не было, если конечно действие в игре происходит в 40-е)
НЛО прилетело и оставило эту надпись здесь.
Хах… id Software толсто тролит
Ствол коротковат.
Сверху вниз: M16A1, M16A2, M4, M16A4
image
Всё таки на М4 больше похоже
Не, все-таки A2. См. телескопический приклад, подствольная рукоятка — это отличает A2 от M4.
Ствол только короткий нарисовали.
Подствольная рукоятка — снимается. А вот приклад — да, другой.
Вы ребята совсем разума лишились, что-ли? Художник нарисовал своё «я так вижу» а вы о конкретной модели спорите.

Художник, если что, немецкий автомат нарисовать пытался.
Художник курит что-то забористое
А вот граната (у фашиста на заднем плане) похожа на немецкую Stielhandgranate.
ЗЫ ну и куда же без американских джинсов
Джинсы во время Второй Мировой уже были, чего не скажешь о винтовке.
НЛО прилетело и оставило эту надпись здесь.
Интересно, а WADы от десктопного дума пойдут?
Как-то ковырял айфоновскую версию Дума, и ЕМНИП, там действительный обычный WAD с дополнительным отдельным архивом «high-res» звуков
А кто там на заднем плане рукой машет на картинке «DOOM»?
Второй игрок?
Это Пахомыч, обедать зовет.
Прохожий. Кричит «Чувак! ты там мобилу обронил»
НЛО прилетело и оставило эту надпись здесь.
Тематический портал… срач по поводу версии винтовки. Fuck yeah.
Вот интересно, тут недавно писали что размашистые и подробные комментарии это признак новичка в программировании, а тут код откомментирован по самое нехочу чем то вроде этого:

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

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