Как перевернуть стол в tabletop simulator
TableTop Simulator - это единственный симулятор, где вы можете выпустить свою агрессию, перевернув стол! Нет никаких правил, которым нужно следовать: только вы, цифровая песочница и ваши друзья. Создавайте свои собственные игры и играйте так, как вам хочется! Неограниченные игровые возможности! (перевод описания из Steam)
На мой взгляд, описание настолько ужасно, что отпугивает.
На самом деле «симулятор стола» очень классная… игра.
Возможности симулятора, по настольным играм, действительно практически безграничны. Ну, и как нас учат рулбуки к играм, правила всё же есть, плюс соблюдать вежливость ни кто не отменял.
Сейчас мы все сидим дома, либо нас разделяет расстояние, или есть ещё какие на то причины, что нет возможности встретиться в живую и поиграть.
Вот именно эти проблемы и решает ТТС.
Я давно знаком с ТТС (года 2-3), но за это время кол-во друзей «играющих» в него можно сосчитать по пальцам одной руки, максимум по пальцам второй руки наберётся, кто хотя бы слышал о нём.
Установка
2. Нужно купить сам TableTop Simulator.
На момент написания 419руб. Так же, на него часто идут распродажи/скидки.
3. Нужно поставить «мод» Легиона:
В мастерской по поиску, так и ищем — Star wars Legion.
Просто подписываемся на мод (бесплатно).
4. Всё. Для игры всё готово, запускаем.
Запускаем
2. Создаём игру (либо присоединяемся, если уже оппонент создал):
Нас интересует в данном случае Легион, его и выбираем. Стол загружается:
На самом деле, всё достаточно интуитивно понятно в моде, он сделан очень хорошо, но для ознакомления, я вам щас всё покажу.
Создание ростера
2. Создаём армию и выбираем фракцию. Появляются такие планшеты/органайзеры под каждый юнит.
Гайд по достижениям
Хочу заметить, что данное руководство является всего лишь переводом. Разрешение от автора у меня есть. Ссылку на оригинальный гайд и его автора оставлю в самом конце.Перевороты стола не засчитываются? RPG фигурки не атакуют? Этот гайд поможет с достижениями в Tabletop Simulator!
Введение
В этой игре есть всего 27 достижений. Все они довольно просты в получении, но если вдруг возникнут трудности, то это руководство поможет тебе.
Для новичков, здесь есть вид игры непосредственно из неё:
Достижения при обучении
Did you do it?
Заверши обучение в игре.
– Выбери “Tutorial” в главном меню игры и следуй инструкциям.
Speed Machine
Заверши обучение меньше, чем за 30 секунд.
– На первый взгляд это достижение может показаться сложным, но не сдавайся, и ты обязательно получишь это достижение.
Достижения одиночной игры
Все из этих достижений могут быть получены как в одиночной игре, так и в мультиплеере.
Attack of the Figurines!
Одна RPG фигурка должна атаковать другую.
– Выбери “Games”, затем “Classic”, и после этого “RPG”. Подвинь одну фигурку к другой. В то время, как эта фигурка выделена (наведи курсор на неё), нажми цифру 2 на клавиатуре или цифровой клавиатуре для выполнения атаки.
Color me pretty
Перекрась 1000 объектов в разные цвета.
– Щелкни правой кнопкой мыши на объект и выбери “Color Tint”. Затем выбери цвет на палитре.
– Самый быстрый способ сделать это: запусти игру, которая имеет много объектов (китайские шашки, RPG и т.д.), выбери одновременно как можно больше объектов. Потом щелкни правой кнопкой мыши, выбери “Color Tint” и выбирай различные цвета на палитре.
– Ты НЕ МОЖЕШЬ покрасить объект, отмотать время назад и снова покрасить тот же объект. Это не будет засчитано.
Confidential
Используй твою личную цветную страницу в записной книжке.
– В верхней части экрана, выбери “Notebook”. Когда блокнот появится, нажми на ячейку с надписью “White” (или любой другой цвет), чтобы открыть свою личную страницу блокнота.
Don’t Touch!
Заблокируй 5000 объектов за всё время.
– Чтобы заблокировать объект, наведи курсор на объект, чтобы выделить его. Затем нажми клавишу L, чтобы зафиксировать его. Можно также щелкнуть правой кнопкой мыши по объекту и установить флажок “Lock”, который находится в списке “Toggles”.
– Самый быстрый способ сделать это: запусти игру, которая имеет много объектов (китайские шашки, RPG и т.д.), выбери одновременно как можно больше объектов. Потом щелкни правой кнопкой мыши, и нажимай на кнопку “Lock” без остановки, пока не получишь достижение.
– Ты НЕ МОЖЕШЬ зафиксировать объект, отмотать время назад и снова зафиксировать тот же объект. Это не будет засчитано.
Money, Money, Money
Заспавни 10,000 покерных фишек!
– Самый быстрый способ получить это достижение – начать игру в “Poker” и выделить все фишки, а затем сочетанием клавиш Ctrl + C и Ctrl + V копировать их и вставлять до момента получения достижения.
– Стек фишек считается за одну фишку, поэтому лучше разложить стек на отдельные фишки, чтобы получить достижение чуть быстрее.
Rage Quit
Переверни стол в абсолютной ярости … 100 раз.
Ultimate Rage
Переверни стол 1000 раз.
– Самый простой способ получить оба достижения с переворотами стола: выбери в “Games” одну из перечисленных классических игр. Затем нажми на “Flip table” и повторяй до того момента, как не получишь достижение.
– Перевороты стола будут засчитываться, даже если ты будешь продолжать нажимать “Flip Table” после того, как ты уже перевернул один стол. В чате всё равно будет написано, что стол перевёрнут.
Space Time Fun
Сыграй в игру при нулевой гравитации.
– Выбери “Host”, потом “Options”. Поставь значение “Gravity Multiplier” на 0. Сохрани всё это дело кнопкой “Save & Exit”.
Surprise!
Ты заспавнил специальные фигурки разработчиков!
– Выбери “Host”, затем “Chest”. Потом выбери “Figurines”. Кликай на все фигурки, пока не получишь достижение.
Treasure Trove
Сохрани 100 объектов в сундук.
– Чтобы сохранить объект в сундук, нажми правой кнопкой мыши на объект и выбери “Save to Chest”. Появится окно с запросом имени объекта. Введи что-то (если это название не было использовано ранее) и выбери пункт “Save”.
– Чтобы получить доступ к объекту, сохраненному в сундук, выбери “Host”, затем “Chest”, затем “Saved Objects” в правом нижнем углу.
Wishy-Washy
Поменяй свой цвет 50 раз.
– Выбери “Menu”, затем “Change Color”. Нажми на один из кругов цвета, которые появляются, чтобы изменить цвет.
Достижения мультиплеера
Эти достижения могут быть получены только через многопользовательскую игру. Чтобы присоединиться к многопользовательской игре, выбери “Multiplayer” в главном меню. “Server Browser” покажет список людей, которые хостят игры. “Host Server” позволит тебе создать свою собственную многопользовательскую игру.
Follow the leader
Сыграй в игру с одним из своих друзей.
– Описание сказало всё за меня.
Too weak
Ты попытался перевернуть стол… и не смог!
– Ты должен присоединиться к серверу, на котором опция “Table Flip” на вкладке “Permissions” в разделе “Options” в меню “Host” выключена.
– Ты также должен быть на этом сервере в течение некоторого времени. Ты не можешь присоединиться, мгновенно попробовать опрокинуть стол и уйти. Попытка не будет засчитана.
– Ты не можешь получить это достижение, будучи хостом, так как хост всегда может перевернуть стол.
Complete Set
Сыграй в игру в полной комнате из 8 человек.
– Присоединись к игре, которая имеет максимум 8 игроков из 8 возможных, или создай свою собственную игру и заполни комнату.
Laser Light Show
Создай с помощью 8 игроков “световое шоу” с помощью инструмента рисования линий.
– Будучи в игре с 8 людьми, каждый должен будет использовать инструмент “Line”.
– Нажми клавишу F5, чтобы использовать инструмент “Line”. Зажми и перетаскивай, чтобы сделать линию. Инструмент можно найти на левой стороне экрана, где располагаются значки “Grab”, “Vector Paint”, “Pixel Paint” и т.д.
Достижения мастерской Steam
Sharing is Caring
Ты должен загрузить 3 вещи в Мастерскую Steam.
– Сделай что-нибудь классное: новый стол или карточную игру, карты и т.д.
– Выбери “Menu”, затем “Workshop Upload”. Следуй инструкциям в всплывающем окне.
Достижения, связанные со временем в игре
Все эти достижения можно получить как в однопользовательской игре, так и в мультиплеере, просто оставляя игру включенной.
!ВАЖНО! Время, проведённое в меню, не засчитывается.
Restraint
Играй в игру 1 час без единого переворота стола.
A Spot of Tea?
Сыграй в цивилизованную игру в шахматы в течение 1 часа.
– Выбери “Host”, затем “Games”. Нажимай на “Chess”.
Good Times
Играй в Tabletop Simulator 10 часов.
Faithful
Играй в Tabletop Simulator 50 часов.
Devoted
Играй в Tabletop Simulator 100 часов.
Dedication
Играй в Tabletop Simulator 200 часов.
Addict
Играй в Tabletop Simulator 500 часов.
True Champion
Играй в Tabletop Simulator 1000 часов.
Вывод
Спасибо за прочтение! Надеюсь, что это руководство помогло коллекционерам достижений!
Если вы заметили какую-то ошибку, недоработку, прошу сообщить об этом в комментариях к руководству. Я обязательно исправлю!
Обучение Lua – Руководство для начинающих по написанию скриптов
Изучайте основы как работает LuaЭто первое руководство в этой серии.
Это руководство предназначено для тех, у кого ограниченный опыт работы с LUA. Мы рассмотрим основы того, как оформлять код, строительные блоки для Вас, чтобы создавать более сложный код и предоставим некоторые примеры. Руководство написано так, чтобы сразу применять его на практике. Поэтому Вам следует открыть Tabletop Simulator и Ваш редактор LUA, чтобы следовать дальше.
Это первое руководство в этой серии. Второй – это Изучение Lua Подробнее. Третий представляет собой набор полезных функций под названием Learning Lua Functions.
Перед первым нажатием клавиши
Подготовка
Когда Вы сохраняете свои скрипты в Tabletop, он будет использовать Ваше последнее сохранение, а затем загрузит в него скрипты. Поэтому для любого скрипта, который Вы намереваетесь написать, Вам нужно будет сделать следующее:
- Подготовьте стол так, как Вы этого хотите.
- Сохраните стол.
- Загрузите стол.
Для этого упражнения возьмите пустой стол и создайте два объекта (я использовал квадратный блок и прямоугольный блок), а также красную шашку.
Не забудьте сохранить/загрузить, а затем открыть скрипт в Atom или перейти в Host>Scripting в Tabletop Simulator, чтобы начать.
1) Global.lua
Global.lua – это скрипт, который является частью файла сохранения. Именно здесь мы будем работать над большей частью этого руководства. При новом сохранении он всегда начинается с некоторого текста, сохраненного в редакторе. Просто удалите его, мы его не будем использовать.
Также можно писать скрипты и прикреплять их к объектам вместо Global. Таким образом, если Вы сохраните объект, то сохраниться и его LUA скрипт. Вы можете выполнять большинство функций с использованием скрипты Global или объекта, но мы будем работать в Global.
2) Функции
Часто используемая функция, встроенная в Tabletop Simulator – onload(). Эта функция запускается каждый раз при загрузке скрипта (например, если нажата кнопка Отменить(Undo) / Повторить(Redo), а также во время загрузки сохранений).
Замечу, что все переменные вне функций также инициализируются всякий раз при загрузке скрипта.
Итак, давайте начнем с его использования, чтобы запустить функцию, которую мы создадим. Функции должны начинаться с строчной буквы и не содержать пробелов. Мы будем использовать exampleFunction.
Теперь наш скрипт, когда он загружается, попытается запустить функцию с именем exampleFunction. Но мы еще не писали! Итак, теперь мы создадим нашу собственную функцию сразу после завершения функции onload.
Extra Credit: Когда Вы создаете свою собственную функцию, Вы также можете передавать переменные вместе с ней для их использования функцией. Другой способ написать наше начальное упражнение:
function onload() exampleFunction(‘Hello, World.’) end function exampleFunction(passedString) print(passedString) end
Мы создали переменную для представления строки (passString), а затем напечатали то, что содержалось в этой переменной.
3) Объекты
Чтобы повлиять и на объект, сначала мы должны идентифицировать его в LUA. Существует несколько способов сделать это, например, идентифицировать элементы, которые подбираются или отпускаются игроками, находить объекты в скриптовых зонах и многое другое. Мы будем идентифицировать эти объекты по их GUID.
GUID – это уникальный идентификатор, который имеет каждый сгенерированный элемент в игре. Даже два одинаковых элемента будут иметь разные GUID. Чтобы найти GUID объекта, щелкните по нему правой кнопкой мыши и перейдите к Scripting. Если Вы нажмете на GUID, он скопирует его в буфер обмена. GUID всегда является строкой, поэтому не забывайте, что строки всегда в кавычках. Давайте создадим несколько переменных с идентификаторами GUID наших объектов. ОБРАТИТЕ ВНИМАНИЕ: Ваши идентификаторы GUID будут отличаться от моих.
Затем, создадим переменные для представления наших объектов. Используем функцию onLoad(), чтобы создание происходило при загрузке скрипта. Все эти имена переменных, которых мы делали, должны начинаться со строчной буквы и не содержать пробелов, но, кроме этого, Вы можете свободно сами составлять имена переменных. Используйте такие имена, чтобы было понятно, что объект из себя представляет. Я буду использовать object1, object2 и checker для представления моих Объектов. Функция, которую мы будем использовать для идентификации, будет getObjectFromGUID(строка). Мы помещаем GUID в место для строки.
function onload() object1 = getObjectFromGUID(object1_GUID) object2 = getObjectFromGUID(object2_GUID) checker = getObjectFromGUID(checker_GUID) end
Теперь нам нужно каким-то образом манипулировать этими объектами. Мы дадим им имена. В onload() после определения наших объектов мы будем использовать функцию setName(string). Обратите внимание, что setName, как и другие функции объекта, должна быть привязана к объекту. В противном случае скрипт не поймет, имя какого объекта мы хотим изменить. Строкой в setName будет то, что мы установили для имени.
Если бы вы хотели, то нет причин, по которым вы не могли бы написать для шашки это, так:
Причина, по которой я не одобряю это ученикам является частично эстетическим выбором, и частично для ясности чтения кода. Вы хотите, чтобы кому-то было легко понять Ваш код, и как только вы начнете делать что-то более сложное, чем изменение имени Объекта, может становиться ОЧЕНЬ трудно понять, что происходит. Это улучшает восприятие кода при внесений правок в будущем.
4) Кнопки
Хотя есть много способов активировать функции, кнопки — это весьма удобный способ активировать разделы кода по выбору игрока. Все кнопки должны быть прикреплены к объекту и создаются с использованием параметров. Объект, к которому мы хотим присоединить нашу кнопку – это наша шашка, и эти параметры находятся на странице “Objects” в Knowledge Base. Многие являются необязательными, здесь они для справки.
- click_function = Строка –Имя вызываемой функции.
- function_owner = Объект –Объект или Global, где находится функция.
- label = Строка –Название на кнопке.
- position = Таблица –Координаты X, Y и Z, для которых отображается кнопка, от центра объекта, к которому он присоединен.
- rotation = Таблица –Поворот по осям X, Y и Z в градусах относительно объекта, к которому он привязан.
- width = Число –Ширина кнопки по отношению к масштабу объекта.
- height = Число –Высота кнопка по отношению к масштабу объекта.
- font_size = Число –Размер шрифта на кнопке относительно масштаба ее объекта.
- scale = Число –Масштаб кнопки по отношении к ее объекту.
Таблицы в LUA – это динамический гетерогенный ассоциативный массив, то есть множество пар (ключ-значение). Вы можете хранить все что угодно внутри таблицы и ссылаться на нее позже в таблице по имени или по номеру индекса (в LUA нумерация индексов в таблице начинаются с 1). Все таблицы обозначаются фигурными скобками <>. Мы создадим таблицу прямо под тем, где мы установили наши GUID, а затем заполнили ее записями для использования с функцией createButton(table). Название, которое мы выбираем для нашей таблицы это button_parameters.
button_parameters = <> button_parameters.click_function = ‘buttonClicked’ button_parameters.function_owner = nil button_parameters.label = ‘Press Me’ button_parameters.position = <0,0.8,0>button_parameters.rotation = button_parameters.width = 500 button_parameters.height = 500 button_parameters.font_size = 1000,0.8,0>
Теперь мы имеем параметры, то есть таблицу со значениями. Используем функцию объекта, чтобы создать кнопку на шашке. Запишите это внутри функции onload().
Повторно нажимайте его, потому что, конечно, вы это сделаете.
EXTRA CREDIT: Когда вы создаете таблицы, есть несколько способов сделать это[link]. Способ, используемый здесь, заключался в том, чтобы обеспечить визуальную ясность. Однако такой способ создания параметров кнопки, как этот, занимает не мало места, если у Вас будет много кнопок. Я предпочитаю создавать свои таблицы таким образом, чтобы экономить место, но не выходить за правых край. Используя наш пример, я бы создал таблицу параметров следующим образом:
EXTRA CREDIT: Это идеальный момент для начала игры с разными вещами, которые вы можете делать с объектами. Перейдите на страницу «Объект» в Knowledge Base и попробуйте материал. Двигайте объекты, заставляйте их переключаться на позиции, менять их цвета, что бы вы ни думали.
EXTRA CREDIT: Кроме того, при каждом нажатии кнопки функция click_function запускается с двумя параметрами. Первая – это ссылка на объект, в частности ссылка на объект, к которому привязана кнопка. Второй – это цвет (например, “Blue” – синий) в строчном формате цвета игрока, который нажал на кнопку.
5) Логические утверждение
Вы также можете добавить к нему “else”, так что если утверждение ложно, вместо этого происходит что-то ДРУГОЕ (else). Обратите внимание, что я добавил комментарии, используя два минуса подряд. Компилятор игнорирует что-либо на линии после –.
if CONDITION then –Активируется если условие было истинно else –Активируется если условие было ложно end
Мы попробуем несколько из них. Удалите текущее содержимое в Вашей функции buttonClicked(). Теперь введите в эту функцию следующие утверждения:
if 5 > 6 then print(“5 is greater than 6”) –5 больше, чем 6 end if 6 > 5 then print(‘6 is greater than 5’) –6 больше, чем 5 end if 5 == 0 then print(“Five is equal to ZERO?!”) –Пять равно НУЛЮ?! else print(“No, five isn’t equal to zero.”) –Нет, пять не равно нулю. end
Еще раз удалите все скрипты внутри функции buttonClicked(). Мы собираемся создать новую переменную, а затем изменить ее. Новая переменная будет булевского типа. Булевские значения могут быть только true, false. Булевские значения всегда записываются маленькими буквами. Во-первых, мы создадим нашу переменную под нашим идентификатором GUID объектов и шашки.
Затем, в buttonClicked, мы установим некоторую логику, чтобы проверить, истинно ли значение trueOrFalse. Если оно истинно, то будет печатать, что это Истина, и переключит его на Ложь. Если кнопка снова нажата, будет печатать, что это Ложь, и переключит значение на Истина.
if trueOrFalse then print(‘trueOrFalse was true.’) –trueOrFalse была истина. trueOrFalse = false else print(‘trueOrFalse was false.’) –trueOrFalse была ложна. trueOrFalse = true end
Мы могли бы также написать это так “if trueOrFalse == true then”, но это необязательно. Помните, что оператору IF нужно передать булевское значение. И так как trueOrFalse уже является одним из таких, мы можем отпустить “== true”.
6) Циклы
Цикл – это секция кода, которая могут запускаться несколько раз. Это один из более сложных элементов, которые Вы будете использовать в LUA. Они часто идут со таблицами, позволяя запускать код для каждой записи в таблице.
Какой вывод будет после нажатия на кнопку:
Это ещё один тип – ipairs. Pairs нужны для таблиц без числовых ключей, а ipairs нужны для таблицы с последовательными числовыми ключами (массивы). ipairs идет по порядку, когда pairs может идти в любом порядке.
7) Скрипты за пределами Global
Чтобы написать скрипт непосредственно в объект, щелкните на него правой кнопкой мыши, перейдите в Scripting и выберите Lua Editor (если Вы используете Atom, это откроет для него окно в Atom).
Когда вы пишете код здесь, это похоже на global. За исключением случаев, когда Вам нужно ссылаться на объект, частью которого является скрипт, вы просто пишете “self”. Чтобы создать кнопку на себе, вы должны использовать self.createButton(table_of_paramiters).
Завершение
Надеюсь, что это введение в LUA помогло Вам лучше понять некоторые основные механики написания скриптов.
Помните, что в Knowledge Base есть информация обо всех функциях, которые входят в состав Tabletop Simulator. Это и базовая практика с if, else, then и for позволит Вам выполнить большинство всего, что Вы хотите. Удачи.
Как перевернуть стол в tabletop simulator
ЧАСТЬ ПЕРВАЯ. Скачивание и установка Tabletop Simulator
(Если у вас уже установлена эта программа, можете сразу переходить ко второй части.)
3. Отключите антивирус на время установки игры. Да, это обязательно. Если вы морально не готовы этого делать и боитесь — вероятно, это руководство не для вас. (От себя лишь добавлю, что все содержимое этой раздачи на 100% безопасно, проверено на куче людей, никто не умер.)
4. Смонтируйте скачанный файл sr-tsmistfall.iso при помощи Alcohol 120%, или UltraISO, или Daemon Tools. Подробные руководства по этим программам также найдете в Гугле. Запустите установку и следуйте инструкциям инсталлятора.
5. Зайдите в «Компьютер», нажмите правой кнопкой мыши по виртуальному приводу, выберите «Открыть». Содержимое папки SKIDROW перенесите в корень папки с игрой. Это «кряк», без которого пиратская версия не будет работать через интернет.
6. Зайдите в корень папки с установленной игрой, откройте файл steam_api.ini при помощи Блокнота и найдите строчку PlayerName = SKIDROW. Это ваш никнейм по умолчанию, замените его на что-нибудь другое.
7. Запустите установленный TTS. В главном меню выберите «Configuration», и во вкладке «Game» установите параметр «Mod Save Location» на «Game Data». (Этот параметр указывает, где будут храниться файлы ваших настольных игр — в папке «Мои документы» или в папке с самой игрой. Лучше хранить все в папке с игрой.)
8. Закройте Tabletop Simulator.
ЧАСТЬ ВТОРАЯ. Скачивание и установка «Древнего Ужаса»
Вначале немного теории.
Все настольные игры для Tabletop Simulator состоят, условно говоря, из двух частей. Первая — это json-скрипт, крошечный текстовый документ, содержащий системные инструкции для TTS. Это своего рода «индекс», «алфавитный указатель» будущей игры, а не сама игра. Вторая часть — это кэш игры (cache), большое хранилище всех текстур, моделей и прочих компонентов. При первом запуске игры TTS считывает информацию из json-скрипта, загружает из интернета все необходимые компоненты и в дальнейшем хранит кэш на компьютере, подгружая с жесткого диска.
В данном руководстве я предлагаю вам сразу и json-файл, и кэш.
Хватит теории. К делу.
2. Распакуйте его в любое удобное место. (Для распаковки архива используйте WinRAR, или WinZip, или 7z — подробности в Гугле.)
Внутри него несколько файлов и папок:
- папка «PRAVILA» содержит PDF-файлы правил игры. Для установки и игры в TTS они нам нам не понадобятся, добавлены в архив для удобства;
- файлы Drevniy_Uzhas_+6_addons_RUS_01.jpg (02, 03 и т. д.) — скриншоты игры. Также не понадобятся, добавлены для наглядности.
- Папка «Mods» — основная папка с игрой, далее мы будем работать только с ней.
3. Откройте папку с установленной игрой, пройдите по адресу: \Tabletop Simulator - Mistfall\Tabletop Simulator_Data\Mods\
Если папки Mods не существует, создайте ее сами.
Перенесите в эту папку все содержимое папки «Mods» из распакованного архива. Там должно быть три папки: «Images», «Models», «Workshop».
Если по конечному адресу уже есть такие папки, подтвердите слияние содержимого.
4. Проверьте правильность проделанных операций. Теперь в папке с установленной игрой по адресу: \Tabletop Simulator - Mistfall\Tabletop Simulator_Data\Mods\ у вас должно лежать ТРИ папки:
- Images (с кучей картинок внутри);
- Models (внутри — примерно полтора десятка obj-файлов);
- Workshop (внутри — файл «Drevniy_Uzhas_+6_addons_RUS.json», также может быть папка «Thumbnails», но может и не быть, некритично).
Все три папки должны лежать рядом друг с другом, а не внутри друг друга!
Читайте также: