Язык программирования LUA. Скрипты.

Архив старых тем форума, потерявших актуальность.
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Язык программирования LUA. Скрипты.

Сообщение Света »

Всем доброго дня :)

Как-то так сложилось, что в разделе по разработке дополнений отсутствует тема, затрагивающая вопросы скриптования. Если описание основ языка программирования Lua можно запросто найти в сети, то практическое применение этого удобного и гибкого инструмента, а самое главное - описание опыта работы с ним в рамках разработки дополнений в RW, как правило, остаются в стороне.

Поэтому у меня возникла мысль создать соответствующую тему, где можно было бы описать сам язык Lua, основы работы с ним, а также основные положения использования его в разработках. Некоторые наработки есть у меня, возможно ещё кто-нибудь пожелает внести свой вклад.

Я думаю, что самый правильный вариант оформления - прятать "главы" под спойлерами. ИМХО, это самый удобный метод для поиска.

Но самая большая трудность - это систематизировать информацию, оформить в доступном виде для интересующихся любого уровня подготовки, ну и самое главное - оттестировать представленные примеры и утверждения, чтобы не допустить ошибок, которые встречаются чаще, чем хотелось бы. На всё это нужно потратить немало усилий и времени. Поэтому, чтобы выяснить, есть ли действительная необходимость в этих затратах, приглашаю всех принять участие в опросе. Поверьте, каждый голос очень важен.
Если по результатам опроса будет очевидна востребованность этой темы, я этот пост перепишу. В противном случае буду просить уважаемую администрацию форума удалить тему.

Приветствуются любые предложения и рекомендации :) .

Спасибо за внимание.
Последний раз редактировалось Света 06 мар 2017, 13:00, всего редактировалось 1 раз.
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Язык программирования LUA. Скрипты.

Сообщение Cross »

Света
Хорошая тема, нужная. Действительно полезных практических и толковых пояснений нигде нет, додумывайся сам, как говорится. Я думаю, что каждый может вносить что-то своё, а в теме, прямо в первом посте размещать посты пользователей (от простого к сложному и разбив их на категории)
*Train Simulator 2018*
Изображение
Аватара пользователя
AgentOracle
Эксперт
Эксперт
Сообщения: 574
Зарегистрирован: 27 авг 2015
Откуда: Оренбургская область, г. Орск
Репутация: 360

Re: Язык программирования LUA. Скрипты.

Сообщение AgentOracle »

Надо ещё сделать выбор: "Не знаю, я обычный игрок, этим не интересуюсь" =D
Аватара пользователя
taurus1016
Мастер
Мастер
Сообщения: 418
Зарегистрирован: 26 янв 2012
Откуда: Москва
Репутация: 326

Re: Язык программирования LUA. Скрипты.

Сообщение taurus1016 »

Да, очень нужна. С разбором примеров. Скрипт локомотивного светофора, в том числе, показать, желательно. :)
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

Всем доброго дня :)

Похоже, востребованность в тематике скриптования значительно ниже, чем мне показалось. Семь человек - это, конечно же, очень мало.

Ну что же, не вижу смысла в существовании данной темы, предлагаю её удалить :unknown:
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Аватара пользователя
animalkosmik
Ветеран
Сообщения: 3678
Зарегистрирован: 05 окт 2011
Репутация: 8717

Re: Язык программирования LUA. Скрипты.

Сообщение animalkosmik »

на самом деле 7 человек -это даже много, в том же Trainz при большом разнообразии и количестве разработчиков, скриптёров как раз где-то около 7 :)

так что тема будет очень полезной для тех, кто хочет заниматься скриптованием :wink:
Изображение
Romazan67
Активный
Активный
Сообщения: 64
Зарегистрирован: 28 мар 2014
Откуда: Смол. область
Репутация: 104

Re: Язык программирования LUA. Скрипты.

Сообщение Romazan67 »

Выскажу свое small opinion с трех сторон.

