Gamemaker studio 2 — new functions list

Расширения

Если вам не хватает встроенных функций движка GameMaker, не волнуйтесь; он расширяемый! Бесплатная версия не позволяет использовать расширения, но в платной версии это возможно.

Что могут делать расширения?

Расширения добавляют новую функциональность, изначально не предусмотренную YoYo games. Вот некоторые примеры:

GiiMote — позволяет разработчику интегрировать WiiMote элементы управления в свою игру, добавляя функции, которые опрашивают состояние WiiMote (положение и нажатие кнопок).

FX Creator Extension — упрощает создание таких эффектов, как погода, лучи и брызги воды.

Взаимодействие с базами данных с помощью SQL — позволяет вашей игре подключиться к базе данных SQL, получить данные в виде строки, а затем использовать их в игре. Расширение
добавляет такие функции, как и так, что вы можете получить данные обратно в виде двух строк кода.

Одно серьезное ограничение — некоторые расширения несовместимы с мобильными платформами.

Как их установить

  1. Необходимо загрузить расширение — это должен быть файл .
  2. Щелкните правой кнопкой мыши папку Extensions в GM:S и выберите Add Existing Extension.
  3. Это должно вызвать диалоговое окно, и в правом нижнем углу вы увидите кнопку с надписью Install. Нажмите ее.
  4. Откроется другое диалоговое окно со списком установленных пакетов (возможно, пустым). Справа от этого окна есть кнопка, которая снова с надписью Install. Нажмите ее.
  5. Это открывает еще одно диалоговое окно; перейдите в папку, в которой сохранен файл , щелкните его и нажмите кнопку Open.

Установка русификатора

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

После того как скачали файл русского языка, копируем его и вставляем в директорию с Платформой в папку «Languages» которая лежит по следующему пути C:\Program Files\GameMaker Studio 2\Languages
Открываем вставленный файл в блокноте, для этого нажимаем на него правой кнопкой и выбираем пункт «Изменить».

Откроется блокнот с конфигурацией этого файла. Нам необходимо 7-й строкой вставить следующую конфигурацию.

_LanguageCode,ru,ru,,standard windows os language code this pack represents (can be primary code only ie. en or primary-secondary ie. ru-RU)

Сохраняем файл и делаем бэкап стандартного файла «english», для этого просто скопируйте его в другую папку. Это необходимо для того, если что-то пойдет не так, просто скопировать его обратно и вернуть исходный язык движка. После сохранения русскоязычного файла удаляем старый англоязычный (предварительно сохраненный в другую папку) и запускаем Game maker studio.

Возможности программы

GameMaker Studio 2 — вторая версия популярной программы для создания любых игр. Воплощайте свои идеи в жизнь, превращайте игрушки в настоящие шедевры и сделайте все возможное для того, чтобы они пользовались большим спросом. Приложение упрощает создание любой игры, даже самой сложной и масштабной. Вы можете заняться созданием как инди-игрушки, так и высококачественной MMORPG, в которую будут играть миллионы по всему миру. Главное, придумать идею и продумать процесс создания до мельчайших деталей. Здесь создан специальный рабочий экран с нужными инструментами и параметрами, с которыми даже не нужно писать специальный код. И без него получится любая уникальная игра. Разработайте игру наивысшего качества и получите славу мирового разработчика. Перетаскивайте новые элементы, технологии искусственного интеллекта, все самые новейшие параметры разработки должны быть учтены в игровом пространстве. Можно создавать игры не только на ПК, а и на мобильные устройства или браузеры. Вы сами выбираете концепцию игры, а также платформу, на которой она будет разворачиваться. В программе созданы специальные панели, в которых можно узнавать все о вашем приложении, вплоть до количества загрузок и прочей аналитики. Очень удобные инструменты содержат всю информацию про создаваемую или уже выпущенную на рынок игру. Вы каждый день можете проверять активность пользователей, участвовать в обновлениях и изменениях в режиме реального времени. Для тех, кто давно мечтал создать собственную игру любого жанра — это шикарный вариант. С программой сможет разобраться любой, даже неопытный пользователь ПК, потому как здесь даже не нужно кодить. То есть, способностей программиста тут абсолютно не нужно никаких. Скачайте торрент GameMaker Studio 2 и прокачайте свои навыки в создании уникальных игр.

