noir
Модератор: Jolly Roger
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
noir
Не удержался перед соблазном завести дневник разработчика. На это у меня есть две причины: во-первых, я надеюсь, что это некоторым образом меня дисциплинирует, во-вторых, мне наконец удалось собрать команду заинтересованных людей, которые, вдобавок, имеют некоторый опыт в сходных проектах.
Итак, рабочее название noir (нуар). Именно со строчной буквы. Сюжет я пока-что умолчу.
Прорабатываемые черты:
1. Система скользящего тайминга вместо пошаговой.
2. Модульные персонажи (отдельный расчёт конечностей).
3. Генерация мира на основе псевдослучайных последовательностей, что позволяет серьёзно уменьшить размер файлов сохранения.
4. ASCII в тру-колоре, с элементами растровых тайлов. Поддержки непосредственно тайлового режима не будет.
5. Обширные текстовые описания локаций, монстров, оружия и пр. Каждая встреченная вами тварюга будет иметь свою специфическую особенность (если вам хватит времени и желания рассматривать каждую тварь).
6. Гибкая настройка интерфейса и раскладки клавиатуры. Если вы хотите, чтобы noir выглядел как АДОМ или Ангбанд, он будет настолько на него похожим, насколько это вообще возможно.
На данный момент обсуждается ролевая система без хитпойнтов и маны. Если удастся найти компромиссный вариант между геймплеем и извращёнными фантазиями команды разработчиков, она тоже будет реализована.
Язык разработки Object Pascal без привязки к конкретному компилятору. Используется Omega SDK (вариации для DirectX и OpenGL на выбор пользователя).
Теперь немного подробнее об особенностях проекта.
Система со скользящим таймингом — это система, в которой нет заранее определённой очерёдности ходов. Фактически, все действия происходят одновременно, но игра «ставится на паузу», когда персонаж заканчивает своё очередное действие. Выглядит это так: любое действие длится определённое число «тиков» — квантов времени. Один тик соответствует одной итерации. Персонаж (как игрок, так и монстр), определяет своё следующее действие, после чего он не имеет права вмешиваться в происходящие события, пока действие не будет выполнено, либо прервано внешним фактором. При определении действия задаётся его TTL. На каждый тик TTL уменьшается на единицу. Когда TTL достигает нуля, действие заносится в «список разрешения» (resolving list). В конце тика, список разрешения просматривается и персонажам передаётся информация о результате их действия. На каждый тик просматриваются все текущие действия, занесённые в список разрешения. Если существует хотя бы одно действие, происходящее в зоне видимости игрока, на этот тик происходит перерисовка кадра (плавно изменяющие цвет и анимированные объекты в зоне видимости перерисовываются вне зависимости от разрешения действий).
Фактически, это должно сообщить игре дополнительную динамику: ваш противник может уйти из-под вашего удара, вы можете уклониться от летящего в вас магического снаряда или закрыться щитом от стрелы. В идеале, каждое столкновение должно быть сложной тактической задачей.
Модульность персонажей была тяжёлым решением. Печальный опыт IVAN мне более чем известен, поэтому решение было принято компромиссное: повреждения расчитываются по всему телу, но есть некоторая возможность отрубить (или прирастить!) ту или иную конечность. Шансы лишиться головы должны быть ничтожными, но, всё-таки, быть: в качестве лишнего напоминания о бренности человеческой жизни Отчасти решение о модульности связано с тем, что движок в будущем будет использоваться для другого проекта по вселенной Warhammer40k.
На данный момент игра находится в стадии разработки пользовательского интерфейса и теоретической проработки игрового мира. Более-менее цивильные демонстрационные версии следует ожидать не ранее зимы сего года, но в процессе разработки я планирую периодически выкладывать техно-демки тех или иных нюансов. Предыдущая программа демонстрировала любопытную избирательность к железу, на этот раз хотелось бы таких проблем избежать в зародыше.
Итак, рабочее название noir (нуар). Именно со строчной буквы. Сюжет я пока-что умолчу.
Прорабатываемые черты:
1. Система скользящего тайминга вместо пошаговой.
2. Модульные персонажи (отдельный расчёт конечностей).
3. Генерация мира на основе псевдослучайных последовательностей, что позволяет серьёзно уменьшить размер файлов сохранения.
4. ASCII в тру-колоре, с элементами растровых тайлов. Поддержки непосредственно тайлового режима не будет.
5. Обширные текстовые описания локаций, монстров, оружия и пр. Каждая встреченная вами тварюга будет иметь свою специфическую особенность (если вам хватит времени и желания рассматривать каждую тварь).
6. Гибкая настройка интерфейса и раскладки клавиатуры. Если вы хотите, чтобы noir выглядел как АДОМ или Ангбанд, он будет настолько на него похожим, насколько это вообще возможно.
На данный момент обсуждается ролевая система без хитпойнтов и маны. Если удастся найти компромиссный вариант между геймплеем и извращёнными фантазиями команды разработчиков, она тоже будет реализована.
Язык разработки Object Pascal без привязки к конкретному компилятору. Используется Omega SDK (вариации для DirectX и OpenGL на выбор пользователя).
Теперь немного подробнее об особенностях проекта.
Система со скользящим таймингом — это система, в которой нет заранее определённой очерёдности ходов. Фактически, все действия происходят одновременно, но игра «ставится на паузу», когда персонаж заканчивает своё очередное действие. Выглядит это так: любое действие длится определённое число «тиков» — квантов времени. Один тик соответствует одной итерации. Персонаж (как игрок, так и монстр), определяет своё следующее действие, после чего он не имеет права вмешиваться в происходящие события, пока действие не будет выполнено, либо прервано внешним фактором. При определении действия задаётся его TTL. На каждый тик TTL уменьшается на единицу. Когда TTL достигает нуля, действие заносится в «список разрешения» (resolving list). В конце тика, список разрешения просматривается и персонажам передаётся информация о результате их действия. На каждый тик просматриваются все текущие действия, занесённые в список разрешения. Если существует хотя бы одно действие, происходящее в зоне видимости игрока, на этот тик происходит перерисовка кадра (плавно изменяющие цвет и анимированные объекты в зоне видимости перерисовываются вне зависимости от разрешения действий).
Фактически, это должно сообщить игре дополнительную динамику: ваш противник может уйти из-под вашего удара, вы можете уклониться от летящего в вас магического снаряда или закрыться щитом от стрелы. В идеале, каждое столкновение должно быть сложной тактической задачей.
Модульность персонажей была тяжёлым решением. Печальный опыт IVAN мне более чем известен, поэтому решение было принято компромиссное: повреждения расчитываются по всему телу, но есть некоторая возможность отрубить (или прирастить!) ту или иную конечность. Шансы лишиться головы должны быть ничтожными, но, всё-таки, быть: в качестве лишнего напоминания о бренности человеческой жизни Отчасти решение о модульности связано с тем, что движок в будущем будет использоваться для другого проекта по вселенной Warhammer40k.
На данный момент игра находится в стадии разработки пользовательского интерфейса и теоретической проработки игрового мира. Более-менее цивильные демонстрационные версии следует ожидать не ранее зимы сего года, но в процессе разработки я планирую периодически выкладывать техно-демки тех или иных нюансов. Предыдущая программа демонстрировала любопытную избирательность к железу, на этот раз хотелось бы таких проблем избежать в зародыше.
Dump the screen? [y/n]
- Sanja
- Администратор
- Сообщения: 791
- Зарегистрирован: 24 ноя 2006, 12:25
- Откуда: Новосибирск
- Контактная информация:
Ого. Желаю успехов.
1. Гуд. Правда не совсем понятно как это отразится на ближнем бое. Поясню. Предположим, что время, за которое стрела/файрболл долетает до персонажа равно времени за которое монстр размахивается и наносит удар (ну скажем секирой). Если при твоей системе времени можно будет видеть подлетающую к герою стрелу, то как увидеть подлетающий к голове героя топор? Вводить доп. информацию о текущем состоянии каждого монстра в момент хода персонажа?
2. Интересно как реализуешь. Вроде ничё так.
3. Эээ, чево? Как будет загрузка-то из сейва происходить?
4. Вот. То что надо.
5. Хватит желания.
6. Нормуль.
Ещё раз успехов в начинаниях.
1. Гуд. Правда не совсем понятно как это отразится на ближнем бое. Поясню. Предположим, что время, за которое стрела/файрболл долетает до персонажа равно времени за которое монстр размахивается и наносит удар (ну скажем секирой). Если при твоей системе времени можно будет видеть подлетающую к герою стрелу, то как увидеть подлетающий к голове героя топор? Вводить доп. информацию о текущем состоянии каждого монстра в момент хода персонажа?
2. Интересно как реализуешь. Вроде ничё так.
3. Эээ, чево? Как будет загрузка-то из сейва происходить?
4. Вот. То что надо.
5. Хватит желания.
6. Нормуль.
К тому времени разве что демки интерфейса Объём работы реально велик. Думаю уровня Incursion, не меньше.На данный момент игра находится в стадии разработки пользовательского интерфейса и теоретической проработки игрового мира. Более-менее цивильные демонстрационные версии следует ожидать не ранее зимы сего года, но в процессе разработки я планирую периодически выкладывать техно-демки тех или иных нюансов.
Ещё раз успехов в начинаниях.
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
А это будет не доп.информация, а в принципе информация, потому что действие персонажа известно, как только он заявил его к реализации.Sanja писал(а):Ого. Желаю успехов.
1. Гуд. Правда не совсем понятно как это отразится на ближнем бое. Поясню. Предположим, что время, за которое стрела/файрболл долетает до персонажа равно времени за которое монстр размахивается и наносит удар (ну скажем секирой). Если при твоей системе времени можно будет видеть подлетающую к герою стрелу, то как увидеть подлетающий к голове героя топор? Вводить доп. информацию о текущем состоянии каждого монстра в момент хода персонажа?
Вообще, стрела летит достаточно медленно, так что, при должной сноровке стрелы можно будет отбивать мечом (что вполне соответствует действительности).
Самому интересно Эту часть проекта, скорее всего, буду разрабатывать не я.Sanja писал(а): 2. Интересно как реализуешь. Вроде ничё так.
В сейве храним начальное значение генератора для данного уровня, тип уровня, список изменений и сжатую информацию о клетках, которые персонаж увидел. Количество изменений по определению меньше, чем количество клеток, поэтому получаем серьёзное преимущество.Sanja писал(а): 3. Эээ, чево? Как будет загрузка-то из сейва происходить?
В прошлый раз я использовал векторные шрифты и не скажу, чтобы мне это сильно понравилось. Сейчас у меня есть собственноручно собранный шрифт, который, в принципе, меня устраивает. К релизу надо будет намалявать шрифтов на выбор, но для текущих нужд хватает и одного комплекта.Sanja писал(а): 4. Вот. То что надо.
Ну, писать просто ещё один рогалик сейчас банально не имеет смысла — их достаточно много. Что до сроков, то у меня на данный момент есть много уже готового кода, который можно снять с предыдущих проектов, плюс, я работаю не один. Самая серьёзная проблема — это реализация на всём этом счастье многоязыкового интерфейса.Sanja писал(а): К тому времени разве что демки интерфейса Объём работы реально велик. Думаю уровня Incursion, не меньше.
Спасибо.Sanja писал(а): Ещё раз успехов в начинаниях.
Dump the screen? [y/n]
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Рабочие моменты: ввёл в шрифт элементы псевдографики. Кодировка не совпадает с ASCII-шной, но лично мне удобно. Остальным с ней работать не придётся. Разрабатываю элементы интерфейса: формы, надписи, кнопки и пр. Приблизительный срок — полторы недели.
Собрание DevTeam. Обсуждали структуру данных. Кое-что прояснилось с примитивами, из которых будут «собираться» монстры. Пока что балансируем между геморроем и маразмом, причём понятия эти не являются взаимоисключающими.
В режиме шутки: нам понадобытся MML (Monster Meta Language) и cus (Cascade Ugliness Sheet).
Без шуток решили не делать описания игровых объектов в текстовом режиме, а вместо этого писать встроенный редактор, заодно откатывая на нём интерфейс.
Собрание DevTeam. Обсуждали структуру данных. Кое-что прояснилось с примитивами, из которых будут «собираться» монстры. Пока что балансируем между геморроем и маразмом, причём понятия эти не являются взаимоисключающими.
В режиме шутки: нам понадобытся MML (Monster Meta Language) и cus (Cascade Ugliness Sheet).
Без шуток решили не делать описания игровых объектов в текстовом режиме, а вместо этого писать встроенный редактор, заодно откатывая на нём интерфейс.
Dump the screen? [y/n]
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Maelstrom скептик, фи.
Лично я очень хотел бы увидеть:
1) рогалик целиком =)
2) описанную систему тайминга в работе
3) то, как будут обыгрываться модульные (я правильно понял?) монстры в игре. Мало ведь конечности прописать, нужно еще характеристики сбалансировать и описания не забыть. Или они все будут ручной сборки?
Лично я очень хотел бы увидеть:
1) рогалик целиком =)
2) описанную систему тайминга в работе
3) то, как будут обыгрываться модульные (я правильно понял?) монстры в игре. Мало ведь конечности прописать, нужно еще характеристики сбалансировать и описания не забыть. Или они все будут ручной сборки?
Пытается раскуклиться
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Не поверишь, мне тоже очень хотелось бы всё это увидеть Монстры будут в основном «ручной» сборки, т.е. о том, что есть монстр «гоблин», и он — низенький зелёный гуманоид, игра сама по себе не знает. А вот уже чем каждый конкретный гоблин будет уникален — за это отвечает система модификаторов.Cfyz писал(а):Maelstrom скептик, фи.
Лично я очень хотел бы увидеть:
1) рогалик целиком =)
2) описанную систему тайминга в работе
3) то, как будут обыгрываться модульные (я правильно понял?) монстры в игре. Мало ведь конечности прописать, нужно еще характеристики сбалансировать и описания не забыть. Или они все будут ручной сборки?
Кроме того, в принципе, ничто не мешает по такой же схеме генерировать монстров автоматически. Но этим очень просто можно убить атмосферу.
Dump the screen? [y/n]
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Цфуз мечтатель-губозакатыватель, фу.
А вот насчёт этого поподробнее. Будет готовая база-тело "гоблин" с усреднёнными параметрами и куча шаблонов для него аля "салага", "гоблин-воин" и "старый хромой но опытный шаман", или что-то принципиально другое?Монстры будут в основном «ручной» сборки, т.е. о том, что есть монстр «гоблин», и он — низенький зелёный гуманоид, игра сама по себе не знает. А вот уже чем каждый конкретный гоблин будет уникален — за это отвечает система модификаторов.
Айв кнгенгах Йог-Сотот
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Будет приблизительно следующее. Приблизительно, потому что сейчас прорабатывается структура данных и объектная модель. Сначала строится скелет. Для скелета есть некоторое количество заготовок: череп, позвоночник, грудная клетка, конечность, кисть и т.д. Далее, вручную «собираются» заготовки. Например, гуманоид. Прямоходящий, с костным скелетом, две руки, две ноги, голова. Заготовка определяет, какой буквой по умолчанию будет отображаться монстр (но нам ничто не мешает перекрыть это свойство).Maelstrom писал(а):А вот насчёт этого поподробнее. Будет готовая база-тело "гоблин" с усреднёнными параметрами и куча шаблонов для него аля "салага", "гоблин-воин" и "старый хромой но опытный шаман", или что-то принципиально другое?Монстры будут в основном «ручной» сборки, т.е. о том, что есть монстр «гоблин», и он — низенький зелёный гуманоид, игра сама по себе не знает. А вот уже чем каждый конкретный гоблин будет уникален — за это отвечает система модификаторов.
Затем, при создании нового монстра мы выбираем заготовку из которой мы его делаем (хотя, опять же, ничто не мешает сварганить с нуля какую-нибудь несусветную образину). Для монстра определяем рост, вес, цвет кожного покрова (чешуи, обшивки), возможные цвета глаз, волос и пр. Можем изменить количество суставов на конечностях, количество пальцев и т.д.
Далее накладываются модификаторы. Модификаторы применяются не к монстру, а к тем частям из которых он состоит. Если у монстра на голове есть волосы, то мне не надо лишний раз заморачиваться на том, что он может быть седым, что у него может быть плешь или залысина.
Большая часть модификаторов применяется автоматически исходя из нескольких параметров. Например, для кисти есть модификатор «продольное повреждение». Если покров — кожа, то автоматически модификатор трактуется как «шрам», а если, например, рука металлическая — то как «царапина».
Модификаторы есть «с нагрузкой» и без. Так, модификаторы телосложения влияют на боевые качества персонажа. Модификатор органов чувств — на восприятие. Т.е. если у монстра «воспалённые гноящиеся глаза, подёрнутые мутной плёнкой», то резонно предположить, что он подслеповат.
В игре изначально будет выдаваться только основная информация: название монстра и «память». Но можно будет детально рассмотреть, например, руку или лицо — на это будет тратиться игровое время, хотя и самое минимальное. Так что игроку стоит определиться, какая информация о монстре его интересует в первую очередь. С развитием, персонаж, вероятно, может получать больше информации за один раз.
Dump the screen? [y/n]
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
От скелета пришлось отказаться. Структура разрасталась немеряно, причём, без особых преимуществ. В итоге, структура получилась более вменяемой и, при этом, с достаточным пространством для манёвра.
Имеем части тела:
1. Туловища (крупы, корпуса).
2. Оперативные конечности (руки, щупальца, клешни, манипуляторы)
3. Опорные конечности (ноги, ласты, колёса, гусеницы, присоски)
4. Голова.
5. Хвосты.
6. Доп. конечности (крылья, вибриссы, нечто невообразимое)
Шесть различных частей тела прописываются отдельными классами-потомками от некоей абстрактрой тушки. Т.е. они находятся внутри игровой механики и изменить их нельзя без перекомпиляции.
Но их можно настроить. Изменить количество суставов на руках, количество пальцев, глаз, ушей... Указать, что уши должны быть заострёнными, а коже — зелёной (Fascinating!). В итоге получаем достаточное количество разнообразных вариантов.
Имеем части тела:
1. Туловища (крупы, корпуса).
2. Оперативные конечности (руки, щупальца, клешни, манипуляторы)
3. Опорные конечности (ноги, ласты, колёса, гусеницы, присоски)
4. Голова.
5. Хвосты.
6. Доп. конечности (крылья, вибриссы, нечто невообразимое)
Шесть различных частей тела прописываются отдельными классами-потомками от некоей абстрактрой тушки. Т.е. они находятся внутри игровой механики и изменить их нельзя без перекомпиляции.
Но их можно настроить. Изменить количество суставов на руках, количество пальцев, глаз, ушей... Указать, что уши должны быть заострёнными, а коже — зелёной (Fascinating!). В итоге получаем достаточное количество разнообразных вариантов.
Dump the screen? [y/n]
Сразу вопрос: а если существо использует опорные конечности (или другие) как оперативные? Примеры: удар копытами для лошади, щупальца осьминога (это вообще в какую категорию?), рога на голове быка...Максим Кич писал(а):Имеем части тела:
1. Туловища (крупы, корпуса).
2. Оперативные конечности (руки, щупальца, клешни, манипуляторы)
3. Опорные конечности (ноги, ласты, колёса, гусеницы, присоски)
4. Голова.
5. Хвосты.
6. Доп. конечности (крылья, вибриссы, нечто невообразимое)
Идея мне очень нравится, я бы скорее предложил использовать вариант про Франкенштейна (было здесь на форуме) - то есть любая конечность может использоваться с любой целью. Если человеку оторвало ногу - он ползет на руках. Другое дело, что самих действий не так много - атака, передвижение, использование как инструмента. Тогда например передвижение на нескольких конечностях может происходить со скоростью самой медленной. Отшибли человеку ногу - или прыгай на одной, или ползи на руках и отталкивайся оставшейся. Атака - быстрые со своей скоростью, медленные со своей (плюс еще штрафы за лишние конечности)...
Что-то такое получается у меня в голове.
Первая заповедь фотолюбителя: Проявил себя - закрепи!
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Функциональные конечности — это такие, которые могут использовать инструмент, либо сами являются инструментом. На них тоже можно передвигаться, но скорость будет заведомо ниже, за исключением отдельных случаев. Щупальца, например, являются функциональными конечностями, но осьминогая тварь весьма оперативно будет на них перемещаться. Просто потому, что для каждой конечности прописано, сколько они прибавляют к скорости. И, потом, вполне могут существовать безногие зубастые обрубки, которые будут резво подбегать к персонажу на руках и со всей дури кусать за яйца.Сразу вопрос: а если существо использует опорные конечности (или другие) как оперативные? Примеры: удар копытами для лошади, щупальца осьминога (это вообще в какую категорию?), рога на голове быка...
Идея мне очень нравится, я бы скорее предложил использовать вариант про Франкенштейна (было здесь на форуме) - то есть любая конечность может использоваться с любой целью. Если человеку оторвало ногу - он ползет на руках. Другое дело, что самих действий не так много - атака, передвижение, использование как инструмента. Тогда например передвижение на нескольких конечностях может происходить со скоростью самой медленной. Отшибли человеку ногу - или прыгай на одной, или ползи на руках и отталкивайся оставшейся. Атака - быстрые со своей скоростью, медленные со своей (плюс еще штрафы за лишние конечности)...
Что-то такое получается у меня в голове.
Схема мне нравится отношением кода к функциональности.
Рога — это свойство головы. Так что здесь тоже всё нормально. И бить можно любой конечностью. Просто [censored] для этого слабо подходит, а хвост с гидроусилителями и шипастым металлическим шаром на конце — очень даже весьма.
Dump the screen? [y/n]
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Давненько меня не было. А не было меня давненько потому что Родина сослала меня далеко и надолго... Нет, не в армию, просто уезжая в командировку я напрочь оставил на домашней машине все наработки по noir.
Возвращаюсь к жизни и проекту. Проект осиротел на одного человека, и сие есть весьма нелицеприятная проблема. Но мы продолжаем.
По мере сил работаю над интерфейсной частью, а конкретно -- над вводом. При всех плюшках, которые OMEGA даёт в работе над графикой (псевдо-аскишный движок летает и умеет подсвечивать трю-колором не только буквы целиком, но ещё и уголки у них), работа с клавиатурой рассчитана исключительно под аркады. Ковыряю API, грустно думая об очередном геморрое с кроссплатформенностью.
Соответственно, из-за задержки где-то на месяц смещаются сроки - в январе следующего года будет первая демонстрация.
Возвращаюсь к жизни и проекту. Проект осиротел на одного человека, и сие есть весьма нелицеприятная проблема. Но мы продолжаем.
По мере сил работаю над интерфейсной частью, а конкретно -- над вводом. При всех плюшках, которые OMEGA даёт в работе над графикой (псевдо-аскишный движок летает и умеет подсвечивать трю-колором не только буквы целиком, но ещё и уголки у них), работа с клавиатурой рассчитана исключительно под аркады. Ковыряю API, грустно думая об очередном геморрое с кроссплатформенностью.
Соответственно, из-за задержки где-то на месяц смещаются сроки - в январе следующего года будет первая демонстрация.
Dump the screen? [y/n]
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 50 гостей