Сторона продвинутого новичка (ибо другим не интересно). Я как обычный пользователь не имеющий в своем распоряжении модель и плохо понимающий в скриптах, могу их просмотреть. Я знаю для чего они нужны и как их использовать (кнопки, тифон, тормоза и прочее);

Сторона разработчика: У меня есть модель, я плохо понимаю в скриптах и не могу их просмотреть и использовать. Что бы их использовать, я должен познакомиться с "местными жителями" и не факт что поделятся скриптами;

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

Итог: Я так думаю, что с одной стороны: новички не хотят/стесняются/прочее знакомится с "местными жителями". А с другой, скрипты не выкладываются по причине труд не должен быть бесплатен. Может поэтому скрипты есть, а возможности использовать их нет ? Просветите, если что не так.
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

с одной стороны: новички не хотят/стесняются/прочее знакомится с "местными жителями". А с другой, скрипты не выкладываются по причине труд не должен быть бесплатен
Здесь хочу немного уточнить.
Почему новички опасаются знакомства, я могу написать, но не буду. Ведь цель не в этом. Многие причину знают. Я лучше затрону сторону труда.
Я не знаю, сколько здесь пользователей, имеющих хотя бы общее представление о программировании. Думаю, что много. Уж точно не один или два человека. И не десять. И я думаю, они меня поддержат в главном тезисе - невозможно научиться писать хорошие программы, взяв чужой код.
Объясню на примере. Вот приходите Вы в магазин и видите очень хороший костюм. Если Вы его осмотрите, перещупаете каждый шов - сможете ли после этого пошить костюм другого дизайна и стиля такого же качества? Конечно же нет. Максимум, что Вы сможете из него взять - это его дизайн или идею. И сможете сделать только копию. А чуть только поменять требования - и Вы в тупике.
В программировании так же. Если я прямо сейчас опубликую все свои разработки - максимум, что смогут сделать другие пользователи, кто слабее меня умеет программировать - это передрать готовые решения. И всё.
Поэтому, если кто-то жмет свой скрипт - это как минимум вызывает мое недоумение, как максимум - я это осуждаю. Я этого не понимаю. Невозможно стать хорошим программистом, посмотрев на программу. И украсть программу невозможно - если человек не рулит в программе, он её не адаптирует, а если рулит, то и красть незачем. Разве нет?
А по поводу оплаты я скажу так. Оплата уместна тогда, когда я разработаю какое-то дополнение под заказ (или напишу скрипт, неважно), а кто-то получит на этом прибыль (в любом виде). Но если я выложу свое дополнение с открытым кодом, разве им от этого будут меньше пользоваться? И разве от этого упадет стоимость моего дополнения? И если кто-то воспользуется моими идеями и сделает в 10 раз лучшее дополнение, разве от этого не выиграют все, в том числе и я? И разве это не будет меня радовать, если я здесь ради удовольствия от симулятора, а не ради того, чтобы срубить денег? Кстати, это и для меня хороший стимул, написать такой крутой код, чтобы меня никто не мог обойти. И опять-таки, от этого выиграют все.

Конечно же, может возникнуть закономерный вопрос - есть ли у меня готовность опубликовать открытые скрипты? Отвечаю - нет, этого не будет. И здесь не стоит вопрос денег. Это принципиальная позиция. Я не буду расписывать все детали, но общий смысл такой: на мою просьбу о помощи с меня тупо поржали. Ни больше не меньше. Мне всё же удалось решить те проблемы, что передо мной стояли. Но ведь если бы всё это делалось сообща, развитие "наших" дополнений шло бы гораздо лучшими темпами. Поэтому, после того, как мне было так чётко показано реальное содружество - как я могу разбазаривать свои идеи и решения?

Но это не мешает мне показать желающим принципы программирования - именно те приемы, которые помогают сделать код простым и вместе с тем же эффективным. А я умею это делать. И я знаю, что найдутся люди, которые это могут подтвердить. Так же я могу объяснить основы программирования - именно то, что надо, чтобы набрать простую строчку и получить результат. Я не хвастаюсь, я пишу как есть.

