>>351243
Так, падажжи ебана, это получается они тупо проходили по таблице с случайными числами? Ебануться. Хотя это я сейчас умный с интернетами и гуглом с алгоритмами случайных чисел, а ребята танцевали как умели.
>К своему глубочайшему стыду, я нихуя не знаю, что будет в prndindex после prndindex = (prndindex+1)&0xff;
Увеличить на единицу и оставить восемь младших бит, чтобы не выйти за пределы массива.
Есть еще что-то интересное?
>>351247
Ну да, просто проходили по таблице, причём она задана заранее
>оставить восемь младших бит
да, спасибо. На СО так же говорят
http://stackoverflow.com/questions/6126439/what-does-0xff-do
>Есть еще что-то интересное?
Сырцы сюда положил, читаю
http://rghost.ru/54998807
>>351251
>Сырцы сюда положил
Но зачем?
https://github.com/id-Software/DOOM
>>351254
не помнил, откуда взял
спасибо за ссылку
В D_DoomMain (void) идет разбор параметров (аргументов), с которыми могла быть запущена игра (-nomonsters, -deathmatch итд)
Один из параметров - запуск игры с CD, судя по всему
Интересно, как такое работало на Linux
if (M_CheckParm("-cdrom"))
{
printf(D_CDROM);
mkdir("c:\\doomdata",0);
strcpy (basedefault,"c:/doomdata/default.cfg");
}
>>351255
Создастся директория "c:\\doomdata" в home, только что проверил. Правда, получить доступ к ней можно лишь с экранированием.
Весь сюжет игры содержится в d_engilsh.h
Весь сюжет игры на французском - в d_french.h
Блджад, это охуенно
#define C4TEXT "LE VISAGE HORRIBLE D'UN DEMON D'UNE\n"\
"TAILLE INCROYABLE S'EFFONDRE DEVANT\n"\
"VOUS LORSQUE VOUS TIREZ UNE SALVE DE\n"\
"ROQUETTES DANS SON CERVEAU. LE MONSTRE\n"\
"SE RATATINE, SES MEMBRES DECHIQUETES\n"\
"SE REPANDANT SUR DES CENTAINES DE\n"\
"KILOMETRES A LA SURFACE DE L'ENFER.\n"\
"\n"\
"VOUS AVEZ REUSSI. L'INVASION N'AURA.\n"\
"PAS LIEU. LA TERRE EST SAUVEE. L'ENFER\n"\
"EST ANEANTI. EN VOUS DEMANDANT OU IRONT\n"\
"MAINTENANT LES DAMNES, VOUS ESSUYEZ\n"\
"VOTRE FRONT COUVERT DE SUEUR ET REPARTEZ\n"\
"VERS LA TERRE. SA RECONSTRUCTION SERA\n"\
"BEAUCOUP PLUS DROLE QUE SA DESTRUCTION.\n"
>>351256
Как я понял, чему-то с диска нужна эта директория и конфиг, лежащий в ней.
На диске тогда вроде только музыка лежала
Мне просто показалось, что это достаточно костыльно для id Software
ВТОРОЙ БМАП
ОП, доложи о результатах исследования.
>>351257
Забавно, что 29-й уровень, про который ты закопипастил, называется The Living End - как мой любимый gay movie. "Ты приклеишься к стулу", - гласит постер.
>>351243
> Ведь можно просто взять последние три цифры текущего времени
И что опрашивать системный таймер каждый раз когда нужно? Упоротый? Проще через опр колл раз узнать что игрок нажмёт, в право или в лево. Там кстати не так? И счётчика тактов тогда ещё не было.
>>354420
Мамкин ынтерпрайз-программист смеется над вашими проблемами оптимизации.
>>351243
> Ведь можно просто взять последние три цифры текущего времени
Я подозреваю, в древних компьютерах таймер тикал в несколько тысяч раз медленнее чем процессор (здесь же есть любители ассемблера под дос, они должны знать) и генератор получился бы не очень рандомным, мягко говоря.
ОП, доложи о результатах исследования.
>>351243
Олдфаг в треде. Не все понимают, что такое Doom. Там было все адски оптимизированно. Это была РЕВОЛЮЦИОННАЯ по графону игра, которая игралась на 80386 c 30MHz, без сопроцессора и и без платы видеокарты. Парни из idSoftware раскрыли целиком потенциал i386. Конкуренты запилят сравнимое только года через 3, когда id выпустит свой слепящий вин Quake.
> Неужели в Си не было генератора случайных чисел?
Нет. Все разрабы компиляторов делали его как бог на душу положит. И типичный генератор, как правило, был медленный. Требовал умножения и пару сдвигов.
> Почему в массиве числа раскиданы не по порядку?
Ты не понимаешь, что такое случайная последовательность?
> Ведь можно просто взять последние три цифры текущего времени
Таймера, с которого можно было быстро взять число, тогда в компьютеры не клали. У всех типов IBM PC был только системный, который тикал 19 раз в секунду и был бесполезен для генерации рандома.
>>354949
А почему нельзя было на диск класть соль или часть последоательности?
В варианте, процитированном ОП-ом, у нас с каждым запуском повторяется последовательность - нехорошо как-то.
Я бы брал соль из файлика, тратил немножко времени во время загрузки на генераццию этого массива, а потом делал как они. Или с этим могут быть какие-то проблемы?
>>354954
>тратил немножко времени во время загрузки на генераццию этого массива,
Как бы ты его генерил рандомный массив без рандома то?
А это что, единственное интересное место в думе?
Остальное для ОПа слишком сложно :) А тут он придумал патч для дума...
>>354970
Ну, Кармак еще вроде говорил что while для пидаров и НИНУЖНО, но в исходниках по ссылкам он есть.
Есть такой сайт http://sql-ex.ru/ тут можно проходить тесты по SQL онлайн, выполнять задания, получать баллы итд. Есть аналог по C# ?
>>351243
>три цифры текущего времени
Нахуя? Пусть лучше делает ролл на дваче и берет последние три цифры номера поста.
А теперь подумай, насколько рандомные будут у тебя числа, если потребуется запросить сразу несколько подряд чисел в один момент времени. Подсказка: таймер имеет очень низкое разрешение, так что ты получиишь просто несколько одинаковых чисел.
А вообще такая хуита может быть задумана для быстрого получения случайных чисел, т.к. в то время быстрее было прочитать значение из памяти тогда даже кеш не везде стоял, ибо память имела относительно низкие задержки, чем считать какое-то там выражение. Это не криптография, сойдет и так.
>Пусть лучше делает ролл на дваче
У нас побелитель!
>>354991
Ах да, также стоит обратить внимание на котекст. Может он откуда-то вызывается, где так и надо.
Этот тред разочаровывает меня.
Так что теперь это АРХИВАТОРЫ ДЛЯ СВЕРХ-МАЛЕНЬКИХ ДАННЫХ-ТРЕД.
Обсуждаем эффективные по степени сжатия алгоритмы сжатия для данных размеров около 100 байт. Старые, забытые всеми, cравнение с современными deflate, lzo, snappy. Сейчас не могу вспомнить, слышал, что был какой-то легендарный компрессор от русскоязычного разработчика по-моему для спектрума, который правда был ориентирован на большие объемы в районе 1 Кб, но справлялся наудивление хорошо.
Исходники не смотрел, но есть подозрение, что это сделано специально для повторяемости псевдослучайной последовательности при проигрывании демок или сетевой игре, где ход игры от них зависит.
>>355034
Но это можно организовать и без LUT. Практически все ГПСЧ имеют seed.
>>351243
>Неужели в Си не было генератора случайных чисел?
Нормальный, вменяемый генератор псевдослучайных чисел пишется на коленке за несколько часов несколько минут.
Алгоритм прост до безобразия:
number = 1234567890
random = number * константное_простое_чило_1 % константное_простое_число_2
number = random
return random
Простые числа при этом должны быть по возможности далеки от степеней двойки. Первое простое число должно быть достаточно маленьким . Второе простое число должно быть достаточно большим. Чем оно больше, тем больше множество случайных чисел, которые могут быть сгенерированы.
>>354534
>таймер тикал в несколько тысяч раз медленнее чем процессор
Вот ты тупой, лол. Зачем тогда этот таймер нужен?
Как тогда отделять единички от нулей, если не с помощью тиков?
>>354972
> говорил что while НИНУЖНО
Подгони пруф.Но так то да
>>355069
Да хуй там что он тебе подгонит. Он даже сорцы дума не читал. Нашел рандом и теперь будет о нем говорить вечно.
>>355074
>var=val
>стейтфул
>ссут на ебало
Судишь по своему опыту?
>>355058
Во-первых, у тебя тут умножение, во-вторых, остаток от деления, в-третьих три присвоения, вместо одного.
>>355081
>у тебя
Чини детектор.
>умножение, остаток, присвоения
Блядь, и что? Причем тут потокобезопасность. Это во-первых. Во-вторых делать рэндом потокобезопасным просто тупо. Он в сферическом приложении создается внутри одного класса или даже метода. В первом случае, если класс задумывается как потокобезопасный, на него и ложится ответственность за эту безопасность. В остальных случаях это оверхед. Посчитай. У тебя в проге 3 потока, но 100500 объектов. Притом, что несколькими потоками используются <1% объектов с учетом вложенности (не считая stateless). Остальные действительно нужно делать потокобезопасными?
И что уж касается stateful. Да где ты вообще видел stateless-рэндом? Если в языке без ООП еще понятно, то если ООП есть, это всё равно что при наличии лопаты копать землю палкой. Я даже не могу придумать случая, когда рэндом нужен одновременно в двух потоках. Даже так, он по логике всё равно будет включен в какой-то другой класс.
И что самое главное!
Человек писал про алгоритм получения случайного числа на основе seed'а, а не структуру программы, и показал это естественно на псевдокоде. Каким же надо быть уебаном, чтобы придраться к структуре, которой в этом псевдокоде нет. Там просто написано, что значение random принимается, как следующий seed и как возвращаемое значение. Stateful-неStateful - это всё твоя больная фантазия, пост был не об этом.
>>355034
>это сделано специально для повторяемости псевдослучайной последовательности при проигрывании демок
Двачую
>>355056
Если использовать ГСПЧ от компилятора, получаем что траектория движения мостров будет зависеть от того, чем дум компилировали (точнее от реализации ГСПЧ). В итоге при перекомпиляции можем получить невалидные демки.
>>355104
Ебать, а не правильнее будет в демках хранить движения монстров? Террабайты данных?
>>355104
> Если использовать ГСПЧ от компилятора, получаем что траектория движения мостров будет зависеть от того, чем дум компилировали (точнее от реализации ГСПЧ). В итоге при перекомпиляции можем получить невалидные демки.
Поэтому в игорах и используют свои генераторы вместо rand() из libc. Вот зачем используют таблицу? Есть подозрение, что Кармак в 23 года тогда попросту не знал, как писать генераторы. Хотя это тоже странно, было полно libc с исходниками.
Я вижу в этом ITT-треде какой-то подвох.
>>355106
Нет. В демках, как правило, записываются только команды ввода от игрока, которые при проигрывании демок отсылаются от псевдо-клиента на игровой сервер. Вернее, хранится дельта для соседних команд. Это связано с тем, что возможность писать демки - следствие из наличия сетевой игры, для которой минимизируют размер передаваемых данных.
Пиздец, какие же дауны раньше были. Можно было хотя бы элементы кольца выводить. Вся суть уебков, не умеющих в математику.
https://ideone.com/so3yB4
Криптуй, погромач.
https://ideone.com/z4ljPe
https://ideone.com/ozmFAA
>>355262
>29 8 58 37 16 66 45 24 3 53 32 11 61 40 19 69 48 27 6 56 35 14 64 43 22 1 51
>30 9 59 38 17 67 46 25 4 54 33 12 62 41 20 70 49 28 7 57 36 15 65
>>351243
>Вот, например, простейшая генерация случайного числа
>Ведь можно просто взять последние три цифры текущего времени
Криптолог в треде, все в ФСБ
>>351243
А ты знаешь, что в современных шейдерных языках(hlsl, например) тоже нет RND?
Обычно туда подаётся текстура, целиком состоящая из случайных значений. Далее её сэмплят в случайной точке(например, некий сдвиг от текстурных координат) и получают случайное число. Способ очень похож на думовский, как я посмотрю.
>>355290
> исходники дума
> криптография
>>355297
Не скажу за шейдеры, но в том же опен_кл легко можно навелосипедить неплохой рнг, ничем не хуже чем цпу-шные.
Соль, разумеется, снаружи.
Я кстати однажды пробовал генерировать случайные числа при помощи системного времени в наносекундах в жабе.
В результате нихуя хорошего не получилось.
Три последние цифры наносекунд не обладают достаточной случайностью.
В результате последовательность случайных чисел получается очень хуевой. И работает это очень медленно.
Системное время годится только в качестве стартового значения для ГПСЧ, который работает очень даже хорошо и возвращает сотни милионов как бы случайных числе, перед тем как последовательность повторяется.
Впрочем одна из проблем ГПСЧ в том, что количество исходных seed-значений ограничено. Пусть последовательности и очень длинные, но seed довольно маленький, а это означает, что всего существует не так уж много разных последовательностей, которые можно сгенерировать.
Чем больше максимально возможный сид, тем больше существует последовательностей, которые можно сгенерировать.
Выражаясь математическим языком, идеальную во всех отношениях случайную последовательность можно получить при помощи ГСЧ только если использовать n-цифр в сиде, причем n стремится к бесконечности.
Впрочем не все так трагично как кажется, если использовать сиид размером всего в несколько киллобайт, то количество возможных случайных последовательностей становится довольно велико.
К сожеланию за раз такие числа посчитать не возможно.
>>355339
Это для каких целей тебе не хватает unix time? Что шифровать собрался?
Кстати, почему-то остался без внимания массивный гет — 1400000000, 13 мая 4:53:20.
>>355383
>проебали гет
Что ж ты молчал?
>>355339
>наносекунды в жабе
Умей читать.
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()
This method provides nanosecond precision, but not necessarily nanosecond accuracy.
>>354954
> А почему нельзя было на диск класть соль или часть последоательности?
> Я бы брал соль из файлика,
Потомучто ты живешь в уютном мирке, где всегда были процессоры с гигагерцевыми частотами, где деление, умножение, сложение стоят 1 такт и чтение из файла - какие-то наносекунды. Ещё раз укажу на существенное: Doom работает на процессоре с тактовой частотой 30MHz
Сап, /pr
Я решил прочитать исходники дума, для того, чтобы глубже окунуться в то, как писали код 20 лет назад, и многие моменты вызывают мои вопросы
Вот, например, простейшая генерация случайного числа:
Полная версия на пастбине: http://pastebin.com/RkCaRSbQ
unsigned char rndtable[256] = {
0, 8, 109, 220, 222, 241, 149, ... 249
};
int prndindex = 0;
int P_Random (void)
{
prndindex = (prndindex+1)&0xff;
return rndtable[prndindex];
}
Неужели в Си не было генератора случайных чисел? Зачем они написали свой?
Почему в массиве числа раскиданы не по порядку? Ведь он всё равно фиксированный, почему нельзя было просто их перечислить?
К своему глубочайшему стыду, я нихуя не знаю, что будет в prndindex после
prndindex = (prndindex+1)&0xff;
Но тем не менее, зачем такие сложности?
Ведь можно просто взять последние три цифры текущего времени