Elite Games - Свобода среди звезд!
.
  » C, С++ | страница 30
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 30 из 37
На страницу: Пред.  1, 2, 3 ... 29, 30, 31 ... 35, 36, 37  След.    Перейти:   Все страницы
Поиск в этой теме:
Железный канал: «C, С++»
Sh.Tac.
 145 EGP


Рейтинг канала: 1(2)
Репутация: 14
Сообщения: 1424

Зарегистрирован: 27.07.2005
AnrDaemon :
C какой целью ты рассчитываешь "точный размер отправляемого пакета"?

очевидно чтобы не засирать сеть мелкими пакетами Улыбка
есть writev() которое умеет из кусочков памяти собирать стрим

З.Ы. хотел ещё отметиться по предыдущей задаче, есть клёвый tool, называется ct-ng, в частности эпики юзают этот crosstoolchain в "канадском" варианте, когда на линухе собирается таргет для mingw который в свою очередь должен собирать таргет на линухе
_________________
This is what you get ...
(c) Radiohead

Последний раз редактировалось: Sh.Tac. (02:56 24-08-2014), всего редактировалось 1 раз
    Добавлено: 02:43 24-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Sh.Tac. :
есть клёвый tool, называется ct-ng


лучше make все равно ничего не придумали
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 03:11 24-08-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
ТехноМаг :
Content-Length уже дааавно не обязателен

Content-Length НИКОГДА не был обязателен. И сейчас он не обязателен, как и всегда.
Я тебе больше скажу - сейчас даже "Content-Transfer-Encoding: chunked" можно не указывать, так как подавляющим большинством браузеров она принимается по умолчанию.

ТехноМаг :
с картинкой-то понятно. Там размер сразу известен.

А вот с остальным текстовым уно черт поймет

Не поминай чёрта всуе.
Берёшь стандарт, читаешь. А там английским по серому написано, что от тебя требуется три вещи:
1. Посылать строки заголовка целыми пакетами.
2. Отправить правильную строку статуса.
3. Послать после заголовка пустую строку.
Дальше можешь делать что угодно. То есть вообще.
_________________
Люблю свободный полёт... :)

Последний раз редактировалось: AnrDaemon (03:11 24-08-2014), всего редактировалось 1 раз
    Добавлено: 03:11 24-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
AnrDaemon :
делать что угодно. То есть вообще.


ты это уже говорил, и я собсно уже таким магаром переписываю.

Пошел пингвинов размножать Гы-гы

AnrDaemon :
Не поминай чёрта всуе.

бытует мнение, что все зло вот в этих 3х строк:
#define MC_START 0x0A
#define MC_STOP 0x2C
#define MC_STAT 0x2A

а вообще 42 всем.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (03:32 24-08-2014), всего редактировалось 2 раз(а)
    Добавлено: 03:27 24-08-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
Замечательный инструмент Wireshark. Показывает всё самое интересное про общение в сети.
_________________
Люблю свободный полёт... :)
    Добавлено: 03:29 24-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
В общем все получилось, всем спасибо. Осталось только нормально POST научить обрабатывать (с Escape, я имею ввиду, но это не сложно)
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 12:20 26-08-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
Советую найти подходящую стандартную библиотеку и не морочиться.
_________________
Люблю свободный полёт... :)
    Добавлено: 13:06 26-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
AnrDaemon :
Советую найти подходящую стандартную библиотеку


ну под Си их кот наплакал, и как правило они тянут за собой туеву кучу зависимостей. Тут одно из условий заказа - скопировал, запустил, профит...

Да и поздно уже. Написал уже все что нужно...
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 13:33 26-08-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
Статическую линковку ещё никто не отменял Улыбка
Как в итоге краши вылечил?
_________________
Люблю свободный полёт... :)
    Добавлено: 15:15 26-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
NOSIGNAL и в инициализатор еще хендл на SIGTERM поставил.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."
    Добавлено: 16:54 26-08-2014   
Endeavour
 1015 EGP


Рейтинг канала: 6(322)
Репутация: 105
Сообщения: 7041
Откуда: guess
Зарегистрирован: 26.05.2005
ТехноМаг :
ну под Си их кот наплакал
curl? Пользовался немного, оно работает™ Улыбка

edit: я так и думал, что где-то ступил %)

Последний раз редактировалось: Endeavour (19:16 26-08-2014), всего редактировалось 1 раз
    Добавлено: 16:59 26-08-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
cURL это клиентская библиотека. Человек же сервер пишет.
Может, каких-то функций из неё можно надёргать, но общее предназначение библиотеки не в этом.
_________________
Люблю свободный полёт... :)
    Добавлено: 17:13 26-08-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
