HLFX.Ru Forum
Показать все 48 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- Random numbers generator (https://hlfx.ru/forum/showthread.php?threadid=4247)


Отправлено XaeroX 19-01-2014 в 14:30:

Random numbers generator

Собственно, генератор в волатиле, наговнянный по-быстрому и основанный на rand(), меня не устраивает, потому что он не портабельный и в разных компиляторах ведёт себя по-разному, да и длина серии rand() оставляет желать лучшего.
В ку3, скажем, используется очень просто линейный конгруэнтный метод (ЛКМ), что считается предсказуемым и вообще плохим. (rand, кстати, тоже обычно ЛКМ, хотя это остаётся на усмотрение автора библиотеки CRT/LIBC).

Единственный известный мне нормальный альтернативный генератор - в Xash3D - это по сути генератор из сорцов бетки хл2 (c перебитым копирайтом...). Мне даже удалось узнать, что автор генератора из бетки - и вовсе не Valve, а товарищи Press и Teukolsky, а Valve внесла кое-какие модификации косметической формы. Алгоритм также опубликован в Numeric Recipes (NR) (возвращаясь к копирайтам в ксаше - атата, Дядя Миша, у Numeric Recipes очень анальная лицензия!) Но пока не могу найти оригинальную статью (может, у кого есть?)

Цитата:
W.H. Press, S.A. Teukolsky "Portable random number generators" // Comput. Phys. - 1992. - V. 6. - N 5. - P. 522-524.

Я нашёл работу, которая развивает их идеи (Marsaglia, Zaman, 1994), но хотелось бы докопаться до оригинала.
А просто так юзать код из этой статьи не хочу именно из-за анальности NR (к коей он и привязан). В общем, нужны оригинальные статьи, на которые будут ссылки, а не NR.

Собственно, вопросы такие:
1) Чем плох ЛКМ, помимо предсказуемости (ок, это важно для сетевой шифровки, где генерится ключ, но в основном в игровом процессе - не особо)?
2) Используете ли вы Монте-Карло?
3) Вне зависимости от ответа на вопрос 2, какой генератор псевдослучайных чисел используете вы и почему?

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 14:39:

это только про игры, или вообще в программах?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 14:46:

Да без разницы -- я занимаюсь и волатилой, и молекулярной динамикой параллельно, вы же знаете.
Но всё же желательно быстрый.

Добавлено 19-01-2014 в 21:45:

Да, кстати, речь только о uniform-генераторах.

Добавлено 19-01-2014 в 21:46:

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

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 14:53:

XaeroX

ну я у себя его просто rand() подобным образом переиницализирую. а монтекарло у меня для расчёта столкновений частиц между собой.

>молекулярной динамикой
оно ж, кстати, очень близко к PiC, только в твоём случае, насколько я помню, частица действует только на ближайших соседей, а в PiC -- на весь коллектив.

у тебя двухмерная или трёхмерная геометрия? как сортируешь частицы/дефрагментируешь массив, на каждом шаге?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 14:56:

Цитата:
thambs писал:
частица действует только на ближайших соседей

Ближайшие соседи явно, остальное аппроксимируется, угу.
Цитата:
thambs писал:
у тебя двухмерная или трёхмерная геометрия? как сортируешь частицы/дефрагментируешь массив, на каждом шаге?

Трёхмерная. Кол-во частиц постоянно (NTP-ансамбль).
Да это не важно, мне сейчас конкретно для волатилы надо, я просто сразу пишу код с учётом того, что он может понадобиться в "серьёзных проектах", где принято цитировать источники.

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 15:01:

>(NTP-ансамбль).
эт. что то из биологии. а можешь примерно назвать сколько по порядку частиц в системе, и размеры сетки?
>остальное аппроксимируется, угу.
ур-ем пуассона?
>Кол-во частиц постоянно
граничные условия что ли периодические?
>Да это не важно
ну интересно ж про работу узнать

>как сортируешь частицы/дефрагментируешь массив
ну я к тому, как ты различаешь ближние и дальние. или просто хранишь отдельный массив с индексами вместо пересортировки? а сколько Мб/Гб занимает вся функция распределения?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 15:14:

Цитата:
thambs писал:
а можешь примерно назвать сколько по порядку частиц в системе, и размеры сетки?

Порядок 10^4-10^5, больше требуется крайне редко (число атомов в глобулярном белке - порядка нескольких тысяч, вот если явный растворитель - ситуация меняется).
Цитата:
thambs писал:
ур-ем пуассона?