Синтаксис и семантика GML [ править | править код ]

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

не является правильным оператором и вызовет ошибку. Также, присваивание переменных — это всегда оператор, и поэтому не может быть использован в выражениях. Например, следующая строка всегда генерировала бы ошибку потому, что она бы вычисляла вложенное выражение как true или false, а затем сравнивала бы булевый результат со строкой «Yes» (неправильное сравнение):

Стоит помнить, что знак равно «=» является оператором присвоения и булевым оператором сравнения в выражениях, тогда как в С++ в выражениях пишут двойной знак «==». Тем не менее, двойной знак равно «==» будет правильно интерпретирован в случае использования его в выражениях. Использование такого знака в качестве оператора присваивания вызовет ошибку исполнения. GML также поддерживает операторы инкремента:

то же самое, что и

Также существуют операторы: -=, *=, /=, |=, &= и ^=. Начиная с GMS2 введена поддержка тернарного оператора ?:. Операторы в GML могут быть разделены точкой с запятой, однако это не является обязательным условием (хотя и может привести к ошибке в некоторых специфичных случаях).

STRUCTS

The next new feature that we want to discuss in GameMaker Studio 2.3 is the creation of structs. A struct is — to put it simply — a variable that holds a collection of other variables — you can think of it as a kind of «light-weight object». The variables that a struct holds can be of any data type and these variables can be read from and written to after the initial struct declaration, and you can also add more variables to a struct after it has been declared. It should also be noted that the contents of a struct are independent of the instance or script that created it, and as such you can — if you wish — use the built-in variable names like  or  and . One of the benefits of using structs is that (unlike instances), after the initial creation, structs have no processing overhead while they exist, although they will take up space in memory. The struct syntax is as follows:

So, an example of this in practice would be:

The above creates an instance scope struct in the variable «mystruct» and populates it with some values (structs can be created at local, instance and global scope, just like any other variable). Note that you don’t have to populate the contents of a struct when it is created initially and you can create an empty struct by simply doing this:

This struct can then be added to at a later point in the game code. Here is an example of a struct with various variables and data types:

You’ll notice in the above code that you can also define methods and use runtime functions in structs, and that you can use expressions consisting of any variable previously defined within the context of the struct itself, as well as any variable defined within the scope of the struct itself.

Once a struct has been defined, you can access the data within using the «point» notation, like this:

You can also perform operations on the variables within a structure or use them in functions, just as you would any other variable. For example:

Finally, structs can have other structs nested inside of them, like this:

To access such nested structs you would still use the point notation, like this:

When a struct is no longer required it can be removed from memory using the  operator, which is another new GML feature added in the 2.3 update. This de-references the struct and hints to the garbage collector that it may be available for collection. This is not strictly required as the garbage collector may do this automatically in the following game steps if the struct is no longer referenced in your code, but it is good practice to do so and we recommend it (for example, call delete in the Clean Up event of an instance to explicitly tell the garbage collector that an instance scope struct is to be deleted).

Also note that structs can be created using functions, which requires the use of the  operator and the keyword  (two more new features to GML), as shown in the following example:

Here we are creating the function  and telling GameMaker Studio 2 that this is a function for making a struct by adding the  keyword after the definition. You can then call this function like this:

Now the variable v1 will reference a struct with the variables x and y and the static method variable .

Note that there are other additional functions for structs, specifically:

Check the manual for details of how these functions should be used.

Chaining

Another great feature in GameMaker Studio 2 is the ability to visually «chain» things together. This is most obvious when dealing with objects, but is also a feature of the room editor and other areas of the workflow. 

As you can see from the image above, GameMaker Studio 2 will chain together the object with its events and with the code associated with each event. In this way you can dedicate areas on your workspace to chains of objects and then navigate between them to get a far more visual representation of what’s going on. Note that you can change some of the chaining properties from the GameMaker Studio 2 preferences, so if — for example — you would rather have the code for each event in multiple tabs in a single window rather than have a window for each one, you can change this.

Библиотеки [ править | править код ]

В Game Maker совокупность кнопочных событий образует библиотеку. В интерфейсе программы библиотеки отображаются как закладки, в которых находятся различные иконки событий. Каждое такое событие — это GML-скрипт или функция, которую пользователь может использовать в игре. В поставку Game Maker входят несколько стандартных библиотек, которые содержат основные события, используемые в большинстве игр. Также существует возможность создавать свои собственные библиотеки, используя Library Maker. В GMS2 встроен механизм конвертации действий, заданных «кнопками», в код GML и обратно, что позволяет новичкам быстрее перейти на GML и улучшает понимание того, как работают стандартные действия.

Audio

GameMaker Studio 2 has a complete audio engine that is
based on the *.ogg, *.mp3 and *.wav
sound formats. Sounds of these types added to the IDE can then be
used in your game using the basic audio functions shown below. For
things more complex than basic sound effects or playing a single
piece of music you can refer to the advanced audio functions which
let you modify how a sound is played. There are also a selection of
more specialised functions dedicated to streaming audio,
positioning audio — to give 3D sound — and grouping audio.

IMPORTANT! When using audio on the HTML5
target, you should be aware that not all browsers support Web Audio
and so may not play any sound for your project when run. You can
get a general idea of Web Audio support from the following link:
.

Further advanced functionality, like setting listeners,
recording audio, or synchronising multiple audio tracks over time
can all be found from the sub-sections listed below:

Web Audio

When creating games for the HTML5 target platform, the audio
engine requires Web Audio support, and this in turn mans
that sometimes your audio won’t play when or how you expect it.
This is because the Web Audio context may not be running or may
stop running when your game is being played. What causes this
varies greatly between browsers, and even between different
versions of the same browser, and so detecting when the web audio
context status changes is very important, eg: to detect when the
context changes and pause/start looping audio like background
music.

To help with this issue, GameMaker Studio 2 has two
separate ways to detect the change in Web Audio context status,
either using the following function:

Or using the Asynchronous System Event, which will be
triggered whenever the Web Audio status changes. In this event you
will get the built in async_load DS map populated with
the key «event_type» which in turn will hold the string
«audio_system_status» if it is an audio event. When this
key exists, there will also be a further «status» key
which will be either «available» or
«unavailable«. Note that this event will be triggered on
all platforms, but on everything except HTML5 it will only
be triggered once on Game Start when the audio engine is first
initialised. For more information please see the section:

FUNCTIONS, SCRIPTS AND METHOD VARIABLES

Above we outline some changes to the GameMaker Language, but now it’s time to talk about the good stuff… what’s been added! To start with we want to talk about in-line functions and scripts. Previously, a script was a single resource that was created on a global scope and used to create a single custom function which would then be called using the script name as the function name. This is no longer the case and scripts, while still global in scope, are now a type of «container» for one or more functions.

What this means is that when you compile your project, scripts are no longer called individually, but are actually all run at the start of the game in the global scope, so all variables that are defined in the script (outside of function definitions) will be considered global. That said, you should still use the identifier to explicitly define and identify global variables in your code.

The reason for this change is that scripts can now contain multiple functions. If you’ve only used GML to code projects then the idea of functions may be something new to you, but think of them as being the same as scripts, only explicitly assigned to a variable. This variable is called a method and is used to call the code that is in the function, the same as you would have previously called the script name. This is easier to visualise with an example, so let’s look at one. Consider this simple script :

Now, however, this would be defined as a function like this:

or like this:

You would call this function just as you would have called the script:

So, as we mentioned above, scripts can now contain multiple functions and these should be defined with the format shown above where you have the  JS doc comment to identify the function, then the function definition below, and then the next JS Doc comment, and then the function, etc…

Above, we briefly mentioned that functions as variables were called method variables, but it should be explained in a bit more detail. Basically, when you create a function with a variable like this, you are creating a method variable, and they can have different scopes. Consider this function:

  • In the case of a script a variable called «foo» is declared at global scope

  • If the function is declared in an event then the variable «foo» is on the instance that ran that event

  • If the function is declared in an event using the  keyword then the variable «foo» is local to the event only

  • If «foo» is declared inside a  then it is declared on the  that is active at that time