И снова я, и с глупым вопросом.

кратко:
Дано 8 кубов со стороной GalaxyClusterSize в массиве
0 - центр - 1 +-x 2 +-y 3+-z 4+-xy 5+-xz 6+-yz 7+-xyz

Надо - динамически проверять где находится игрок, и в случае его перехода из одного куба в другой менять их в массиве местами. Делаю так:

 Cкрытый текст   (кликните здесь для просмотра)
Код:
void ALGalaxy::UpdateClustersInLocation(FVector Location)
{
   FGalaxyCluster _c;

   float x, y, z;
   
   x = (Location.X - _Clusters[0].CoordX) / GalaxyClusterSize;
   y = (Location.Y - _Clusters[0].CoordY) / GalaxyClusterSize;
   z = (Location.Z - _Clusters[0].CoordZ) / GalaxyClusterSize;

   if (abs(x) > 0.25f) {
      if (_Clusters[1].IdX != _Clusters[0].IdX + (abs(x) / x))
         _Clusters[1] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ);
   }
   else {
      //Free Stars in Cluster
      FreeStars(&_Clusters[1]);
   }

   if (abs(y) > 0.25f) {
      if (_Clusters[2].IdY != _Clusters[0].IdY + (abs(y) / y))
         _Clusters[2] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
   }
   else {
      FreeStars(&_Clusters[2]);
   }

   if (abs(z) > 0.25f) {
      if (_Clusters[3].IdZ != _Clusters[0].IdZ + (abs(z) / z))
         _Clusters[3] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
   }
   else {
      FreeStars(&_Clusters[3]);
   }

   //additions
   if (abs(x) > 0.25f && abs(y) > 0.25f) {
      if (_Clusters[4].IdX != _Clusters[0].IdX + (abs(x) / x) &&
         _Clusters[4].IdY != _Clusters[0].IdY + (abs(y) / y))
         _Clusters[4] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ);
   }
   else {
      FreeStars(&_Clusters[4]);
   }

   if (abs(x) > 0.25f && abs(z) > 0.25f) {
      if (_Clusters[5].IdX != _Clusters[0].IdX + (abs(x) / x) &&
         _Clusters[5].IdZ != _Clusters[0].IdZ + (abs(z) / z))
         _Clusters[5] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY, _Clusters[0].IdZ + (abs(z) / z));
   }
   else {
      FreeStars(&_Clusters[5]);
   }

   if (abs(y) > 0.25f && abs(z) > 0.25f) {
      if (_Clusters[6].IdZ != _Clusters[0].IdX + (abs(z) / z) &&
         _Clusters[6].IdY != _Clusters[0].IdY + (abs(y) / y))
         _Clusters[6] = GetCluster(_Clusters[0].IdX, _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
   }
   else {
      FreeStars(&_Clusters[6]);
   }

   if (abs(x) > 0.25f && abs(y) > 0.25f && abs(z) > 0.25f) {
      if (_Clusters[7].IdX != _Clusters[0].IdX + (abs(x) / x) &&
         _Clusters[7].IdY != _Clusters[0].IdY + (abs(y) / y) &&
         _Clusters[7].IdZ != _Clusters[0].IdZ + (abs(z) / z))
         _Clusters[7] = GetCluster(_Clusters[0].IdX + (abs(x) / x), _Clusters[0].IdY + (abs(y) / y), _Clusters[0].IdZ + (abs(z) / z));
   }
   else {
      FreeStars(&_Clusters[7]);
   }

   //swap clusters
   if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[7];
      _Clusters[7] = _c;
   }
   else if (abs(y) > 1.0f && abs(z) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[6];
      _Clusters[6] = _c;
   }
   else if (abs(x) > 1.0f && abs(z) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[5];
      _Clusters[5] = _c;
   }
   else if (abs(x) > 1.0f && abs(y) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[4];
      _Clusters[4] = _c;
   }
   else if (abs(z) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[3];
      _Clusters[3] = _c;
   }
   else if (abs(y) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[2];
      _Clusters[2] = _c;
   }
   else if (abs(x) > 1.0f) {
      _c = _Clusters[0];
      _Clusters[0] = _Clusters[1];
      _Clusters[1] = _c;
   }

   X = _Clusters[0].IdX;
   Y = _Clusters[0].IdY;
   Z = _Clusters[0].IdZ;

}

void ALGalaxy::ReceiveBeginPlay()
{
   _Clusters[0] = GetCluster(0, 0, 0);
   tick = true;
}