Хе-хе, если бы. По-разному. Если без явной воды - то generalized Born обычно.
Цитата:
thambs писал:
граничные условия что ли периодические?

Пока нет, т.к. растворитель неявный.
С явным буду делать периодические, и вместо аппроксимации - суммирование по Эвальду, это стандарт, в общем-то, уже пару-тройку десятков лет.
Цитата:
thambs писал:
ну я к тому, как ты различаешь ближние и дальние.

Они редко обновляются, так как в МД (биологической, по крайней мере) нет быстрых и резких переходов. STL-контейнеров пока хватает, как я уже сказал, размеры системы невелики.
В МД рандомы нужны для начальных скоростей и прочих стартовых корректив для преодоления локальных энергетических барьеров, а к Монте-Карло я так, пока присматриваюсь.

Добавлено 19-01-2014 в 22:14:

Цитата:
thambs писал:
эт. что то из биологии.

изобарно-изотермический ансамбль

__________________

xaerox on Vivino


Отправлено Дядя Миша 19-01-2014 в 15:27:

Цитата:
XaeroX писал:
Дядя Миша, у Numeric Recipes очень анальная лицензия!)

Да на здоровье же

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено fire64 19-01-2014 в 15:36:

http://habrahabr.ru/post/133320/

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено XaeroX 19-01-2014 в 15:43:

fire64
Аппаратную часть прилагать к каждой копии ОИФД/Вольфрама, или предлагать покупать отдельно за $9.99 без учёта стоимости доставки?

__________________

xaerox on Vivino


Отправлено fire64 19-01-2014 в 15:54:

Цитата:
XaeroX писал:
Аппаратную часть прилагать к каждой копии ОИФД/Вольфрама, или предлагать покупать отдельно за $9.99 без учёта стоимости доставки?


1С с USB ключами же продают, там почему бы и ОИФД/Вольфрама не продавать с генератором шума

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено XaeroX 19-01-2014 в 15:56:

А что там с "/dev/urandom"? Как я понял, тоже имеет аппаратную природу? Под виндой аналог есть, какая-нибудь винапишная функция?

Добавлено 19-01-2014 в 22:56:

Цитата:
fire64 писал:
почему бы и ОИФД/Вольфрама не продавать с генератором шума

Проблема главным образом в том, что ОИФД и Вольфрам сами по себе игры бесплатные. А то бы оно конечно да.

__________________

xaerox on Vivino


Отправлено Дядя Миша 19-01-2014 в 16:42:

XaeroX бери из system32 любой файл и читай первые четыре символа, затем читай еще один файл, и вычитай один инт из другого.
Получившееся число врапом используй для открытия третьего файла в папке system32, читай оттуда raw дату, сложив два предидущих инта (тоже с врапом, чтоб не вылезти за размер файла) - будет тебе полурандом
Номера первого и второго файла можно например вычислить из текущей даты и текущего времени. (это для первого раза). А потом прибавлять к ним те самые смещения, которые случайно прочлись из того или иного файла.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 19-01-2014 в 17:14:

Дядя Миша
Это вариант линейного конгруэнтного генератора, только в тыщу раз медленнее за счёт доступа к файлам.

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 17:17:

XaeroX

/dev/urandom не такой хаотичный как /dev/random, но последний медленнее.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 17:22:

thambs
Что понимается под "хаотичностью"? Неравномерность распределения случайной величины?

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 17:33:

XaeroX

/dev/random собирает шум железа в текущий момент, /dev/urandom берёт шум из хранилища. поэтому, если шум там закончится, то то возможны повторы.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 18:20:

А, виноват, перепутал.
Хранилище это как создаётся, всё тем же /dev/random-ом? Ограничение по сути только на длину серии (у рандома ограничения нет)?

__________________

xaerox on Vivino


Отправлено thambs 19-01-2014 в 18:29:

>Хранилище это как создаётся

не отвечу -- не знаю.

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 19-01-2014 в 18:34:

В любом случае не важно, мне нужны только портируемые решения.

__________________

xaerox on Vivino


Отправлено FreeSlave 19-01-2014 в 18:43:

В бусте этих рандом-генераторов целый вагон. И всё портабельно и под разрешительную лицензию. Они, кстати, тоже отсылают к NR в введении.


Отправлено XaeroX 19-01-2014 в 19:06:

Цитата:
FreeSlave писал:
В бусте этих рандом-генераторов целый вагон.