This means that if you have some code that you need to use only within a loop in an alarm event (for example), then you can define it as a local scope method variable at the start of the event and then use it within the loop without the need to clutter up the script assets with it.

It is worth noting that while the variable will be in the chosen scope, the actual function will be bound to the scope that it was initially defined in. Going back to script functions, these are all global scope and are considered «unbound» (ie: they are not associated with any instances), but if you have a script function that creates another function within it and then you call this script from an instance, the function used within the script will be bound to the instance. In general this is not something you ever need to think about but for more complex operations with method variables it’s worth taking into consideration. This also applies when using other constructs like  — when you create a method variable inside a , the function will be bound to the instance that is currently in scope.

The following new functions have also been added to deal with methods:

Check the manual for details fo how these functions should be used.

Программные процессы

Программа содержит ряд полезных и уникальных функций, которые точно пригодятся вам при создании любой игры. Вас встречает идеальная среда для разработки двумерных игрушек разного жанра. Это могут быть инди-игры, платформеры, классические hack and slash или рогалики. Пользуйтесь неограниченными ресурсами приложения, а также активным форумом, в котором можете спрашивать любой совет у таких же разработчиков, как и вы. Интерфейс программы очень простой в освоении, разберется любой пользователь. Кодить ничего не нужно, тут уже все, что вам понадобится при создании, сделано. То есть, естественно, язык программирования присутствует (и не один), но вы самостоятельно ничего не будете кодить. За вас это сделали умелые программисты, оставив вам лишь площадку для создания игр, как банальный конструктор в детском саду.

CHAINED ACCESSORS

Another change to GML is the ability to chain accessors. Much like you can now chain arrays together, you can chain the different Data Structure accessors together too, making accessing the data from nested structures much easier.

A simple example of this would be a DS grid, where each grid entry is a ds list. Previously you’d have to first retrieve the index of the list from the grid, and then access the data in the list, but now it’s as simple as doing something like this:

This would retrieve the data from the 6th position in the DS list that is being held in the grid (0, 0) position. Other examples of use are:

GameMaker Studio 2

Часто художники, писатели или геймеры задумываются о разработке собственной игры, но не знают, с чего начать. GameMaker помогает воплотить самые смелые идеи для создания 2D-игры — например, top-down-экшена, платформера или головоломки.

Первые итерации GameMaker были созданы более 20 лет назад профессором Утрехтского университета в Нидерландах Марком Овермарсом в качестве пособия для студентов. В 2007 году официальным представителем движка стала студия YoYo Games — дочерняя компания PlayTech. В 2012 году произошёл ребрендинг: конструктор переименовали в GameMaker Studio, попутно расширив его технические возможности. В начале 2021 года команду GameMaker приобрела компания Opera — с перспективами дальнейших серьёзных вложений.

Ограничения пробной версии:

  • срок действия программы — 30 дней с момента регистрации аккаунта на официальном сайте;
  • нет возможности скомпилировать окончательный вариант проекта;
  • в маркетплейсе можно покупать и скачивать ассеты, сделанные другими пользователями, но собственные наработки нельзя выставлять на продажу.

Существует несколько лицензий GameMaker Studio 2. Тип лицензии зависит от типа платформы, на которой разработчик запланировал релиз.

  • GameMaker Studio 2 Desktop (1 599 рублей) — лицензия для разработки игр на Windows, Mac OS и Ubuntu.
  • GameMaker Studio 2 Web (2 579 рублей) — для HTML5-проектов.
  • GameMaker Studio 2 Mobile (1 599 рублей) — экспорт на iOS, Android и Amazon Fire.
  • GameMaker Studio 2 UWP (3 499 рублей) — универсальная лицензия с возможностью портирования проекта на все вышеперечисленные платформы.

Достижения:

  • клиент движка загрузили 10 млн раз;
  • посещаемость официального сайта достигла 200 тысяч человек в месяц;
  • каждый день более 1 000 пользователей регистрируются на сайте, чтобы скачать клиент (по данным gameindustry.biz)

Преимущества:

