Pull to refresh

Comments 74

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 вызов функции в секунду — это разве критично на фоне того, сколько ресурсов тратится на сообственно проигрывание этой функции? Я, конечно, в Си не особо силён, но всё-таки интересно услышать аргументы по этому поводу.
Возможно этот код сгенерировал какой-нибудь софт, в котором они делали модели.
UFO just landed and posted this here
иногда не стоит переделывать то что и так работает…
А почему бы и нет? Я в исходники не заглядывал, но подозреваю что 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. Это я спросони ступил, прошу прощения.
UFO just landed and posted this here
Это решение хуже, имхо, т.к. названия звуков/файлов ничем не хуже переменных или методов — им тоже нужны осмысленные названия.
char* soundFile = dbSounds[id]; // en_mecha, en_hitler, etc
PlaySound( soundFile );
Да даже если оптимизировали, можно было хотя бы макросами заменить.
Видимо именно говнокод, оправданий нет, но, возможно, писал кто-то из новичков и так и пропустили, не исправляя, раз работает нормально.
Капец!
Мэппинг туда так и просится.
Не бесплатно. За звук и графику надо платить.
интересно, что использованная gpl2+ не совместима с эппловскими правилами и продавать или выкладывать в магазине приложений имеют право только владельцы кода. в общем-то, довольно справедливо
Почему у фашиста на обложке Wolfenstein 3D в руках M16 интересно)
Вы раскрыли всю подноготную американцев! :)
Это и так всем известно — дед Буша сотрудничал с Гитлером, и узники Аушвица работали на него.
Судя по длине ствола — скорее таки М4 без ручки
Я думаю художник вряд ли запаривался в детализацией оружия, в любом случае непонятно откуда оно у фашистов)
С трупо подобрал, когда патроны закончились.
в таком случае у художника очень хорошая фантазия, да и на вооружении ее не было, если конечно действие в игре происходит в 40-е)
UFO just landed and posted this here
Хах… id Software толсто тролит
Сверху вниз: M16A1, M16A2, M4, M16A4
image
Всё таки на М4 больше похоже
Не, все-таки A2. См. телескопический приклад, подствольная рукоятка — это отличает A2 от M4.
Ствол только короткий нарисовали.
Подствольная рукоятка — снимается. А вот приклад — да, другой.
UFO just landed and posted this here
Художник курит что-то забористое
А вот граната (у фашиста на заднем плане) похожа на немецкую Stielhandgranate.
ЗЫ ну и куда же без американских джинсов
Джинсы во время Второй Мировой уже были, чего не скажешь о винтовке.
UFO just landed and posted this here
Интересно, а WADы от десктопного дума пойдут?
Как-то ковырял айфоновскую версию Дума, и ЕМНИП, там действительный обычный WAD с дополнительным отдельным архивом «high-res» звуков
А кто там на заднем плане рукой машет на картинке «DOOM»?
Это Пахомыч, обедать зовет.
Прохожий. Кричит «Чувак! ты там мобилу обронил»
UFO just landed and posted this here
Тематический портал… срач по поводу версии винтовки. 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()
Вообще то это SDK а не исходники игры.
Исходники Doom 3 выложат после выхода RAGE. В октябре.
Извиняюсь, немного поторопился.
У меня лежат исходники Doom'а под названием linuxdoom. Судя по внутренностям, это самые натуральные исходники самого натурального Doom'a, открытые когда-то давно. Копирайты соответствующие. Сейчас скачал предложенные исходники, пусть будет много версий, хороших и разных.
Зачем они Вам? Внукам показывать? ;)
Да нет, что вы. :) Внукам я сам Doom покажу, а исходники меня интересуют исключительно с программистской точки зрения. Не только just for fun, но и самообразование. В общем, мне интересно их устройство. Понимаете, в вакууме Сети много сферических исходников самых разнообразных программ. Их можно изучать, а некоторые — даже нужно, только удовольствия бывает маловато. Другое дело, когда изучаешь исходники того, что давно живет в сердце (Doom), — чувство удивительное просто.
Это очень хорошее ревью.
Столько мусора запаковали и ncb файл(благодаря которому размер исходников вульфа в 5 раз вырос), и svn-вские файлики…
Интересно. Doom для iOS занимает 113 Мб.
Помнится оригинальный Doom на нескольких дискетах умещался.
Самое простое объяснение, приходящее в голову: есть ли в iOS поддержка midi? Т.е. в каком формате там музыка например?
А пройдитесь архиватором по iOS-игре. Возможно, и поместится на несколько дискет — наверняка поленились запаковывать ресурсы.
Там вся музыка в mp3. +Звуки в 22kHz 16bit (в оригинальном думе 11kHz 8bit)
Sign up to leave a comment.

Articles