Комментарии 74
This source release does not contain any game data, the game data remains subject to the original EULA and applicable law.
Хм… Что впрочем и не удивительно
0
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 вызов функции в секунду — это разве критично на фоне того, сколько ресурсов тратится на сообственно проигрывание этой функции? Я, конечно, в Си не особо силён, но всё-таки интересно услышать аргументы по этому поводу.
+11
Возможно этот код сгенерировал какой-нибудь софт, в котором они делали модели.
+31
иногда не стоит переделывать то что и так работает…
+6
А почему бы и нет? Я в исходники не заглядывал, но подозреваю что Sound_StartSound — какая-то универсальная функция для работы со звуком, которая в различных ситуациях может принимать различные аргументы. Видимо, так уж получилось что в wolf_actor_ai.c все эти аргументы были одинаковы. Чтож в этом плохого-то? Зачем городить какую-то промежуточную прослойку? А если они могли поменяться? Вдруг на en_death было бы решено поставить не ATTN_NORM а что-нибудь другое? Добавлять в промежуточный Play_Sound еще одино значение? Можно конечно, но зачем?..
Повторюсь, в исходники я не заглядывал, просто высказал свое предположение :)
Повторюсь, в исходники я не заглядывал, просто высказал свое предположение :)
+4
В этом как раз скрытый смысл уменьшения дублирования: если мы можем все завернуть в функцию PlaySound, значит, эти звуки примерно одинаковы, одинаково выполняются — это важная метаинформация разработчику, которая не всегда осознанно выполняется. И если для какого-то звука нужно будет поменять какое-то значение аргумента, это будет не просто так — условно, вместо CHAN_VOICE будет CHAN_MUSIC, и тогда мы сделаем функции PlayVoice / PlayMusic — опять же все гораздо понятнее.
А когда все делается через одну универсальную функцию с большим количеством аргументов (не говоря про «magic numbers»), вся эта логика скрывается за кодом, и приходится ее же вычислять в уме.
А когда все делается через одну универсальную функцию с большим количеством аргументов (не говоря про «magic numbers»), вся эта логика скрывается за кодом, и приходится ее же вычислять в уме.
+1
Это сейчас легко рассуждать. А в то время языки 90-х вели себя крайне странно, и порой впадали в метафизику.
Из вашего примера, вполне возможно, что оптимизированный вариант как раз переставал работать после третьего раза. Нечто с похожим я встречался в 90-х и никто из профи не мог мне дать внятный ответ.
В моем случае, был вариант подключения к графической карте. В учебниках рекомендовали оптимизированный вариант из одной строки. На деле он срабатывал через раз. Опытным путем я пришел к выводу, что код из 5 строк является надежным и всегда его использовал. Чем вызывал удивление у тех, кто видел мой код.
Из вашего примера, вполне возможно, что оптимизированный вариант как раз переставал работать после третьего раза. Нечто с похожим я встречался в 90-х и никто из профи не мог мне дать внятный ответ.
В моем случае, был вариант подключения к графической карте. В учебниках рекомендовали оптимизированный вариант из одной строки. На деле он срабатывал через раз. Опытным путем я пришел к выводу, что код из 5 строк является надежным и всегда его использовал. Чем вызывал удивление у тех, кто видел мой код.
0
Оправданий нет. Просто Copy/Paste :)
+1
Предложите свой вариант реализации без copy/paste. Вам нужно сделать ф-ю, которая проигрывает нужный звук по его id (enum).
0
Табличку (массив) сделать не судьба?
+4
Компилятор сделает табличку. Но согласен, что выглядит некрасиво.
0
У этого варианта тоже есть минусы. Если сделать массив, то нужно будет всегда следить, чтобы индексы не съехали (чтобы кто-то в центр значений enum или наоборот в массив не вставил новое значение например). Можно сделать и массив структур/хеш, но нужно будет реализовывать/использовать поиск, что может подойти для офисного приложения, но неоптимально для игры. Ну и кол-во строк остается практически то же самое. Учитывая остальные минусы, не ясно, чем это лучше. Хотя, конечно, это вариант без copy/paste :)
0
Всё там отлично с индексами enum'ов, надо просто знать язык, на котором пишешь, а не как обычно. Пример без всяких извращённых поисков и хэшей, не имеющий проблем с модификацией enum'а:
Это тот же самый язык Си, если что.
enum myenum {
value_a,
value_b
};
char *myvalues[] = {
[value_a] = "123",
[value_b] = "456"
}
Это тот же самый язык Си, если что.
0
Даже если использовать не C99, а старый добрый C89, то вопрос на корню решается функцией инициализации на три строчки:
И как бы всё. Дальше init преобразуется в init_array_cache(mypair_t *ptr, char *cache) и пишется:
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);
+1
Хотя корректнее в цикле там будет проверять не индекс, а source[i].path != NULL. Это я спросони ступил, прошу прощения.
0
НЛО прилетело и опубликовало эту надпись здесь
char* soundFile = dbSounds[id]; // en_mecha, en_hitler, etc
PlaySound( soundFile );
0
Да даже если оптимизировали, можно было хотя бы макросами заменить.
+4
Видимо именно говнокод, оправданий нет, но, возможно, писал кто-то из новичков и так и пропустили, не исправляя, раз работает нормально.
0
Капец!
Мэппинг туда так и просится.
Мэппинг туда так и просится.
0
на N900 это бесплатно =)
+1
интересно, что использованная gpl2+ не совместима с эппловскими правилами и продавать или выкладывать в магазине приложений имеют право только владельцы кода. в общем-то, довольно справедливо
0
Почему у фашиста на обложке Wolfenstein 3D в руках M16 интересно)
+11
Вы раскрыли всю подноготную американцев! :)
+2
Хах… id Software толсто тролит
+1
M16A2
0
А вот граната (у фашиста на заднем плане) похожа на немецкую Stielhandgranate.
ЗЫ ну и куда же без американских джинсов
ЗЫ ну и куда же без американских джинсов
0
НЛО прилетело и опубликовало эту надпись здесь
Интересно, а WADы от десктопного дума пойдут?
+1
А кто там на заднем плане рукой машет на картинке «DOOM»?
+1
Тематический портал… срач по поводу версии винтовки. Fuck yeah.
+35
Вот интересно, тут недавно писали что размашистые и подробные комментарии это признак новичка в программировании, а тут код откомментирован по самое нехочу чем то вроде этого:
Это что то говорит о качестве программистов в ID?
// 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?
0
Вообще-то на комменты код скупноват. Иногда встречаются, но я бы не сказал, что он серьёзно закомментирован.
+1
В комментарии написано не как сделано, а почему. Так что все ок
+6
Не надо обобщать :) Размашистые коментарии могут также говорить о том, что код специально готовили для ознакомления людьми разного профессионального уровня. Вполне возможно, что перед открытием они как раз и провели такую «комментизацию» и, возможно, рефакторинг.
0
комментарий новичка
a += 4; // к переменной а добавляем 4
комментарий профессионала
i = 0x5f3759df — (i >> 1); //первое приближение 1/sqrt()
a += 4; // к переменной а добавляем 4
комментарий профессионала
i = 0x5f3759df — (i >> 1); //первое приближение 1/sqrt()
+12
Господа, вы забыли, что с недавних пор на ftp.idsoftware.com/idstuff/doom3/source/ давно лежат исходники Doom3. и поверьте, там код не менее странен.
0
У меня лежат исходники Doom'а под названием linuxdoom. Судя по внутренностям, это самые натуральные исходники самого натурального Doom'a, открытые когда-то давно. Копирайты соответствующие. Сейчас скачал предложенные исходники, пусть будет много версий, хороших и разных.
0
Зачем они Вам? Внукам показывать? ;)
+1
Да нет, что вы. :) Внукам я сам Doom покажу, а исходники меня интересуют исключительно с программистской точки зрения. Не только just for fun, но и самообразование. В общем, мне интересно их устройство. Понимаете, в вакууме Сети много сферических исходников самых разнообразных программ. Их можно изучать, а некоторые — даже нужно, только удовольствия бывает маловато. Другое дело, когда изучаешь исходники того, что давно живет в сердце (Doom), — чувство удивительное просто.
+1
Ну вот они все тут общедоступные ftp.idsoftware.com/idstuff/source/
+2
Не знаю, что там нового открыли, но читал исходники Doom еще год назад, как минимум. Вот неплохое ревью: fabiensanglard.net/doomIphone/index.php
+3
Столько мусора запаковали и ncb файл(благодаря которому размер исходников вульфа в 5 раз вырос), и svn-вские файлики…
0
Интересно. Doom для iOS занимает 113 Мб.
Помнится оригинальный Doom на нескольких дискетах умещался.
Помнится оригинальный Doom на нескольких дискетах умещался.
+2
Самое простое объяснение, приходящее в голову: есть ли в iOS поддержка midi? Т.е. в каком формате там музыка например?
0
А пройдитесь архиватором по iOS-игре. Возможно, и поместится на несколько дискет — наверняка поленились запаковывать ресурсы.
0
Там вся музыка в mp3. +Звуки в 22kHz 16bit (в оригинальном думе 11kHz 8bit)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
DOOM Classic и Wolfenstein 3D в исходниках