void ALGalaxy::Tick(float DeltaSeconds)
{
   if (!tick) return;

   FVector plPos = GetWorld()->GetFirstPlayerController()->GetPawn()->GetTransform().GetLocation();
   FVector stPos;
   float dist;
   UpdateClustersInLocation(plPos);

   for (int32 i = 0; i < 8; i++) {
      for (int32 s = 0; s < _Clusters[i].Star.Num(); s++) {
         stPos = FVector(_Clusters[i].CoordX + _Clusters[i].Star[s].CoordX,
            _Clusters[i].CoordY + _Clusters[i].Star[s].CoordY,
            _Clusters[i].CoordZ + _Clusters[i].Star[s].CoordZ);
         dist = stPos.Dist(plPos, stPos);

         if (dist <= GalaxyStarVisibleRange) {
            if (!_Clusters[i].Star[s].spawned) {
               _Clusters[i].Star[s].self = static_cast<ALGalaxyStar*>( GetWorld()->SpawnActor(_Clusters[i].Star[s].Class, &stPos) );
               _Clusters[i].Star[s].spawned = true;
            }
         }
         else {
            if (_Clusters[i].Star[s].spawned) {
               _Clusters[i].Star[s].self->Destroy();
               _Clusters[i].Star[s].spawned = false;
            }
         }

      }
   }
}


и вроде бы все работает, но если игрок движется по диагонали (в левый верхий угол например) срабатывает вместо if (abs(x) >= 1.0f && abs(y) > 1.0f && abs(z) > 1.0f) - else if (abs(z) > 1.0f), ибо в x и y приходит 0.7f... И фиг его знает почему.

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

А стоп. Вопрос снят. Там не 1.0f а 0.5 f должно бытьУлыбка Ибо от центра считается...
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (15:18 09-10-2014), всего редактировалось 2 раз(а)
    Добавлено: 15:07 09-10-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
А зачем менять местами?
_________________
Люблю свободный полёт... :)
    Добавлено: 18:48 09-10-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Делаю Процедурный генератор Вселенной.

Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.

Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.

PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится Гы-гы )