Но всё же, как ни крути, 7 человек - мало. Мне проще ответить этим людям в ЛС, если у них возникнут какие-то вопросы.
Скрипт локомотивного светофора, в том числе, показать, желательно.
Код, реализующий фильтр и дешифратор я опубликую не раньше, чем увижу, что он не уникален. Позиция принципиальная, причина - выше. Если кто-нибудь нуждается в коде для установки в свою модель - пишите, я помогу. Никакая оплата мне не нужна. У меня есть готовый код, работающий на 5 и 6 версии сигналки, и я могу его адаптировать в любую модель. Но открытым код публиковаться не будет.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Linx
Специалист
Специалист
Сообщения: 213
Зарегистрирован: 07 дек 2014
Откуда: Россия
Репутация: 539

Re: Язык программирования LUA. Скрипты.

Сообщение Linx »

Вот и получается замкнутый круг... исходники не покажем, 7 человек мало и т.д. 7 человек это архи много. Тут не все профи программеры на lua. А кто шарит поймет, что один язык на другой не похож, а время на понимание требует. А время это краеугольный камень для нашего хобби.

Я считаю что надо создавать базу, открытую, для базовых скриптов. Т.е. скрипт алсн в отдельном lua плюс рекомендация по его подключению в модель. Скрипт стеклоочистителя и т.д. но и авторов я понять могу, они вложили силы, время в свое детище. В общем в обозримом будущем ни хрена у нас не будет...
Аватара пользователя
taurus1016
Мастер
Мастер
Сообщения: 418
Зарегистрирован: 26 янв 2012
Откуда: Москва
Репутация: 326

Re: Язык программирования LUA. Скрипты.

Сообщение taurus1016 »

Света писал(а):...Но это не мешает мне показать желающим принципы программирования - именно те приемы, которые помогают сделать код простым и вместе с тем же эффективным. ...
Ну хотя бы так.
Аватара пользователя
BooYa
Разработчик
Сообщения: 317
Зарегистрирован: 17 окт 2015
Откуда: Екатеринбург
Репутация: 439

Re: Язык программирования LUA. Скрипты.

Сообщение BooYa »

7 человек - это действительно очень много. Для РВ разработчиков вобще всего, и ПС и объектов и маршрутов наберется с десяток всего наверное, на такое количество даже 2 скриптера - это много))
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