Не подключать же буст ради рандома?
Цитата:
FreeSlave писал:
под разрешительную лицензию. Они, кстати, тоже отсылают к NR в введении.

Т.е. они нарушили лицензию NR, да ещё и неявно сообщили всем об этом?
Что за беспредел творится?

__________________

xaerox on Vivino


Отправлено nemyax 19-01-2014 в 19:19:

Цитата:
XaeroX писал:
Не подключать же буст ради рандома?

Буст можно подключать частями.


Отправлено FreeSlave 19-01-2014 в 19:21:

XaeroX, отсылают - мол, изучайте, "For a general introduction to random numbers in numerics". На чём их либа основана, я не знаю. И весь буст никто не заставляет тащить. Хотя там у рандома зависимости от других либ имеются, но их количество от конкретного случая зависит. Утаскиваешь ровно столько, сколько нужно и доволен, и даже компилять ничего не надо - всё в хидерах. Но я вообще к тому, что можно подсмотреть реализацию и не бояться анальной кары.


Отправлено Дядя Миша 19-01-2014 в 19:24:

Цитата:
XaeroX писал:
Это вариант линейного конгруэнтного генератора, только в тыщу раз медленнее за счёт доступа к файлам.

зато аппаратный

Добавлено 19-01-2014 в 23:24:

Цитата:
thambs писал:
/dev/random собирает шум железа в текущий момент, /dev/urandom берёт шум из хранилища

А я всегда считал, что dev\random - это signed шум, а dev\urandom - unsigned шум

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено ~ X ~ 19-01-2014 в 19:32:

shoom();

к рандому оч серьёзно относится трукрипт и мегауплод. не зря там заставляют совершать развратные движения мышью. Там ребята решили просто: в машине случайным быть не может ничего. Сраные ТПМки юзать - прогнуться под ФБР и АНБ. Можно сэмплить шум с микрофона

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Scrama 19-01-2014 в 23:21:

Цитата:
XaeroX писал:
Не подключать же буст ради рандома?
Из буста можно копипастить.

Для игры я бы забил, для твоей биологии, очевидно, нужны вполне грамотные генераторы с определенными распределениями, ради которых и в анальные лицензии не грех вникнуть.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено XaeroX 19-01-2014 в 23:30:

Цитата:
Scrama писал:
Для игры я бы забил

В каком смысле - забил?

Добавлено 20-01-2014 в 06:30:

Цитата:
Scrama писал:
Из буста можно копипастить.

В теории - да. А ты на практике пробовал?

__________________

xaerox on Vivino


Отправлено Scrama 20-01-2014 в 08:07:

Цитата:
XaeroX писал:
В каком смысле - забил?

Использовал бы простейший доступный вариант. Не перебор из массива конечно, но что-нибудь от системного таймера вполне ок.

Цитата:
XaeroX писал:
В теории - да. А ты на практике пробовал?
Да.

__________________
"Злобным гениям не нужна харизма." © Shooter__Andy
"Making stuff for an "old ugly game" can be ten times more fun than grinding on a map for a dull, next-gen title." © Lunaran


Отправлено XaeroX 20-01-2014 в 09:34:

Цитата:
Scrama писал:
Да.

А я вот нахожу копипастинг из буста невозможным принципиально из-за функциональной парадигмы, внедрённой в каждый его закуток, и огромном количестве взаимных связей. С удовольствием бы посмотрел мастер-класс "как копипастить из буста", не запишешь видео?
Всё, что мне удавалось - очистить буст от ненужных для конкретных фич файлов, когда я делал облегченную сборку для луабинда.

__________________

xaerox on Vivino


Отправлено Crystallize 20-01-2014 в 13:00:

http://qrng.anu.edu.au


Отправлено XaeroX 20-01-2014 в 13:09:

В общем, я сконструировал свой конгруэнтный генератор на основе мултипликативного и AWC-генератора. Он немного быстрее и немного чотче хл2шного, а главное - никаких копирайтов, можно вешать свой. Шутко. На самом деле главное - это период. У бетковского он 2^32, а у меня 2^32*2^58=2^90. Серии должны быть гораздо длиннее. Осталось его как следует потестить. И я не совсем уверен в правильности выбора стартовых семечек, возможно, этот момент можно сделать лучше.
Если кому интересно - могу выложить с пояснениями.

__________________

xaerox on Vivino


Отправлено Government-Man 20-01-2014 в 14:01:

Цитата:
XaeroX писал:
Если кому интересно - могу выложить с пояснениями.


Интересно, выкладывай. Я раньше интересовался генерацией псевдослучайных чисел.


Отправлено XaeroX 20-01-2014 в 14:17:

Цитата:
Government-Man писал:
Я раньше интересовался генерацией псевдослучайных чисел.

А чего перестал?

Добавлено 20-01-2014 в 21:17:

Government-Man
А у тебя статьи случаем нет, что я в первом посте упомянул? Раз интересовался, то наверняка же читал что-то по теме?

__________________

xaerox on Vivino


Отправлено Дядя Миша 20-01-2014 в 14:58:

XaeroX он предиктабельный у тебя? seed поддерживает?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 20-01-2014 в 15:12:

Цитата:
Дядя Миша писал:
он предиктабельный у тебя?

Что ты понимаешь под "предиктабельным"?
Цитата:
Дядя Миша писал:
seed поддерживает?

Ему три сида надо, я их делаю из одного (time(NULL)) путём прогона через вариант мультипликативного генератора, и вот не совсем уверен, нормально ли это. Впрочем, сиды мало на что влияют, распределение всегда вполне равномерное.

__________________

xaerox on Vivino


Отправлено Government-Man 20-01-2014 в 15:39:

Цитата:
XaeroX писал:
А чего перестал?


Я не перестал, просто в свое время читал какие-то статьи по теме, но в итоге решил не заморачиваться и свою имплементацию пока не писать, а просто поставил заглушку с rand() - для игрушек хватает, для более серьезных проектов придется переписывать конечно.

Цитата:
XaeroX писал:
А у тебя статьи случаем нет, что я в первом посте упомянул? Раз интересовался, то наверняка же читал что-то по теме?


Читал да, но искомой статьи не припомню. У меня были какие-то статьи в PDF, надо бы глянуть. Ну я Кнута еще читал, но там как-раз про ЛКМ.


Отправлено XaeroX 20-01-2014 в 16:51:

Ну что ж, вот мой генератор

C++ Source Code:
1
// Random generator, author: XaeroX, 2014
2
// Part of Volatile3D II Engine source code
3
// Code license:
4
// Creative Commons Attribution-Noncommercial-Share Alike
5
// http://creativecommons.org/licenses/by-nc-sa/4.0/
6
 
7
// could be local statics, but we reference them
8
// in two subroutines: srand and rand
9
// the initial values are arbitrary unsigned ints
10
static unsigned int awc0 = 0xf6a3d9;
11
static unsigned int awc1 = 0x159a55e5;
12
static unsigned int mult = 0x436cbae9;
13
static unsigned int carry = 1;
14
 
15
void xrxSRand( unsigned int seed )
16
{
17
  // default seed comes from system timers
18
    if ( !seed ) seed = ( unsigned int )time( NULL );
19
 
20
  // initialize AWC and multiplicative seeds
21
  awc0 = 0x10dcd * seed + 0xf6a3d9;
22
  awc1 = 0x10dcd * seed + 0x159a55e5;
23
  mult = seed & 0x7fffffff;
24
 
25
  // carry flag initial value depends on awc seeds
26
  carry = ( awc0 > awc1 ) ? 0 : 1;
27
}
28
 
29
unsigned int xrxRand( void )
30
{
31
  // run AWC-generator
32
  unsigned int awc = awc1 + ( awc0 + carry );
33
  carry = ( awc > awc0 ) ? 0 : 1;
34
  awc1 = awc0; awc0 = awc;
35
 
36
  // run multiplicative generator
37
  mult = 0x10dcd * mult + 0x3c6ef373;
38
 
39
  // return random value
40
  return awc + mult;
41
}
42
 
43
int Com_RandomLong( int low, int high )
44
{
45
  static bool init = false;
46
  unsigned int randNumber;
47
  unsigned int randRange = high - low + 1;
48
 
49
  assert( high >= low );
50
 
51
  if ( randRange <= 1 )
52
    return low;
53
 
54
  if ( !init ) {
55
    xrxSRand( 0 );
56
    init = true;
57
  }
58
 
59
  // remapping to desired range keeping random value uniformly distributed
60
  unsigned int maxAcceptable = 0xfffffffe - ( 0xffffffff % randRange );
61
  do randNumber = xrxRand(); while ( randNumber > maxAcceptable );
62
 
63
  return low + ( randNumber % randRange );
64
}
65
 
66
float Com_RandomFloat( float low, float high )
67
{
68
  static bool init = false;
69
  float randNumber;
70
  float randRange = high - low;
71
 
72
  assert( high >= low );
73
 
74
  if ( randRange <= 0 )
75
    return low;
76
 
77
  if ( !init ) {
78
    xrxSRand( 0 );
79
    init = true;
80
  }
81
 
82
  randNumber = 0.2328306437e-9f * xrxRand();
83
  return low + randNumber * randRange;
84
}


Из комментариев должно быть понятно, что и как работает.
Этот генератор примерно на 7% быстрее хл2шного (мелочи, ок) и более чем в 2 раза быстрее CRT-шного rand().
Но код, полагаю, намного понятнее и читабельнее.
Если что, задавайте вопросы. Если что-то не работает, или заметили косяк/опечатку - сообщайте.
Извиняюсь за анальную лицензию, но мало ли кто этот код нагуглит... время нынче непростое.
Потом, когда волатила станет GPL, этот код тоже будет GPL, а пока вот так.

__________________

xaerox on Vivino


Отправлено Дядя Миша 20-01-2014 в 17:21:

Цитата:
XaeroX писал:
Что ты понимаешь под "предиктабельным"?

Очень просто, при одинаковом заданном диапазоне и совпадающем сиде всегда будет генерироваться одно и то же псевдослучайное число.
Для чего это нужно ты и сам знаешь - предиктинг випонсов, травку расставлять, да мало ли. Точнее тут смысл в том даже, что не просто одинаковое случайное число. Одна и та же последовательность случайных чисел. Это важнейшее свойство любого генератора такого типа.
Цитата:
XaeroX писал:
Ну что ж, вот мой генератор

А RandomFloat?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'


Отправлено XaeroX 20-01-2014 в 19:01:

Цитата:
Дядя Миша писал:
Очень просто, при одинаковом заданном диапазоне и совпадающем сиде всегда будет генерироваться одно и то же псевдослучайное число.

Ну это само собой.
Цитата:
Дядя Миша писал:
Для чего это нужно ты и сам знаешь

Знаю, в волатиле юзается предиктабельный рандом.
Я просто подумал, что это какой-то математический термин.
Цитата:
Дядя Миша писал:
А RandomFloat?

Пока не написал.
Позже будет. Он всё равно основывается на этой же функции.

Добавлено 21-01-2014 в 02:01:

Ага, дописал RandomFloat, обновил пост.
Она, кстати, немного медленнее, чем хл2шная (примерно на те же 7%, причём загадка, из-за чего, видимо, компилятор чудит при генерации кода), но всё равно быстрее rand().

__________________

xaerox on Vivino


Отправлено Government-Man 17-04-2014 в 10:14:

Кстати в C++11 появилась отличная библиотека <random> с кучей алгоритмов и распределений (и возможностью подключать свои), собственно там весьма винрарный вихрь мерсенна идет из коробки.

Производительность только надо б замерить, но мне чет лень.


Отправлено XaeroX 17-04-2014 в 10:27:

Цитата:
Government-Man писал:
C++11

Его кто-то использует?

__________________

xaerox on Vivino


Отправлено Government-Man 17-04-2014 в 10:34:

Цитата:
XaeroX писал:
Его кто-то использует?


А то!


Отправлено thambs 26-05-2016 в 21:12:

Извиняюсь за поднятие старой темы. А как сослаться на http://hlfx.ru/forum/showthread.php...1218#post131218 если я хочу использовать эту имплементацию?

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 27-05-2016 в 04:31:

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

Цитата:
Press, W. H. and S. A. Teukolsky (1992). "Portable Random Number Generators." Comput. Phys. 6(5): 522-524.
Marsaglia, G. and A. Zaman (1994). "Some portable very-long-period random number generators." Comput. Phys. 8(1): 117-121.

Могу дать pdf-ки, если нужно.


Отправлено thambs 27-05-2016 в 16:49:

XaeroX
да, буду признателен.
>Его кто-то использует?
там мегафича http://en.cppreference.com/w/cpp/keyword/thread_local

__________________
http://www.moddb.com/mods/monorail-quest


Отправлено XaeroX 27-05-2016 в 19:01:

thambs
Держи: http://rgho.st/8lvfWq5pm


Отправлено thambs 27-05-2016 в 19:20:

thx.

__________________
http://www.moddb.com/mods/monorail-quest


Временная зона GMT. Текущее время 04:47.
Показать все 48 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024