Главная | Регистрация | Вход | Приветствую Вас | Гость| RSS















Меню
Реклама
Категории раздела
Работа со скриптами [32]
Самые разные полезные статьи по скриптам игры S.T.A.L.K.E.R
Работа с конфигами [13]
Всякие полезные материалы по работе со Сталкером ТЧ.
Базовые знания [6]
Основы для тех кто хочет заниматься модами.
Для тех кто чуть больше чем новичок :) [7]
Работа с ACDC, all.spawn , скрипты...
SDK [3]
Все о работе в официальном SDK.
Прохождения модов ТЧ. [21]
Здесь выкладываем различные прохождения кучи различных модов для ТЧ.
Свежий хабар






Главная » Статьи » Тени Чернобыля » Работа со скриптами

Логика НПС. Часть 3
3.8.1. Синтаксис скрипта Logic

Пример: для того, чтобы персонаж ходил по пути walk1, а при приближении игрока на дистанцию 5 метров, переключался на путь walk2 (но только при условии, что он видит игрока), нужно написать следующее:

[logic]
active = walker1

[walker1]
path_walk = walk1
path_look = look1
on_actor_dist_le = 5 | walker2

[walker2]
path_walk = walk2
path_look = look2

Выше рассмотрено безусловное переключение секций. Перед именем секции в фигурных скобках {} можно задавать дополнительные условия, а после имени секции - так называемые "эффекты", которые заключить в знаки процента: %%. Эффекты будут применены только в случае активации секции. Можно не задавать имя секции, а задать только условия и/или эффекты. Тогда активной останется старая секция, но условия и эффекты будут все равно обработаны. Если все условия в фигурных скобках не выполняются, секция активирована не будет.

Пример:

on_actor_dist_le = 5 | {условие} walker2 %эффекты%

Условия могут быть следующими:

+infoportion - требуется присутствие infoportion у actor
-infoportion - требуется отсутствие infoportion у actor
=func - требуется, чтобы func вернула true
!func - требуется, чтобы func вернулся false

Эффекты могут быть следующими:

+infoportion - в случае включения секции у actor будет установлен infoportion
-infoportion - в случае включения секции у actor будет убран infoportion
=func - в случае включения секции стартует функция func

Несколько условия или эффектов разделяются пробелами:

on_actor_dist_le = 5 | {+info1 -info2 +info3} walker2 %+info4 =func%

Можно задавать сразу несколько секций, разделенных запятыми. Порядок обхода при этом - слева направо. После срабатывания первого из условий, обход прекращается. В примере ниже, если установлен info1, будет включена схема walker2, иначе, если установлен info2, будет включена схема walker3, иначе будет включен walker4:

on_actor_dist_le = 5 | {+info1} walker2, {+info2} walker3, walker4

В описанном выше поле active секции logic, можно также задавать условия, например:

[logic]
active = {=actor_friend} walker@friendly, walker@enemy
В логических условиях теперь принимается ключевое слово never, которое означает, что условие ложно. Например:
combat_ignore_cond = {=actor_enemy =actor_has_suit} always, {=actor_enemy} never %...эффекты...%

Вышеприведенная конструкция включает игнорирование боя, если у NPC враг - игрок в костюме, но отключит его, если врагом является игрок, но без костюма, при этом сработают эффекты (%%) секции never. Таким образом, выбор секции never равносилен отсутствию секции (несрабатыванию условия), но эффекты в знаках процента при этом срабатывают.

Пример работы с секцией nil. Секция nil выводит из-под скриптовых схем персонажа, монстра или объект и отпускает его под управление движка. Это надо если какое-либо условие выполнившись 1 раз больше не нуждается в проверке, при этом экономятся ресурсы машины, которые на каждом апдейте проверяют это условие.

[logic]
active = sr_idle

[sr_idle]
on_actor_inside = nil %+esc_actor_inside%
То есть, при входе актера в рестриктор выдается инфопоршн и рестриктор уходит в секцию nil, больше не проверяя наличие игрока.
NB: Обратно из секции nil под скрипты объект вернуть уже невозможно! Учитывайте это, используя ее.

3.8.2. Вот пример достаточно сложной логики:

[logic]
active = walker
combat_ignore = combat_ignore
on_hit = hit
on_death = death

[hit]
on_info = %+alert%

[death]
on_info = %+alert +trup3%

[walker]
path_walk = walk_svoboda3
path_look = look_svoboda3
combat_ignore_cond = {-alert}
on_timer = 25000 | remark

[remark]
anim = idle
snd = stalker_talk_kampfire
no_move = true
no_rotate = true
on_hit = hit
on_death = death
combat_ignore_cond = {-alert}

[combat_ignore]

Рассмотрим ее пошагово. Вначале сталкер работает по схеме walker-a. При этом он игнорирует бой, пока не будет поставлен инфопоршн alert. Он ждет 25 секунд, после чего переходит в схему remark. В ремарке он проигрывает идловую анимацию, говорит на указанные темы, не поворачивается и не двигается и точно также игнорирует бой. Если по нему попадут (on_hit) или убьют (on_death), будет поставлен инфопоршн alert и он перестанет игнорировать бой (понятно, что если он будет трупом, то это ему не поможет, но их в сценке трое, и тогда сорвутся в бой все остальные). Если его убьют, то также будет поставлен инфопоршн trup3 который сообщит о том, что этот сталкер убит.

А вот логика его противника:
[logic]
active = walker
combat_ignore = combat_ignore

[walker]
path_walk = soldier_walk1
path_look = soldier_look1
combat_ignore_cond = always
team = assault_group
on_signal = assault | camper

[camper]
path_walk = soldier_walk1_2
path_look = soldier_look1_2
radius = 5
on_info = {+trup1 +trup2 +trup3} walker2

[walker2]
path_walk = soldier_walk1_3
path_look = soldier_look1_3


[combat_ignore]

Он идет в схеме walker, игнорируя бой (причем игнорируя в любой ситуации). Идет в составе группы assault_group. Когда он приходит в конечную точку маршрута (там он синхронизируется с остальными из группы, это приписано в путях) и получает сигнал assault, то переходит в схему camper. В этой схеме у него не прописан combat_ignore, поэтому он начинает стрелять по противнику. После того, как все трое противников будут убиты, каждый из них, умирая ставит инфопоршн trup1, trup2 или trup3 и когда все трое будут убиты, то он переключится на схему walker2 (подойдет к костру).

3.9. Схемы логики space_restrictor

Общее замечание: Чтобы исключить ситуацию, когда актёр проскакивает через рестриктор и тот не успевает сработать, старайтесь ставить рестриктор так, чтоб минимальная ширина была больше 2 метров.

3.9.1. Схема [sr_idle]

Предназначение данной схемы – включить другую схему при срабатывании одного из стандартных условий логической схемы.
Сама по себе схема ничего не делает.
Пример настроек рестриктора:

[logic]
active = sr_idle

[sr_idle]
on_actor_inside = nil %+esc_actor_inside%

Обратите внимание, что после срабатывания проверки активная схема переключается в nil, чтобы не продолжать бесполезную проверку на каждом апдейте. Можно не задавать nil.
Часто эта схема работает вместе со спавнером, рестриктор выдает инфопоршн, при входе в зону, а спавнер по нему уже кого-то спавнит.

файл \gamedata\scripts\sr_idle.script

3.9.2. Секция [sr_no_weapon]

Данная схема убирает оружие у игрока при входе в зону.
Пример настроек рестриктора:

[logic]
active = sr_no_weapon

[sr_no_weapon]

файл \gamedata\scripts\sr_no_weapon.script

3.9.3. Секция [sr_sound]

snd = Перечень имён звуков разделенных запятыми.

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

  • delay = Задержка перед проигрыванием звука в секундах реального времени, по умолчанию 0.
  • idle = Длина периода игнорирования входа в зону после начала последнего проигранного звука. Чтоб, например, завывание было не чаще, чем раз в несколько минут. В секундах игрового времени. По умолчанию 0.
  • rnd = Вероятность (в процентах) того, что звук отыграется. По умолчанию 100.
  • position = Задает имя пути, в вершинах которого может отыграться звук. Есть зарезервированное значение random. Оно означает случайное место в радиусе 15…50 метров от игрока. Если этот параметр не задан, то подразумевается позиция игрока.
  • slide_velocity = Скорость (м/с) передвижения звука по точкам патрульного пути. По умолчанию - 3
  • slide_sound_once = true\false

true - проиграть звук один раз, даже если он не дошел до последней точки пути. false – если звук закончился, а до последней точки пути не дошел, запустить его ещё раз. По умолчанию false.

  • play_at_actor = true/false Заставляет звук играться от позиции актера постоянно. Если он будет равен true и будет задан путь перемещения звука (или рандом), то мы тупо вылетим.

Предназначение данной схемы: отыграть звук при входе актёра в рестриктор.

Поддерживается sound_end.

Обязательно нужно задать либо snd, либо type. Можно их задать вместе. На базе этих параметров составляется список звуков. При входе актёра в рестриктор отыгрывается случайный звук из этого списка.

Место, из которого может отыграться звук, задаётся одним из трёх:- случайное;- случайная вершина заданного пути;- позиция игрока.

Пример настроек рестриктора:

[logic]
active = sr_sound

[sr_sound]
type = floor_wooden
snd = ambient\wind1, ambient\sparks1
rnd = 50
position = random
idle = 120
delay = 3

Есть возможность сделать «скользящий звук». Необходим патрульный путь. Звук начинает отыгрываться с начала пути и перемещается от одной точки пути к другой (по мере их установки на патрульном пути) со скоростью slide_velocity.

[logic]
active = sr_sound

[sr_sound]
type = random
position = way
slide_velocity = 8
slide_sound_once = true

Файл \gamedata\scripts\sr_sound.script

3.9.4. Секция [sr_tip]

Предназначение данной схемы – давать игроку сообщение (подсказку) при входе в рестриктор

name = Название новости.
type = по умолчанию «news»
Тип новостей: «news» – отсылается как глобальная новость, «tips» - отсылается то имени sender-a

  • sender = если тип = «tips», то от sender задаёт условный строковый идентификатор иконки персонажа, от которого якобы пришло сообщение. По умолчанию это иконка торговца.
  • cond = Необходимые логические условия, при которых подсказка сработает. По дефолту, сработает при входе в зону.
  • single = true/false (по умолчанию false). Если параметр в true, то типс будет выдан только один раз,

Пример настроек рестриктора:

[logic]
active = sr_tip

[sr_tip]
name = tips_esc_trader_about_pda
type = tips
cond = {+infoportion1 –infoportion2 }

  • showtime = msec – время в миллисекундах, в течение которого сообщение будет находится на экране. – ПОКА НЕ РАБОТАЕТ НОРМАЛЬНО!

Если необходимо проиграть только 1 раз, а это случается часто, то можно добавить следующую строку:on_actor_inside = nil

файл \gamedata\scripts\sr_tip.script

3.9.5. Sr_light

Зона, в которой фонарики у неписей будут включены независимо от времени суток.

Работает следующим образом:

[logic]
active = sr_light

[sr_light]
light_on = true/false (свет включен/выключен)

Также работает вместе с кондлистом:

[logic]
active = sr_light

[sr_light]
light_on = true/false (свет включен/выключен)
on_info = {+info1} section %+info2%

3.9.6. Sr_territory

Занимается эта схема тем, что отлавливает всякие события, происходящие внутри рестриктора.Пока что она отлавливает только хиты и смерть сталкеров. Пример использования примерно следующий:

[logic]
active = sr_territory@outside

[sr_territory@outside]
on_actor_inside = sr_territory@inside

[sr_territory@inside]
on_actor_outside = sr_territory@outside
territory_hit = {-bar_dolg_territory_1_hit} %+bar_dolg_territory_1_hit%, {-bar_dolg_territory_2_hit}
%+bar_dolg_territory_2_hit%, {-bar_dolg_territory_3_hit} %+bar_dolg_territory_3_hit%territory_death = {-bar_dolg_territory_kill} %+bar_dolg_territory_kill%


То есть здесь видно, что когда игрок находится внутри рестриктора, то считается количество нанесенных хитов, а также учитывается был ли кто-то убит или нет. Поскольку схема работает только с игроком – то хиты и смерть засчитываются только от игрока.

3.9.7. Sr_mapspot

При входе в рестриктор он сам себя подсвечивает на карте.

Параметры:
hint - id подсказки в string table (обязательный параметр)
location - название типа подсветки (не обязательный параметр, по умолчанию "crlc_small")

Пример:
[logic]
active = sr_mapspot

[sr_mapspot]
hint = "gar_swamp”
location = crcl_big

3.9.8. Sr_particle

Данная система отыгрывает партиклы как статичные так и движущиеся в указанном месте и в указанное время. Работет она следующим образом:

1) для партикловой системы с путем камеры:

[sr_particle]  
name = explosions\campfire_03 -имя партикловой системы  
path = particle_test.anm -имя пути камеры  
mode = 1 -(обязательно !!!)  
looped = true/false -флаг зацикленности партиклов

(обязательно с расширением ANM !!!) Здесь партиклы будут молча перемещаться по anm-пути из папки gamedata\anims.

2) для партикловой системы с обычным патрульным путем (из way-point'ов):

[sr_particle]  
name = explosions\campfire_03 -имя партикловой системы  
path = part_points -имя патрульного пути  
mode = 2 -(обязательно !!!)  
looped = true/false -флаг зацикленности партиклов 

В вейпоинтах можно задавать флаги:
s=имя_звуковой_темы
d=число время задержки перед проигрыванием (задается в миллисекундах. Если не задано, то 0).
s=имя звуковой темы в sound_themes.ph_snd_themes из которой будет случайно выбран звук для проигрывания во время проигрывания партикла. Звук не зацикливается и играет только один раз.. Результат = партиклы отыгрываются во всех вейпоинтах одновременно (или с задержкой см. выше).
При looped=true по окончании проигрывания партиклов, они будут запускаться сначала, но уже без задержек. Сигнал particle_end выдаваться не будет. При looped=false сигнал будет выдан, когда все источники партиклов отыграют.
Поддерживается кондлист. Если рестриктор переходит в другую секцию, то автоматически перестают отыгрываться партиклы и замолкают звуки при них. Этот рестриктор является объектом, отслеживающим партиклы и нет никакой необходимости чтобы игрок в него заходил.

3.9.9. Sr_sound_act

Итого, схема, которая играет саунд в голове актера. Всякие там переговоры по ПДА и прочие фейки

[sr_sound_act]
snd = ambient\random\new_drone1 --имя звукового файла

  • delay = 2000 --задержка перед проигрыванием
  • delay_max = 4000 -- между проигрыванием звука будет взят случайный промежуток между delay и delay_max.
  • on_signal = sound_end | nil --по сигналу можно перейти в другую секцию.

theme = <имя темы из ph_sound_themes>

  • stereo = true/false (по умолчанию false). При установке этого параметра к файлу, который задан параметром snd или в звуковой теме будут добавляться (автоматически) суффиксы _r и _l для загрузки левого и правого каналов и, соответственно, вся эта фигня будет играться.

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

3.9.10 Sr_timer

Пример использования:

[logic]
active = sr_timer@1

[sr_timer@1]
type = dec
start_value = 10000
on_value = 0 | sr_timer@2

[sr_timer@2]
type = inc
on_value = 15000 | nil %+info1%

Описания полей:
type - тип счетчика, инкриментирующий(inc) или декриментирующий(dec).
Если поле не задано - счетчик будет инкриментирующий
start_value - начальное значение счетчика в РЕАЛЬНЫХ милисекундах. Для декриментирующих счетчиков задавать обязательно. Для инкриментирующих, если не задано, то считается с 0.

Переходы из секции sr_timer могут быть как по обычным условиям (on_timer, on_info) так и по специфическому условию on_value. В общем случае on_value Можно использовать для производства каких либо действий в зависимости от состояния счетчика. Например:

on_value = 5000| %+info1% | 1000| %+info2%

3.9.11. Sr_psy_antenna

Зоны с такой секцией позволяют управлять эффектами от пси-воздействия (на Янтаре и Радаре). Сейчас можно управлять интенсивностью излучения и интенсивностью получения повреждений.

Способ применения: Расставить зоны, в каждой зоне написать, сколько процентов к интенсивности излучения и повреждения она добавляет/отнимает. Зоны могут быть вложены друг в друга, пересекать друг друга.

eff_intensity = - увеличение/уменьшение в % от базового значения интенсивности излучения.hit_ intensity = - увеличение/уменьшение в % от базового значения наносимого повреждения.

Пример зоны, которая добавляет 70% излучения:

[logic]
active = sr_psy_antenna

[sr_psy_antenna]
eff_intensity = 70
hit_ intensity = 70

Пример зоны, которая убирает 30% излучения:

[logic]
active = sr_psy_antenna

[sr_psy_antenna]
intensity = -30

в версии SOC 1.0000 добавлена возможность задавать вероятность проявления фантомов и тайминг их "живучести"

phantom_prob = 40 - вероятность проявления фантомов в процентах
min_phantom_idle = 3000 - мин время их существования в состоянии idle
max_phantom_idle = 5000 - макс время их существования в состоянии idle

3.9.12. Sr_teleport

Собственно, телепорт. Настраиваются следующим образом:

[logic]
active = sr_teleport

[sr_teleport]
timeout = 0

point1 = point1
look1 = look1
prob1 = 10

point2 = point2
look2 = look2
prob2 = 20

где:
timeout - задержка в срабатывании телепорта в миллисекундах.
point - одноточечный патрульный путь куда переместить
look - одноточечный патрульный путь куда повернуть.

Далее идут настройки точек назначения с удельными весами. То есть в перечисленном выше примере вероятность телепортнутся во вторую точку в два раза выше, чем в первую. Максимальное количество точек назначения - 10. Телепорты необходимо ставить совместно с особой аномальной зоной, которую сейчас делает Проф. Зона добавит визуализацию и создаст эффект втягивания.

3.9.13. Sr_sleep и настройка снов.

Появилась возможность задавать зоны сна.

[sr_sleep]

  • cond = <condlist>
  • type = nightmare/normal/happy/all - Задает тип сна разрешенный в данной зоне (по умолчанию all). Влияет (группирует) только на несценарные сны.
  • dream_prob = <число от 0 до 100> - вероятность просмотра несценарных сновидений в данной зоне (по умолчанию 80). В противном случае будет только черный экран.

Необязательное поле cond задает условие(я), при котором в этой зоне можно спать. Сейчас производится индикация зон, где разрешен сон. В левом нижнем углу отображается маленькая иконка легких при входе в такую зону. Вероятно, позже будет изменена на другую.
Сновидения теперь делятся на сценарные и обычные. Сценарные сновидения отыгрываются один раз при выполнении необходимых условий. Обычные сновидения проигрываются, если нет сценарных или ни одно условие выполнения сценарных не сработало. Можно задавать вероятность отыгрывания обычных сновидений в целом, а также задавать вероятность срабатывания каждого конкретного сновидения в отдельности. Обычным сновидениям можно задавать тип и потом ограничивать по нему сны воспроизводимые в sr_sleep.

В файле misc\dream.ltx задаются настройки снов.

Секция videos.
Полями задаются пути к видеофайлам со снами.

Секция dreams. Поля:
regular_probability = <число от 0 до 100> - вероятность проигрывания обычных сновидений в целом
regular - список секций с настройками для обычных сновидений
scene - список секций с настройками для сценарных сновидений

Настройки обычных сновидений:
dream - имя поля из секции videos
probability = <число больше 0> - чем больше, тем больше вероятность проигрывания сна.
type = nightmare/normal/happy - тип сна.

Настройки сценарных сновидений:
dream - имя поля из секции videos
cond = <condlist> - условия срабатывания
to_regular = <вероятность,тип> - необязательное поле. Дает возможность переводить сценарный сон после первого отыгрыша в разряд обычных. <вероятность, тип> аналогичны probability и type из настроек обычных сновидений соответственно.

3.9.14. Sr_cutscene

Эта схема предназначена для проведения анимации камеры c некоторым эффектом (pp_effector). Последовательность действий, осуществляемых схемой, состоит из мгновенного перемещения игрока в начало пути point и ориентации его взгляда на начало пути look, потери управления игроком и начала анимации камеры cam_effector по завершении которой игрок вновь получает управление.

[sr_cutscene]
point = <имя пути> - путь в первую точку которого переносится игрок
look = <имя пути> - путь в первую точку которого смотрит игрок

  • pp_effector = <имя файла с эффектом> - файл, расположенный в папке

gamedata\anims\ и содержащий эффект (имя файла пишется без расширения)
cam_effector = <имя файла с анимацией камеры> - файл, расположенный в папке gamedata\anims\camera_effects\ и содержащий анимацию камеры (имя файла пишется без расширения)

3.10. Набор дополнительных настроек логики у разных объектов.

Для всех физических объектов есть секция ph_idle, поддерживающая кондлист в которую можно при необходимости переводить объекты.

3.10.1. Схема работы двери, секция [ph_door]

NB! Для двухстворчатых ворот задается все аналогично.

locked = false\true
Заперта ли дверь. По дефолту – false.

Closed = false\true
Закрыта ли дверь. По дефолту - true

tip_open = (если locked == false, то tip_door_open, иначе tip_door_locked)
Подсказка, которая появляется около прицела при наведении на дверь, если дверь закрыта.

tip_close = (если locked == false, то tip_door_close, иначе пустое значение)
Подсказка, которая появляется около прицела при наведении на дверь, если дверь открыта.

snd_init = Звук, который будет отыгран сразу при включении схемы.

snd_open_start = Звук, который будет отыгран при попытке открыть дверь.

snd_close_start = Звук, который будет отыгран при попытке закрыть дверь.

snd_close_stop = Звук, который будет отыгран, когда дверь захлопнется до конца.

Примеры:
Если нужно сделать дверь, которая при каком-то событии открывается со щелчком, то можно воспользоваться полем snd_init и переключением схем. В примере ниже при включении схемы ph_door@unlocked проиграется snd_init, т.е. trader_door_unlock:

[logic]
active = ph_door@locked

[ph_door@locked]
locked = true
snd_open_start = trader_door_locked
on_info = {+esc_trader_can_leave} ph_door@unlocked

[ph_door@unlocked]
locked = false
snd_init = trader_door_unlock
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop
файл \gamedata\scripts\ph_door.script

3.10.2. Схема работы кнопки, секция [ph_button]

При нажатии на кнопку переключает секции и выдает инфопоршн.

[logic]
active = ph_button@locked

[ph_button@locked]
anim_blend = false
anim = button_false
on_press = ph_button@unlocked %+cit_jail_door_opened%

on_press – что происходит при нажатии
anim – анимация, которая отигрывается при нажатии на кнопку
anim_blend – плаваня, сглаженная анимация. Может принимать знаечения true\false

Файл \Gamedata\scripts\ph_button.script

  • tooltip - gредназначено для того, чтобы задавать текстовую подсказку при наведении на кнопку. Текстовая подсказка нужна для того, чтобы как минимум было понятно, что этот девайс можно нажимать.

Пример настройки кнопки:

[logic]
active = ph_button@active

[ph_button@active]
anim = lab_switcher_idle
tooltip = tips_labx16switcher_press
on_press = ph_button@deactivated %+terrain_test%

[ph_button@deactivated]
anim = lab_switcher_off

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

<string id="tips_labx16switcher_press"> 
<text>Чтобы отключить чудо установку нажмите ($$ACTION_USE$$)</text>
</string>

Вот пример кнопки, которая срабатывает не всегда, а по определенному условию:

[logic]
active = ph_button@locked

[ph_button@locked]
anim = button_false – анимация несрабатывания кнопки.
on_info = {+val_prisoner_door_unlocked} ph_button@unlocked
on_press = ph_button@unlocked %+val_prisoner_door_unlocked%

[ph_button@unlocked]
anim = button_true
on_info = {-val_prisoner_door_unlocked} ph_button@locked
on_press = ph_button@locked %-val_prisoner_door_unlocked%

Категория: Работа со скриптами | Добавил: drweb66 (29.01.2012)
Просмотров: 3038 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
PDA
Поиск
Как вы думаете,
В какой мод вы сейчас играете?
Всего ответов: 416
Сообщения
Разное
AP production - видео обзоры модов для игры S.T.A.L.K.E.R.

На территории Зоны: 1
Отмычек: 1
Опытных ходоков: 0


Design by:
Guenplenтм, with the participation of Orlenok Design Studio ®
Правообладателям
2024