Вот и получается замкнутый круг...
На самом деле нет никакого круга, ИМХО. Если я не даю исходник конкретного устройства, это не значит, что я не иду навстречу тому, кто просит меня о помощи. Пусть отпишется тот, кто обратился ко мне за помощью и получил отказ, мне самой интересно посмотреть, кто это будет. И мое предложение этой темы - лишнее доказательство, что я как раз хочу сделать так, чтобы никаких замкнутых кругов не было.
надо создавать базу, открытую, для базовых скриптов
Обоими руками ЗА. Но кто на это пойдет? Может мне кто-нибудь показать, где в общем доступе выложены базовые модули для тормозов, для тяги, для той же АЛСН? А ведь они есть, и я об этом знаю. Почему эти модули стали достоянием группы "избранных"? До тех пор, пока есть такие группы, эта проблема будет существовать. Пусть хоть кто-то назовет хоть одну убедительную причину, с какой радости мне стоит показывать своё решение тому, кто перед этим практически послал меня? Теперь у меня есть и модуль для тяги, и для АЛСН. Для тормозов пока нету, не было необходимости. Но почему я буду давать свою работу тому, кто уже давным-давно обладает кодом, делающим то же, но по непонятным причинам его прячет? Конечно, если бы была база для скриптов, мне не пришлось бы делать лишнюю работу, и можно было бы потратить время на что-то другое, не менее нужное. Но вот такая ситуация.
и авторов я понять могу, они вложили силы, время в свое детище
А я не могу. И так как я тоже автор уже не одного скрипта, я могу рассуждать объективно. Сам по себе скрипт без конкретной модели - это набор символов. Взять хоть тот же дефолт, где есть куча открытых кодов на любой вкус - и локомотивы, и светофоры, и инфраструктура. И что, много скриптеров на этом воспиталось? Поэтому, если кто-то жмет без видимой причины код, то это королевское величие и ничего другого. ИМХО.
Спойлер
А насчет АЛСН я дополню. Наверняка мне будет тонна матов в личке и куча ненависти, но мне стыдится нечего. Когда у меня были некоторые трудности с разработкой взаимодействия сигналки и локомотива и мне понадобилась помощь, мне на мою просьбу была показана огромная фига. Почему - не знаю. Возможно, это был страх, что я украду какие-то идеи. Неважно. Важен сам факт. Но я хороший программист, пишу без всякой ложной скромности. Мне удалось обойти все те грабли. И достаточно быстро. Теперь же мне интересно, как эти грабли обойдут те "избранные". А им приходится это делать уже не один месяц. Это единственная причина, почему я не выпущу из своих рук исходник. Но так как у меня претензия только к нескольким людям, я не стаю в оппозицию к остальным. Поэтому, повторяюсь, я охотно помогу тем, кто будет нуждаться в моей помощи.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Romazan67
Активный
Активный
Сообщения: 64
Зарегистрирован: 28 мар 2014
Откуда: Смол. область
Репутация: 104

Re: Язык программирования LUA. Скрипты.

Сообщение Romazan67 »

Подолью масла в огонь.
Света писал(а): И сможете сделать только копию.
...на мою просьбу о помощи с меня тупо поржали. (личная неприязнь, повлиявшее на принятие решение не публиковат код)?
А с другой стороны: "Если кто-нибудь нуждается в коде для установки в свою модель - пишите, я помогу". Меня эта двоякость смущает.
Linx писал(а):Я считаю что надо создавать базу, открытую, для базовых скриптов. Т.е. скрипт алсн в отдельном lua плюс рекомендация по его подключению в модель. Скрипт стеклоочистителя и т.д. но и авторов я понять могу, они вложили силы, время в свое детище. В общем в обозримом будущем ни хрена у нас не будет...
Базовых (скопированных) скриптов, наверно, будет вполне достаточно.

Как-то так связал эти два сообщения.
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

Romazan67
Дело не в личной неприязни, мне не 10 лет, чтобы мной управляла какая-то обида. А в том, что сложилась такая система взаимоотношений между разработчиками и новичками/пользователями, которая меня не устраивает. Эта система является главным тормозом развития симулятора, ИМХО. Вот только я не плюю на других с высоты своего трона, а предлагаю реальную помощь, потому что мне не безразлична судьба симулятора, и я понимаю, что чем больше разработчиков, тем больше прогресс.

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

К тому же я очень сомневаюсь, что в ближайшем обозримом будущем в этом возникнет необходимость.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Linx
Специалист
Специалист
Сообщения: 213
Зарегистрирован: 07 дек 2014
Откуда: Россия
Репутация: 539

Re: Язык программирования LUA. Скрипты.

Сообщение Linx »

Свет, давать или не давать это дело твое конечно. Но если ты тему создала, не надо опрашивать людей, хотят или нет. возьми для примера любой простейший скрипт. Да хоть тот, который свяжет кнопку в кабине с загоранием лампочки к примеру. и на примере пояснить, как организовать структуру файла, синтаксис кода, подключение этого модуля, инициализацию, опрос посекундный и т.д. самую основу.
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