простота освоения — благодаря системе визуального скриптового инструмента drag & drop;
собственный упрощённый язык Game Maker Language (GML), который не требует углублённого изучения кода;
кросс-платформенность (поддерживает Windows, Mac OS X, Ubuntu, Android, iOS, tvOS, fireTV, Android TV, Microsoft UWP, HTML5, PlayStation 4, Xbox One);
наличие инструмента для создания кат-сцен;
возможность сделать игру в любом жанре и стиле;
оптимизация готовых приложений в плане объёма, что важно для мобильных игр.

Недостатки:

  • несмотря на поддержку 3D, работать с ним крайне неудобно;
  • если разработчик надумает сменить движок в будущем, ему будет сложно перейти с GML на другой язык;
  • из-за специфики GML возникают сложности при поиске программистов;
  • несмотря на упрощённый экспорт игр на другие платформы, нет поддержки одновременного выпуска патчей;
  • экосистема GameMaker не может конкурировать с более мощными движками из-за недостатка функциональности.

Игры на движке: Undertale, Hyper Light Drifter, Hotline Miami, Blazing Chrome, Danger Gazers, Katana Zero.


Скриншот из Katana Zero — игры, созданной на GameMaker Studio 2 / Скриншот: игра Katana Zero / Steam

«Я выбрал GameMaker в качестве основы для своих игр, так как с его помощью можно быстро прототипировать. К тому же он обладает расширенным функционалом, необходимым современному 2D-движку.

GameMaker существует достаточно давно. Поддержка и сообщество — одно из главных достоинств, и для меня как для разработчика-одиночки это большой плюс. Мой опыт работы с этим движком достаточно положителен. Рекомендую его всем, кто хочет делать 2D-игры: возможности инструмента в этой области ничем не ограничены

При этом неважно, новичок вы в геймдеве или у вас уже есть опыт программирования, — в любом случае это один из лучших 2D-движков на сегодняшний день»

Шота Бобохидзе, инди-разработчик (Kontrakt, Danger Gazers)


Скриншот из Danger Gazers — игры, созданной на GameMaker Studio 2. Скриншот: игра Danger Gazers / Steam

«GameMaker восхитителен, когда нужно быстро создать прототип. Именно поэтому самые высокооценённые игры крупнейшего игрового джема — GMTK — сделаны на этом движке. GameMaker — мой самурайский меч, fire of my loins.

Я работаю на нём уже 18 лет и за этот период сделал Steam Panic, Paper Knight, Geon FX, а также первый эпизод Gripper. Ничто не дарит такой детской радости, как этот конструктор».

Кирилл Золовкин, инди-разработчик (Steam Panic, Paper Knight, Geon FX)

Обучение GameMaker: Studio

GM:S предлагает два различных способа создавать игры. Первый это так называемый интерфейс Drag and Drop (сокращённо DnD). Он довольно мощный и позволяет создавать сложную логику. Однако, он не такой мощный, как второй вариант: использование языка программирования GameMaker Language (сокращённо GML). GML — это прекрасный язык сценариев, который может делать все, что может делать DND, и многое другое.

Начало работы

После того, как
вы загрузили версию движка GM:S которая соответствует вашим потребностям, вам следует ознакомиться с учебными материалами,
которые поставляются вместе с GM:S. Их можно найти во вкладке Tutorials после того, как вы откроете GM:S.

В начале уроков будет показано, как использовать drag and drop интерфейс, а более поздние руководства начинают охватывать язык программирования GML. Самое приятное в предложенных уроках — это то, что они фактически добавляют окно к
интерфейсу, в котором вы узнаете, как создавать каждую игру, поэтому вам
не нужно обращаться к веб-странице — все доступно изложено для вас в GM:S!

Я рекомендую
проработать столько, сколько вам нужно, до тех пор, пока вы не
почувствуете, что у вас есть четкое представление об общем процессе
работы и инструментах, которые предлагает движок GM:S. Дополнительные уроки вы можете найти на вики сайте YoYo games по адресу http://wiki.yoyogames.com/index.php/GameMaker:Studio_Tutorials включая некоторые более продвинутые руководства.