Собственно это выглядит так:
0 - кластер, где находится игрок
1 - смежный кластер по оси X (
2- смежный по Y
3 - смежный по Z
4-7 - дополнительные (угловые п всем осям)

А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (19:06 09-10-2014), всего редактировалось 4 раз(а)
    Добавлено: 18:54 09-10-2014   
Dimaxx
 835 EGP


Рейтинг канала: 8(792)
Репутация: 195
Сообщения: 5159
Откуда: Северодвинск
Зарегистрирован: 26.06.2002
А не проще нагенерить кластеры, которые будут содержать массивы видимых в нем индексов-ссылок на общий массив звезд? Не надо менять местами, не надо отсеивать. А просто грузить из данных нужный кластер.
_________________
"Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс
    Добавлено: 22:10 09-10-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
Dimaxx :
А просто грузить из данных нужный кластер.

Теоретически можно, но накладно для ресурсов. Кластеров у меня 1024/1024 из текстуры + генерация Z по алгоритму для объемности. Звезд в кластере до 2048

Полностью загенерированные кластеры занимают овер 5 Гб, поэтому не комельфо такое кол-во инфы в памяти держать.

Поэтому я таки склоняюсь к реалтайм генерации. В принципе сейчас родилась одна идейка, как код упростить. Завтра, когда с работы вернусь проверю мыслю.
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (22:56 09-10-2014), всего редактировалось 2 раз(а)
    Добавлено: 22:29 09-10-2014   
Dimaxx
 835 EGP


Рейтинг канала: 8(792)
Репутация: 195
Сообщения: 5159
Откуда: Северодвинск
Зарегистрирован: 26.06.2002
ТехноМаг :
не комельфо такое кол-во инфы в памяти держать

А кто сказал - в памяти. Они лежат массивом на диске. Генерятся в момент, допустим, создания новой игры. 1 кластер содержит 2048 звезд. Ссылка (индекс) на главный массив звезд для устрашения примем 64-битной (8 байт) - звезд ведь миллиарды. Итого каждый кластер 2048*8=16384 байта максимум. 16КБайт на массив звезд. К тому же можно генерировать кластеры в момент первого появления там игрока. Значит изначально база кластеров на диске будет состоять из 1 кластера. Ну и постепенно разрастаться по мере продвижения игрока по космосу.

ТехноМаг :
+ генерация Z по алгоритму для объемности

В этом месте не понял. Объект имеет 3 координаты в пространстве. У каждой звезды их также 3. Главный массив звезд содержит 3 координаты. Так что объемность уже есть. Плюс нужно обязательно пересчитывать яркость ВСЕХ звезд в зависимости от положения игрока. Если звезда имела звездную величину 4m при расстоянии до нее, к примеру, 12 св. лет, то при расстоянии от игрока в 0,5 св. лет ее яркость будет гораздо выше.

И еще. Не обязательно хранить все кластеры и задавать кластеры. Достаточно определить оптимальную дальность отрисовки кластера. Человеческий глаз различает звезды до 6 зв. величины включительно. Есть плавающий кластер-куб определенного размера. Вот и сделать отбор из базы всех объектов, видимая (с учетом положения игрока) звездная величина которых не превышает 6. Число таких звезд невелико (можно принять до 1 млн.). Значит текущий массив будет не более 8МБайт. Далее рассчитать яркости видимых звезд в этом массиве с учетом положения игрока (он всегда жестко "закреплен" в центре кластера). Кластер перемещается за игроком. В итоге получим отбор видимых объектов и работу по пересчету их параметров локальным массивом относительно главной базы весьма небольшого размера.
_________________
"Если мы не покончим с войной, война покончит с нами." Г. Г. Уэллс

Последний раз редактировалось: Dimaxx (23:22 09-10-2014), всего редактировалось 5 раз(а)
    Добавлено: 23:05 09-10-2014   
AnrDaemon
 790 EGP


Модератор
Рейтинг канала: 7(686)
Репутация: 33
Сообщения: 11921

Зарегистрирован: 17.10.2004
ТехноМаг :
Делаю Процедурный генератор Вселенной.

Геню по текстуре кластеры (те самые кубы), которые имеют определенные координаты.

Т.к. звезд очень много, то есть необходимость выводить кластеры по кускам, в зависимости от положения игрока (Pawn). Массив _Clusters по сути кэш, который позволяет эти кластеры выводить. Меняю индексы затем, чтобы знать, какие кластеры мне нужно выводить/перегенерить, а какие удалить.

PS: Код пока тестовый, если найду более красивое решение, разумеется перепишу, но пока так (собсно было интересно, как UE4 с такой задачей справится Гы-гы )

Собственно это выглядит так:
0 - кластер, где находится игрок
1 - смежный кластер по оси X (
2- смежный по Y
3 - смежный по Z
4-7 - дополнительные (угловые п всем осям)

А далее проходим по списку звезд в загенеренных кластерах и выводим те, которые попадают в установленную зону видимости.

Ты черезчур усложняешь себе жизнь.
1. Зачем загонять в массив? Используй коллекцию.
2. Почему 8? Генери 27. Хазерон вспомни.
_________________
Люблю свободный полёт... :)
    Добавлено: 04:54 10-10-2014   
ТехноМаг
 307 EGP


Рейтинг канала: 2(21)
Репутация: 89
Сообщения: 2471
Откуда: Кронштадт
Зарегистрирован: 09.04.2007
AnrDaemon :
Генери 27


а вот тут приходит привет от UE4. 27 за раз он не может загенить. Если использовать цикл for для этого, то он упорно считает, что цикл бесконечен и зависает (либо я чего-то не понимаю в его логике). Етодом проб и ошибок нашел максимально допустимое кол-во прогонов - 10. Отсюда и 8 кластеров, собсно.

добавлено спустя 5 минут:
Как я ранее писал есть мысль как упростить код без массивов и прочей лабуды, используя только индексные индфикаторы кластера (idX, idY и idZ). Через 5 часов буду дома - проверю идею.

добавлено спустя 6 минут:
А пока это выглядит вот так:

нормально загенеренный кластер:

 Cкрытый текст   (кликните здесь для просмотра)


кластер, загенереный с "поломанным" алгороитмом

 Cкрытый текст   (кликните здесь для просмотра)


добавлено спустя 58 минут:
Dimaxx :
В этом месте не понял


Поясню. Кластер кубически кубичный. И в "центре" галлактике получается натуральный куб, причем с ярко выраженными гранями, ибо звезд дофига (на "поломанном" скрине это очень хорошо видно). Поэтому сверху и снизу я генерю дополнительные кластеры, в которых кол-во звезд уменьшается по експоненте и в итоге получается некое подобие овала (красивее смотрится, да и более реалистично).
_________________
(Л)"Алекс, я живу уже почти 200 лет. но как видишь, выгляжу я всего на 20. И это не единственное отличие меня от людей."

Последний раз редактировалось: ТехноМаг (07:25 10-10-2014), всего редактировалось 6 раз(а)
    Добавлено: 06:08 10-10-2014   
Железный канал: «C, С++»
На страницу: Пред.  1, 2, 3 ... 29, 30, 31 ... 35, 36, 37  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: По просьбе автора - заклозиваю. (закрыл тему Harley)

  » C, С++ | страница 30
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18