Linx, совершенно верно. Примеры необходимы. А как следует из названия темы, речь шла о самом языке, его особенностях. А самое главное, мне хотелось показать все те грабли, на которые мне посчастливилось наступить, чтобы никто другой на них не наступал. Ну и если бы кто-то поделился здесь своим опытом, это тоже пригодилось бы. Я именно так понимаю смысл сообщества. А объяснить какой-нибудь момент без примера проблемно, что автоматически означает разбор конкретных программ. Но опрос шел в ключе "хотите ли вы освоить скрипты", а не "хотите ли вы увидеть исходник чего-либо".
Так как был затронут вопрос публикации исходников и подведена финансовая составляющая, мне пришлось отписать по этому поводу. Хотя, по-сути, это всё никому не нужный офтоп.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
le Sandro
Разработчик
Сообщения: 705
Зарегистрирован: 15 фев 2012
Откуда: Пенза
Репутация: 462

Re: Язык программирования LUA. Скрипты.

Сообщение le Sandro »

Есть такое понятие: Объекто-ориентированное программирование. LUA - язык на 80% основанный на С/С++. Так вот, что значит ООП, Простейшие функции, как зажигание кастомной лампочки через кусок кода, либо срабатывание триггера на проигрыш звука при наезде на невидимый объект, либо отображение какой-либо инфы при проследовании невидимого маркера(элемент КЛУБа) и пр.
Это всё должно быть структурировано в виде FAQ. Не нужно выкладывать комбинированные скрипты, для новичков они сложнее читаются, да и профам разбирать их будет достаточно сложно.
Я весьма неплохо знаю С/С++ на системном уровне (пишу скрипты для своих серверов на работе), знаю паскаль, но понятия не имею, как прикруить LUA-скрипты в графическим объектам в рв, например, к элементам кабины.
Мы с PNZ.
Аватара пользователя
Света
Разработчик
Сообщения: 752
Зарегистрирован: 13 мар 2015
Репутация: 1470

Re: Язык программирования LUA. Скрипты.

Сообщение Света »

le Sandro писал(а):...срабатывание триггера на проигрыш звука при наезде на невидимый объект, либо отображение какой-либо инфы при роследовании невидимого маркера(элемент КЛУБа) ...
Мне понравилась идея воспроизведения звука при наезде на линк. Это намного лучше, чем писать скрипт к сценарию. По крайней мере, для меня.

Поэтому мне захотелось разработать универсальный маркер (универсальный в том смысле, что один маркер можно использовать в любом сценарии для воспроизведения любого трека). Так как проект завершен успешно, я опубликую маркер в "Свои изобретения", а здесь предоставлю основу его работы - скрипт. Так как для меня изначальной целью было описание работы скрипта, пришлось пожертвовать простотой написания ради наглядности. Также есть некоторая избыточность. На самом деле этот код можно было написать чуть практичнее. Хотя на работе это не скажется, так как большая часть кода исполняется всего лишь один раз за сценарий.

Описание рассчитано на пользователей, имеющих общие понятия о программировании.
Спойлер
Любая программа начинается из объявления используемых констант и переменных. Несмотря на то, что Lua позволяет обойтись без предварительного объявления (инициализации) переменных, я предпочитаю всё-же это делать. Потому что если в процессе выполнения программы какая-нибудь переменная будет вызвана для каких-либо действий до того, как получит конкретное значение, будет ошибка.
начальная инициализация переменных производится в функции Initialise () - системная функция симулятора, вызываемая в начале сценария.
Я объявляю в этой функции переменные, которые буду использовать в дальнейшем.
Так же я с самого начала собираю всю необходимую информацию для работы маркера.
В первую очередь в строке 21 я делаю запрос, по которому в переменную Data будет помещена информация, введенная в окошко "Speed limit" маркера. После этого я делаю очень простые проверки, цель которых определить, корректные ли данные в окошке, и есть ли они там вообще (корректность и обработка данных производится в функции SetData (Data)). Если проверка показывает ошибку, выводится всплывающее окошко с предупреждением, а переменная Executed получает значение "да", то есть "выполнено" (это для того, чтобы запретить использование некорректных данных). Если ошибка не выявлена, функция Initialise () завершается без предупреждений.

Функция SetData предназначенная для разделения строки из переменной Data на 3 компонента - ID текущего сценария, контрольная метка, имя звукового файла.
Так как ID сценария - это фиксированное количество символов, я его отделяю стандартной функцией Lua, предназначенной для извлечения из строки фрагмента. Для этого я в строке 91 даю команду на отделение куска с 1 по 36 символ включительно. Результатом этого в переменной ScenarioID окажется ID сценария в строчном формате.
Следующим символом после ID сценария должна быть запятая. Если ID сценария введен верно, то запятая будет 37 по счету от начала всей строки. Я отделяю этот символ в переменную ControlChar.
После запятой должно быть имя воспроизводимого файла. С его извлечением есть некоторое затруднение - можно определить расположение первого символа, но невозможно предсказать, сколько символов будет в самом имени. Можно, конечно, установить жесткое правило на наименование файлов, чтобы количество символов было предопределено. Но это неправильный подход, усложняющий использование маркера. Я применяю другой метод - с помощью стандартной функции Lua определяю общую длину обрабатываемой строки. Благодаря этому я могу безошибочно извлечь в переменную AudioFileID имя файла произвольной длины.
Дальше происходит простейшая проверка корректности данных. Если переменная ControlChar содержит запятую, можно сделать вывод, что ID сценария введен без ошибок. Если же это не так, в 96 строке отмечается ошибка.

Функция Update не используется. Единственная команда, которая есть - запрет на работу этой функции. Это просто перестраховка. Вдруг из-за какой-то ошибки случится вызов этой функции, она просто снова отключится.

Функция OnSignalMessage просто пересылает все принятые сообщения инфраструктуры дальше в обоих направлениях (за исключением системного сообщения сброса - это сообщение на пересылается, так как в этом никогда нет необходимости). Благодаря этому маркер не блокирует обмен между светофорами.

функция OnConsistPass является основным контроллером условия срабатывание маркера. Когда локомотив проезжает через линк в прямом направлении, в результате выполнения условий из строк 66-76 на срабатывание попадает ветка из строки 77. Если переменная Executed находится в состоянии отрицания, т.е. не равно "true" (это будет только в том случае если эта ветка ещё ни разу не выполнялась и не было распознано ошибки в самом начале), то выполняется системный вызов на воспроизведение звука. Аргументами вызова являются информация о текущем сценарии (ScenarioID) и имя необходимого звукового файла (AudioFileID). После этого переменная Executed получит значение "true", тем самым запретив выполнение этого вызова ещё раз.
le Sandro писал(а):...Это всё должно быть структурировано в виде FAQ
Почему бы и нет? Если у кого-нибудь будут вопросы, на которые можно сформулировать компактные ответы, я помещу пару "вопрос-ответ" в шапку темы. Если не смогу ответить я, возможно, ответит кто-то другой.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Сильные люди - это не те, у которых всё хорошо, а те, у которых всё хорошо несмотря ни на что.
Tractorist
Новичок
Сообщения: 6
Зарегистрирован: 09 апр 2016
Откуда: exUSSR
Репутация: 23

Re: Язык программирования LUA. Скрипты.

Сообщение Tractorist »

Здравствуйте. А не подскажите каковы возможности lua скрипта локомотива? Можно ли полностью выполнять расчет тяги в скрипте и выдавать для симулятора? Возможно ли заменить стандартные тормоза на скриптованные?
Аватара пользователя
Cross
Разработчик
Сообщения: 6330
Зарегистрирован: 14 дек 2011
Откуда: Москва
Репутация: 2985

Re: Язык программирования LUA. Скрипты.

Сообщение Cross »

Tractorist
скрипты дают практически безграничные возможности, но что-то всё-таки упрётся в возможности движка. Тем не менее то, что вы хотите - это возможно и реализуемо.
*Train Simulator 2018*
Изображение
Закрыто