Для самого продвинутого обучения можно посмотреть демки на вкладке Demos после запуска GM:S. Они не откроют окно обучения, но они предоставляют доступ ко всему используемому исходному коду, чтобы можно было просматривать его, запускать отладчик и наблюдать за тем, что происходит, так что вы получите хорошее представление как использовать их методы в своих играх.

Руководство

Руководство по GM:S можно найти в меню Help в разделе Contents…. Это должно быть первым местом, где вы будете искать ответы на свои вопросы, если сразу перейти на форумы, люди по всей вероятности огорчат вас за то, что вы просто не проверили справку. Существует также онлайн-руководство, которое можно найти по адресу docs.yoyogames.com

Руководство в программе GM:S

Если вы выполняете поиск как в прилагаемом руководстве, так и в онлайн-руководстве и не можете найти ответы, не бойтесь! На reddit существует большое сообщество /r/gamemaker и есть официальные форумы. Кроме того, имеется отличный сайт полон инди-разработчиков, некоторые из них часто используют GM:S на форумах TIG. Эти сообщества полны полезных людей, поэтому не бойтесь задавать свои вопросы!

Bookmarking

Another feature of GameMaker Studio 2 is bookmarking. Due to the fact that you now have an infinite workspace to position things in, meaning that you could have various chains of objects and editors open at one time and all of them positioned at different points on the workspace, it is essential that you can quickly navigate from one to the other. This can be achieved using the zoom and pan controls as mentioned above, but it is much quicker to bookmark things and skip straight to them at the touch of a key.

To bookmark something you can hold down Control + Shift and press any number key from 1 to 9 and a bookmark will be assigned to the currently focused window. You can then press Control and the number key at any time again later to be taken to the bookmarked window.

When you bookmark something, the IDE will show a «flag» with the bookmark number on it, and if you are in a script or an object code editor, then the line number (or action) will also be bookmarked so that the IDE will jump to that position when you recall it (see the image above).

Заключение

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

Временные рамки

Обозначьте для себя сроки разработки. Если это игра вашей мечты, возможно, на её разработку уйдут годы. В этом случае стоит задуматься о движках, поддерживающих масштабные проекты (Unity, UE4, CryEngine). Но если в вашем распоряжении несколько месяцев, можно присмотреться к GameMaker или Construct 3 и сделать головоломку или платформер.

Бюджет

Некоторые игры предполагают финансовые затраты уже на старте, когда нужно приобрести движок (RPG Maker, GameMaker, Construct). В других случаях предстоит вложиться в покупку ассетов (Unity, UE4) и быть готовым выплачивать роялти. Что касается бесплатного контента, то здесь нужно быть особенно внимательным: иногда для использования требуется разрешение автора.

Личные навыки

Многие мечтают сделать собственную игру, но их останавливает отсутствие навыков программирования

В этом случае стоит обратить внимание на движки с визуальными скриптами и упрощённым подходом к коду (Clickteam Fusion, Ren’Py, Construct 3, UE4, GameMaker Studio)

Команда

Здесь всё зависит от масштаба. С какими-то технологиями проще работать в одиночку (GameMaker Studio, Construct 3, RPG Maker), в то время как для работы в других движках может потребоваться несколько человек (Unity, UE4, CryEngine).

Жанр

Существуют движки, которые специализируются на конкретных жанрах. Чтобы определиться с выбором, необходимо проанализировать, какие хиты сделаны с помощью той или иной технологии. Например, RPG Maker славится удобством в построении JRPG с пиксель-артом, на Construct сделано много платформеров, а на Unity и Unreal немало проектов с впечатляющей 3D-графикой.

Выбор платформы

Как правило, начинающих разработчиков волнует только процесс создания будущей игры, но мало кто задумывается о дальнейшей оптимизации, балансе и исправлении багов. Большую роль в этом играет масштаб проекта. Такие движки, как UE4, Unity и CryEngine, подходят для крупных проектов, но оптимизировать игру на них будет сложнее.

Выбор платформы не менее важен. Если для релиза на PC можно использовать практически любой движок, то поддержкой сторонних платформ могут похвастаться не все технологии. Для браузерных проектов подойдут Phaser 3 и Construct 3. Для мобильных приложений AppGameKit, Solar 2D и Cocos. Стоит учесть, что многие движки мультиплатформенные.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector