Ags games for windows

⚠ Cookies ⚠

By continuing to use this site you agree to the use of cookies. Please visit this page to see exactly how we use these.

We are not responsible for the content of external links

Download AGS

What do I need to run AGS?

Windows 2000, XP, ME, 98, 95 or lower

Sorry, but AGS no longer runs on these versions of Windows. Please upgrade to Vista or later!

Installer Free Download

Installer Download

Installer Free Download

Source Code and Ports

Development of AGS happens on our GitHub page. The Git repository not only contains the source code of the AGS editor and engine for Windows, but also ports of the AGS engine to Linux, Android, iOS and PSP (which allow you to play AGS games on these platforms). Instructions for compiling the ports can be found on the GitHub pages.

AGS development is usually discussed in the Engine Development and Editor Development forums.

AGS Modules & Plugins

Modules and Plugins Forum, where you can find loads of addons to save you work and add cool stuff to your games.

AGS Nightly Builds

On this AGS forums thread you can find nightly builds of the latest version of AGS in development. These are likely to be highly unstable, and should not be used yet on game projects.

Older Versions

Screenshots and Features

The AGS Editor is a Windows-based IDE for creating your games as quickly and easily as possible. Everything you need from importing graphics and writing game scripts right through to testing your game, under one roof!

Platforms: Windows 10, Windows 8, Windows 7, Windows Vista, Windows XP, Windows 2000 (Linux, Mac and other ports also available for playing, not developing)
Resolutions: Any, from very low (e.g. 160×200 like in Sierra’s classic AGI games) up to HD
Graphics filters allow players to scale up to a supported resolution if necessary
Colour Depths: 8-bit (palette), 16-bit (hi-colour) and 32-bit (true-colour) all supported
Graphics: Direct3D 9 and OpenGL drivers are built-in
Audio Formats: OGG, MP3, WAV, MOD, XM, MIDI
Audio Features: Crossfading music, ambient sounds, footstep sounds, multiple sound channels
Voice Speech: Speech packs supported with easy system to link lines of text to audio files
Video Formats: AVI, WMV, FLC, OGV (Ogg Theora); full-screen only
Workflow: Set up the basics with point-and-click; define how the game reacts to events with scripting
Scripting: Simple yet powerful JAVA/C#-style language
Script Editor: Built-in with Autocomplete, Syntax highlighting, Calltips, Online Help
Script Debugger: Built-in debugger allows placing breakpoints and stepping through script code
Translations: Built-in support for translating your game text to different languages
Plugins: Plugins are available to enhance AGS with extra features
Compiler: Game is compiled to a single EXE file for distribution (or span multiple files if you prefer)
Source Control: Integration with any MSSCCI system (e.g. SourceSafe, Perforce)

Develop AGS

So you want to help develop future versions of the AGS engine and / or editor? The first thing you should do is read the readme, which explains how to get started. There you can find links to information on various development projects, including versions of the AGS engine for many alternate platforms.

Resources

Need a hand to get you started? We’ve got some free resources like artwork and fonts to help you out:

Источник

Ags games for windows

Всё об этой замечательной проге по созданию своих квестов.

Вот как-то наваял пару уроков, см. самый первый.

— Создать игру
— Создать локацию

Если вылезло такое окошко

Просто говорите «Да» и не обращайте внимания )

3. Выбираешь 320х200. Это размер экрана, самый удобный вариант.

СОЗДАТЬ ЛОКАЦИЮ (комнату, экран, скрин)

Тебя выкидывает на Настройки локации.

2) Наверху ты видишь кнопки:

Рисуем землю и солнце. (пока черно-белое)

4) Возвращаемся в AGS. По пункту (2) жмём кнопку «Вставить фон», находим 1.png

Вместо черного экрана должен появится наш рисунок.

5) В левой панели выбираем Areas (под Room Editor).

Справа появляются новые настройки

Выберите Walkable areas. Будем рисовать зону, по которой может щеголять наш персонаж.

К примеру, синий hotspot при «смотрении» даёт сообщение «Это стул», а красный hotspot при том же действии даёт что-нибудь другое, например герой чешет репу и пожимает плечами.

Справа инструменты для рисования зон (областей).

Щелкаем 2 кнопку (волнистая линия). Теперь надо отделить землю на нашем фоне от всего остального.

Начинаем с самого левого верхнего контура нашей земли.

Жмём мышку и не отрываясь рисуем линию до самого правого края.

Если вдруг ВЕСЬ ФОН закрасился, жмите Ctrl+Z (отмена). Где-то ваша полоска не дошла до конца! Ищите дырочки и дорисуйте контур.

Появится окошко с вопросом, говорите «Да».

Назовите файл room1

Посмотрим, как выглядит наша игра.

Герой не может пошевелиться?

Значит, он не стоит на Walkable Area. (области для хождения)

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

8) левая панель Characters (персонажи).

Это ваш герой. Справа at X 160 Y 160. Поменяйте их на новые координаты.

Теперь он должен ходить по земле!

Это самый начальный урок

Источник

⚠ Cookies ⚠

By continuing to use this site you agree to the use of cookies. Please visit this page to see exactly how we use these.

AGS Games

For posting your finished AGS games.

47,215 Posts
2,100 Topics

Last Post in Re: I rented a boat
by lorenzo
on Yesterday at 19:02

For promoting the game you’re developing, and seeing what others are up to.

50,041 Posts
2,200 Topics

For finding help when you’re stuck when playing AGS games.

38,471 Posts
3,383 Topics

Last Post in Re: Broken Windows-chapt.
by Psychomule
on 02 Apr 2021, 20:02

Community

For discussing things that are AGS or adventure-related, but not technical.

86,406 Posts
4,565 Topics

For off topic conversations and discussions.

169,367 Posts
8,866 Topics

Last Post in MOVED: ScummVM and AGS G.
by Snarky
on Today at 06:29

For tomfoolery and timewasting, memes and meandering threads.

62,781 Posts
403 Topics

Last Post in Re: Name the Game
by Pogwizd
on 07 Apr 2021, 09:29

AGS Support

For the announcement of new releases of the AGS engine and editor.

1,637 Posts
40 Topics

For help with starting off scripting your AGS game

77,012 Posts
12,594 Topics

Last Post in Re: Variables only chang.
by bx83
on Today at 06:32

For more advanced help with scripting your AGS game. For bug reports and engine or editor development, please see the relevant forum.

47,265 Posts
5,458 Topics

Last Post in Re: Get character facedi.
by nightmarer
on 05 Apr 2021, 22:25

For saving yourself some work, by using a module someone made earlier.

8,003 Posts
375 Topics

Last Post in Re: MODULE: Underwater v.
by bx83
on Today at 08:51

Creative Production

For finding people to join your game projects.

2,332 Posts
497 Topics

Last Post in Testers for Desolate (to.
by arj0n
on 27 Mar 2021, 12:21

For getting suggestions on how you can improve your art, music, and more.

72,925 Posts
5,672 Topics

Last Post in Re: What do you think of.
by KyriakosCH
on 26 Mar 2021, 11:23

For practising your art, music, writing and game making skills in forum competitions.

63,565 Posts
2,064 Topics

AGS Development

For discussing and planning the development of the AGS engine.

5,931 Posts
257 Topics

Last Post in Re: AGS engine Android p.
by Crimson Wizard
on 06 Apr 2021, 21:27

For discussing and planning the development of the AGS editor.

4,712 Posts
232 Topics

For discussing systems inspired by AGS, but separate from core AGS.

375 Posts
11 Topics

Last Post in Re: XAGE Development thr.
by eri0o
on 06 Jun 2020, 01:34

For reporting issues found on the AGS site and forums. Game bug reports go in the Completed Game Announcements forum, and bugs in AGS itself should be reported in the Bug and Suggestion Tracker.

3,737 Posts
315 Topics

Last Post in Re: Non-AGS games in the.
by AGA
on 02 Apr 2021, 10:19

Associated Sites

For the discussion and development of RotN games.

1,142 Posts
128 Topics

Last Post in Re: 20th anniversary
by Ponch
on 14 Mar 2021, 15:13

For the discussion of the AGS Archives (agsarchives.com) site.

298 Posts
14 Topics

Last Post in Re: AGS Archives archive.
by vga256
on 13 Feb 2021, 16:42

750,209 Posts in 49,657 Topics by 10,298 Members. Latest Member: mabgamedesign
Latest Post: «Re: MODULE: Underwater v. « ( Today at 08:51 )
View the most recent posts on the forum.
[More Stats]

159 Guests, 8 Users (1 Hidden)

Most Online Today: 214. Most Online Ever: 3,044 (05 Jan 2021, 13:18)

Page created in 0.023 seconds with 14 queries.

Источник

Adventure Game Studio

Adventure Game Studio (AGS) — программа-редактор для создания 2D игр без специальной подготовки (IDE). Программа совмещает в себе визуальные инструменты, где можно настроить различные параметры игры, и программный код, где выстраивается логика действий. AGS обладает самым большим сообществом разработчиков игр в мире.

Содержание

История

Adventure Game Studio — это бесплатный конструктор игр, который развивается с 1995 года. Автор идеи и разработчик — Крис Джонс.

Изначально Крис Джонс планировал создать свою игру в жанре квест. Он хотел сразу написать код игры целиком, но потом понял, что при изменении одного небольшого параметра придется переписать большую часть кода. Тогда он решил сделать среду разработки — Quest Maker. Она была условно-бесплатной и стала известной, как Adventure Maker v1.0. Он быстро сделал короткую игру из 5 комнат-локаций, эта игра стала распространяться как Demo с конструктором игр. Через пару лет, когда он получил доступ в интернет, он загрузил свой проект в сеть. После этого число любительских игр резко возросло. Логотип AGS — большая синяя чашка. Логотип появился благодаря тому, что при добавлении объекта в игру спрайтом по умолчанию была пиксельная чашка, которая примелькалась и стала ассоциироваться с этим конструктором.

В 1997 году вышла первая массовая версия конструктора для операционной системы MS-DOS и называлась «Adventure Creator». Летом 1999 г. автор переделал программу и выпустил её в сентябре уже под названием «Adventure Game Studio».

Программист был вдохновлён простым интерфейсом приключенческих игр фирмы Sierra On-Line, особенно «Space Quest IV: Roger Wilco and the Time Rippers». Первая версия Adventure Creator позволяла пользователям создавать игры только в низком разрешении, с управлением через клавиатуру.

Изначально пользователи конструктора AGS создавали только маленькие пробные или демонстрационные игрушки, большинство серьёзных проектов вскоре прекращали свое существование. Поэтому сообщество росло очень медленно. В конце концов, разработчики попросили у автора новых возможностей (например, более высокое разрешение экрана), чтобы создавать более сложные игры. В январе 1999 года вышел Adventure Creator версии 1.1 с поддержкой SVGA-графики. Пользователи попросили возможность уменьшения и увеличения персонажа (имитация близких и далеких мест на локации), и Джонс добавил её в сентябре того же года.

После долгого застоя вышла первая законченная игра «Lassi Quest», и сразу после неё «Larry Vales» и «Rob Blanc» (от Ben ‘Yahtzee’ Croshaw), и движок стал набирать популярность.

Со временем сообщество стало пополняться тысячами новых членов и продолжало расти, и создавать все больше и больше новых игр, от коротких милых поделок в старом стиле до крупнокалиберных, как например «Pleurghburg: Dark Ages».

AGS-движок с каждым годом развивает все медленнее.

Возможности

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

В AGS можно создавать игры от 256 цветов с разрешением 320×200 (в стиле старых классических квестов) до 32-битных с разрешением свыше 800×600.

Также для 16-битных и 32-битных цветов можно использовать альфа-канал. Существуют следующие разрешения: 320×200, 320×240, 640×400, 640×480 и 800×600.

Кроме того, AGS обладает возможностями, которых нет у некоторых других движков — это запуск игр без программы, возможность использования модулей, шаблонов и плагинов, а также возможность перевода игры на другие языки.

Сотни игр было сделано за годы после первого релиза AGS. Они варьируются от коротких «пробников» до длинных проектов, сделанных на профессиональном уровне. На этом движке также можно создавать аркадные и настольные игры.

На официальном сайте игры подразделяются по длине геймплея и категориям «не квест» и «шуточная игра».

Короткие игры

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

Игры средней длины

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

Полнометражные игры

Эти игры обычно выполнены очень качественно и занимают несколько часов на прохождение. Это самый редкий вид приключенческих игр, сделанных на AGS, так как обычно они делаются годами. Один из самых популярных способов сделать игру такого типа — создать улучшенную версию старой игры, от добавления интерфейса point-and-click до полной переделки графики. AGD Interactive (AGDI) и LucasFan Games — одни из лучших создателей римейков на классические квесты.

MAGS (Monthly AGS competition / «Ежемесячные соревнования по AGS») — конкурс официального AGS-форума, где разработчики игр должны создать короткую игру за месяц. Сложность состоит в том, что игра должна соответствовать ряду требований по продолжительности, графике и содержанию. В конце месяца голосованием выявляется лучшая игра, и её автор придумывает условия конкурса для следующего месяца. Обычно эти игры очень короткие и простые, но очень разные по графической составляющей.

Игровые сериалы

Есть много разных игр такого рода. Особо стоит отметить «Reality on the Norm», серии к которой может создавать любой желающий, но придерживаясь канона: используя тех же персонажей, с теми же характерами и местами действий.

Также можно выделить серию AGS-игр (хотя некоторые даже сделаны на других движках) — «Maniac Mansion Mania». События происходят во вселенной Maniac Mansion и показывают обычную жизнь главных персонажей.

Одна из серий, которая многим понравилась, это «Ben Jordan: Paranormal Investigator».

После всеобщего признания «5 Days a Stranger» обзавелся сиквелом: 7 Days a Skeptic

Не квесты

Одна из самых интересных категорий игр, сделанных на Adventure Game Studio — это «не квесты», поскольку AGS был разработан именно для создания квестов. Есть много разнообразных игр этого типа, от разных жанров до нескольких программ.

Сообщество

Возможно, AGS-сообщество — одно из самых крупных по созданию квестов на специализированном для этого движке. Оно находится на AGS Forum и в AGS IRC-канале.

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

Соревнования по созданию игр:

Другая важная часть сообщества — это обсуждение создания игр между разработчиками.

Русское сообщество

Первые русскоязычные пользователи появились в общем AGS-сообществе, и их было не больше 4-5 человек. Однако одним из первых, кто делал игры именно на русском языке, был Endrews. Осенью 2009 года постепенно появилось первое русское сообщество на просторах русского форума sq.forum24.ru.

Источник

⚠ Cookies ⚠

By continuing to use this site you agree to the use of cookies. Please visit this page to see exactly how we use these.

Читайте также:  Realtek драйвера для windows 10 интернет

We are not responsible for the content of external links

AGS Engine Plugins

(Latest revision 4 Oct 2009)

AGS supports a plugin interface, whereby you can write your own add-ons if AGS doesn’t support all the features you need.

First, a few important notes about the plugin API. It’s essential that you read these before even considering writing a plugin.

Now, if you want to continue, on to the technical details.

AGS plugins are implemented as Windows DLL files, which must have filenames beginning with «AGS». Therefore, you will need to create your plugin as a standard Windows DLL project. When the editor starts up, it reads through all the AGS*.DLL files in the editor directory, and adds them to its plugin list.

Your DLL should have the following entry points:

The standard Windows DLL entry point, you know how to use this.
This will get called once when the editor first starts up, and once when it finally shuts down. The plugins are kept in memory at all times, so you will not get lots of load-unloads during the editor’s lifetime.

Design-time events

Called by the editor to retrieve a user-friendly name for the plugin. This is the very first function the editor calls as soon as it starts up, in order to build its list of plugins.
Normally, you will implement this as a simple one-line function that returns a static string with the plugin description.

Called by the editor when the user selects to add the plugin to their game. This function should perform any initialization necessary for design-time operation.
The parameter passed to the function is a pointer to the editor interface, which your plugin can execute various methods on to communicate with the editor.
In particular, this function should register any additions to the script header files that it uses.

You should return 0 to indicate success; any other value indicates that a problem occured, and the editor will not attempt any further communication with the plugin unless the user tries to start it again.

Called by the editor when the user elects to remove the plugin from their game. The plugin should un-register anything that it registered at startup, since if the user later decides to add the plugin again, the Startup function will be run again.

Called by the editor when the user highlights the plugin and clicks the Properties button. You can use this to display a copyright message, or allow the user to set options for your plugin, for instance. This will only be called when the plugin is selected (ie. EditorStartup has been called).
The parameter gives you the parent window handle you should use if you want to pop up a dialog. You should make any dialogs modal so that this function does not return until they are dismissed.

Called by the editor when the current game is saved to disk. This will only be called if your plugin is selected into the current game.

buffer is a byte array of size bufsize, which you can write any data to as you see fit. The buffer will then be written into the user’s game file. You must return the number of bytes actually used, which can be up to and including bufsize.

If you need more storage space than bufsize provides, you will have to write your own seperate file out to disk, store in the registry, or do some compression.

The current version of AGS gives you a 5120 byte buffer, but future versions may increase or decrease this amount, so be sure to check bufsize before using it.

You will probably only need this function if you have some options in the Properties that the user can set, otherwise there’s no need to use it.

Called by the editor when a game is loaded from disk. This will only be called if your plugin is selected into the new game.

This entry point is never called by AGS, but it must be present and exported from your DLL in order to let AGS know that it is a valid plugin that supports version 5 and later of the engine interface. If you don’t export this, AGS won’t load the plugin.

The IAGSEditor interface

This interface is provided to the plugin as the way of calling back to the editor. It provides these members:

Specifies the interface version. You should check this to determine what version of the editor is being used, because certain interface methods will have been added in later versions, and attempting to use them with an earlier version will crash the system.
The current version number for the latest version of AGS is 1.

Returns the window handle to the AGS Editor’s main frame. This might be useful if you wanted to add extra menu options to the editor, for example.

Returns the window handle to the current active window. If you want to pop up a messagebox, for instance, you should always use this handle as the parent, because using the main frame’s handle would un-modal any dialog boxes currently displayed.

Adds the contents of header to the built-in script header, which is compiled into every script in the game. The idea here is that you would use this to register your text script functions, for example:

char *header = «import int Add (int, int);
import int Substract(int, int); «;
RegisterScriptHeader (header);

Note that the editor only keeps a reference to this string rather than a copy, so do not overwrite or destroy the string after calling this function.

Unregisters the specified script header, which you earlier used with RegisterScriptHeader.

Run-time events

Called by the game engine when the game is loading. This function is called once AGS has loaded everything it needs to into memory, but before it loads the global script.
Your plugin should use this opportunity to register any text script functions that it provides, and to request hooks for any game events that it wants to handle.

Once this function completes, the plugin will only regain program control when one of its text script functions is called, or when one of the hooks it registered is executed.

This function is called before the graphics subsystem is started, so functions like GetScreenDimensions and GetGraphicsDriverID will not work if called from this event.

Called by the game engine just before it exits. This gives you a chance to free any memory and do any cleanup that you need to do before the engine shuts down.

(Shutdown is only called by engine interface version 13 and above.)

Return 0 to tell the engine to continue processing the event as normal. Return 1 to tell the engine not to call any other handlers, whether in other plugins or the text script, for this event.
For example, if you were handling a Keypress event, and you did something in response to the keystroke, you may wish to return 1 to stop anything else also dealing with the keystroke.

Only return 1 when absolutely necessary since it may interfere with other plugins operation.

Called by the game engine when a new line of text script is about to be executed. This will only be called if you have requested the AGSE_SCRIPTDEBUG event with the RequestEventHook function (see below).

scriptName contains which script is running (either «Global script» or «Room XX script» (where XX is the room number)). lineNum contains the line number that is about to be run.

This callback is also called with lineNum set to 0 when a script finishes running.

Return 1 if you handled the debug, or 0 to allow other plugins to have a go.

(Supported by engine interface version 13 and above)

Called by AGS just before the graphics driver is initialized. This allows you to make changes to how the driver starts up.

driverID is the ID of the graphics driver in use. This can either be «D3D9» if the player is using the Direct3D driver, or «DX5» if they are using the standard DirectDraw driver.

If driverID is «D3D9», then the data parameter is a pointer to the D3DPRESENT_PARAMETERS structure that AGS is about to pass into CreateDevice. If you need to enable extra features such as the Auto Depth Stencil, then you can do so by changing the member variables at this point.

If driverID is «DX5», then the data parameter will currently be passed as NULL.

This event is called just as the graphics subsystem is starting, so functions that like GetScreenDimensions that rely on the screen being initialized will not work if called from this event.

This event can be called more than once. It is called every time AGS tries to initialize the screen, so if the first resolution is not supported for example then it will get called again as AGS retries.

(Supported by engine interface version 23 and above)

The IAGSEngine interface

This interface is provided to the plugin as the way of calling back to the editor. It provides the following methods.

The text script currently supports char, short and int types. These are 1, 2 and 4 byte integers respectively. Text script strings are implemented as standard C-style char* pointers, but with preallocated buffers of 200 bytes per string. Therefore, if you write a function which takes a string from the text script, make sure that if you add anything to it you don’t write past 200 characters, or problems will result.

Specifies the interface version. You should check this to determine what version of the engine is being used, because certain interface methods will have been added in later versions, and attempting to use them with an earlier version will crash the system.
AGS v2.51 (the first version to support plugins) was distributed with interface version 7, so you can reasonably expect that as a minimum for your plugin.

If you need to exit the game, you should always use this instead of the standard VC++ exit() functions.

Returns the full build number of the engine, for example «2.51.400». You can use this with strcmp if your plugin requires a specific engine version.

Allows you to add your own text script functions to AGS. name is the name of the function as the script knows it, for example «AddNumbers». address is a pointer to your function that implements the command. For example:

int AddNumbers (int a, int b) < return a + b; >
.
RegisterScriptFunction («AddNumbers», AddNumbers);

Note that it is possible to override the built-in functions with this command. If you do, for example,
RegisterScriptFunction («GetLocationType», AddNumbers);
then any calls from the script to GetLocationType will be intercepted by your plugin (and in this case a stupid result returned).

If you want to override built-in functions, make sure that yours have identical parameters, otherwise the stack could get messed up and crash the engine.

AGS 2.7 and later support object-based scripting. In order to export an object from your plugin, you’ll need to include its struct definition in the RegisterScriptHeader editor call. Then, you export functions as follows:

int PluginObject_DoSomething(PluginObject *obj, int a) <
return a + 10;
>
.
RegisterScriptFunction(«PluginObject::DoSomething^1»,
PluginObject_DoSomething);

In other words, the function takes the object as its first parameter. The exported name is structname::functionname^numparams, where numparams is the number of parameters it takes (excluding the object itself).

Returns the window handle of the main game window.

Returns an ID string representing the current graphics driver. This can either be «D3D9» if the player is using the Direct3D driver, or «DX5» if they are using the standard DirectDraw driver.

If the engine interface version is less than 19, this function is not available; however, in that case you can safely assume that the DX5 driver is in use since earlier versions of AGS only supported that driver.

Your AGS_EngineStartup event is called before the graphics system is initialized. Therefore, you cannot call GetGraphicsDriverID from within AGS_EngineStartup as no driver is loaded at that point.

When the Direct3D driver is in use, the screen is redrawn each frame using 3D accelerated blits, and therefore there is no virtual screen. You can only manipulate the virtual screen when running with the DX5 driver.

Returns the main IDirectDraw2 interface that the game is using.

This function is only supported if the player is using the DX5 graphics driver.

Returns the IDirectDrawSurface2 interface associated with the specified bitmap.

This function is only supported if the player is using the DX5 graphics driver.

This is the Allegro BITMAP structure, not the Win32 GDI BITMAP. Do not try and use a win32 BITMAP with this function, as it will crash the system.

Returns a reference to the main screen bitmap (as an Allegro BITMAP). You can use this via DDraw with the GetBitmapSurface method, or use the various AGS drawing functions which are documented later.

This function is only supported if the player is using the DX5 graphics driver.

Requests that the engine calls the plugin’s AGS_EngineOnEvent function when the specified event occurs in future. Possible values are:

(version 6 and later only)

(unused, currently 0)

(unused, currently 0)

(version 24 and later only)

event description data value
AGSE_KEYPRESS triggered when the user presses a key on the keyboard ASCII value of keystroke, as text script on_key_press (but lower case a-z are passed as 97..122)
AGSE_MOUSECLICK triggered when the user clicks a mouse button mouse button pressed (1=left, 2=right, 3=middle)
AGSE_POSTSCREENDRAW triggered after the virtual screen has been drawn each frame, but before the mouse cursor is painted and it gets copied to the screen
AGSE_PRESCREENDRAW

(version 4 and later only)

triggered every frame after the room background has been drawn, but before anything else ** See Note 1 below
AGSE_SAVEGAME

(version 5 and later only)

triggered when the game position is saved. You can then use the interface FWrite function to write your own data. The script engine is in an invalid state at this point, so do not call any script functions. file handle of save game
AGSE_RESTOREGAME

(version 5 and later only)

triggered when the game position is loaded. You then use the FRead function to read the data back. You must read back the same number of bytes as you wrote. The script engine is in an invalid state at this point, so do not call any script functions. file handle of save game
AGSE_PREGUIDRAW

(version 6 and later only)

triggered once the screen has been constructed, but before the GUIs have been drawn on. triggered when the player leaves the current room, after the Player Leaves Screen event but before the screen fades out. old room number
AGSE_ENTERROOM

(version 6 and later only)

triggered when the player enters a new room, before the screen fades in new room number
AGSE_TRANSITIONOUT

(version 6 and later only)

triggered when the screen is about to fade out as the player changes rooms. If you return 1, AGS will not perform its screen transition. (unused, currently 0)
AGSE_TRANSITIONIN

(version 6 and later only)

triggered when the screen is about to fade in as the player changes rooms. If you return 1, AGS will not perform its screen transition.
AGSE_FINALSCREENDRAW

(version 12 and later only)

triggered each frame after the mouse cursor is painted and immediately before the virtual screen is copied to the screen. ** See Note 1 below
AGSE_TRANSLATETEXT

(version 12 and later only)

triggered whenever there is some in-game text that might need translating. If you return 0, AGS will translate it as usual; otherwise, you can return a char* pointer with the replacement text (the return pointer must point to some static memory since AGS does not take a copy) the text to translate (cast this parameter to const char*)
AGSE_SCRIPTDEBUG

(version 13 and later only)

triggers the AGS_ EngineDebugHook function every time the game script advances to a new line. N/A
AGSE_SPRITELOAD

(version 18 and later only)

triggered whenever a sprite is loaded into memory. This allows you to modify sprites as soon as they are loaded into the sprite cache. Do not attempt to access any other sprites from this event, since the sprite cache may be in an inconsistent state. sprite number
AGSE_PRERENDER

(version 21 and later only)

triggered every frame after the game logic has run but before anything is rendered to the pre-screen sprite cache triggered just before a save game is created. The script engine is still working at this point, so you can perform any tasks that you need to prior to the game data being saved (unused, currently 0)
AGSE_POSTRESTOREGAME

** Note 1: The data parameter to these events is 0 when using the DX5 driver; when using the D3D9 driver it is a pointer to the IDirect3DDevice9 that is currently being used for rendering. You can render extra primitives by calling all the normal methods on this interface.
(Interface version 20 and above only).

Gets the plugin data that was originally saved with AGS_EditorSaveGame. If your plugin had options that the user could set in the editor, this is how to retrieve them.

buffer is a byte array of bufsize, which the engine will copy the saved data into. It returns the number of bytes actually used.

Returns a reference to the virtual screen bitmap (as an Allegro BITMAP). The virtual screen is what all drawing routines will draw onto, and usually points to a screen-sized memory bitmap that the engine paints on to construct each frame. Once it is finished, the whole thing is copied to the real screen. This is done to prevent the screen flickering as various things are painted on.

This function is only supported if the player is using the DX5 graphics driver.

Gets a reference to the linear bank of memory that contains the surface of bmp. This allows you to directly plot pixels and so forth, simply by writing to the surface as an array.

This function locks the surface for you, which means you must call ReleaseBitmapSurface to release it when you are done. Failure to do so will most likely hang the engine.

Releases a bitmap previously locked with GetRawBitmapSurface.

Fills in the supplied variables with the current display mode that the engine is running at. You can pass any of the parameters as NULL if you don’t want to know them.

width is 320, 640 or 960; height is 200, 240, 400, or 480.
coldepth is either 8, 15, 16, 24 or 32 and reflects the actual colour depth that the game is running at.

Writes the string text to the current virtual screen at (x, y), using game font number font in colour color.

The x and y parameters are in actual screen co-ordinates, unlike the text script commands which always use 320-scale co-ordinates. You will need to use GetScreenDimensions and multiply up the co-ordinates accordingly if you wish to draw to a specific location.

Fills the supplied variables with the current mouse cursor co-ordinates. Note that these are real screen size co-ordinates, and so at 640×480 resolution these variables can go up to 640 and 480, unlike the text script system.

Fills in the supplied integer variables with the properties of the specified bitmap. You can pass any of the last three parameters as NULL if you don’t want to know them.

width is the width of the bitmap, in pixels. height is the height of the bitmap, in pixels. coldepth is the colour depth of the bitmap. Note that this is not necessarily the same as the game colour depth, since it is possible to use 256-colour backgrounds in a hi-colour game. Before doing any direct bitmap drawing, you should check this to make sure that you cast the pointer correctly.

Returns the number of background frames that the current room has (a normal room will return 1).

Returns the number of the currently displayed background frame. (0 is the default frame, 1 the first animated background, and so forth).

Returns a reference to the specified background frame (0 is the default frame, 1 the first animated background, and so on).

Returns the room number that the game is currently in.

Similar to the C function fread, this reads length bytes of buffer from file handle, returning the number of bytes actually read. The handle you use here must have been passed to you by AGS. For any other I/O, you can simply use the standard C functions.

Similar to the C function fwrite, this writes length bytes of buffer to file handle, returning the number of bytes actually written. The handle you use here must have been passed to you by AGS. For any other I/O, you can simply use the standard C functions.

Sets bmp as the current virtual screen, so that all drawing routines will draw onto it. You should restore the virtual screen to its original setting before returning from your plugin function. (Use GetVirtualScreen first to save the old reference).

Prints text to the current virtual screen at (x, y), using width pixels wide to do so, wrapping the text to ensure it does not exceed the width.

Draws graphic bmp to the current virtual screen at (x,y).
If masked is 0, the image is copied straight across.
If masked is 1, then transparent pixels are skipped.

Updates the internally stored mouse co-ordinates, and checks for mouse clicks and keypresses (and triggers the relevant plugin events). Also runs the music decoder to make sure that there is enough data to play.

Call this function if you have a long plugin function which takes more than half a second to execute, or if you need to get mouse and keypress events while still inside your function.

AGS is single-threaded; this means that any background music has to be played by updating the buffer at regular intervals. Therefore, if your function takes a while to execute you should call this to make sure the music doesn’t skip.

Returns the number of characters in the current game. Valid character ID’s range from 0 to the return value minus 1.

Returns the character state struct for character charid. This struct is documented in the header file, but is mostly identical to the character[] text script variable.

Beware when modifying character state structs. There are some caveats to watch out for, such as altering the X and Y values while the character is moving.
Also, remember that all view numbers stored are 1 less than the numbers shown in the editor and used in the text script.

Returns a reference to the game state structure. This is similar to the text script game. variables.

One handy member here is the AGSGameOptions.fast_forward variable. This is set to 1 while a cutscene is being skipped, so if you have any lengthy graphical effects you should not perform them if this is set. All operations which update any game state must still be performed however, or skipping the cutscene will desync the game.

Returns a reference to the current palette. This is an array of 256 elements of the AGSColor struct.

In a game with animating backgrounds, the palette can change quite often, so you should generally only rely on the palette remaining consistent for the length of your function.

Sets the current screen palette to palette, which must be an array of 256 color structs. The elements from start to finish are updated. Pass start as 0 and finish as 255 to update the entire palette.

Returns the number of the current player character.

Returns the number of objects in the current room.

Returns the state structure for object number.

Unlike the character structs, object state pointers are not constant throughout the game. Any time the room changes, these structs get reallocated. Therefore, do not keep a pointer that you get with this command after your function ends.

Converts the room co-ordinates (x, y) into current viewport co-ordinates. The input co-ordinates are room co-ordinates using the 320×200-style scheme that the text script uses and that object and character co-ordinates are stored as.

When you call this function, the variables you pass will be converted to hold the equivalent viewport co-ordinates. These are real resolution-sized co-ordinates within the current viewable area of the screen.

You should check the resulting co-ordinates with the screen size to determine whether they are currently visible on the screen.

Converts the viewport co-ordinates (x, y) into room co-ordinates. The input co-ordinates are screen resolution scale co-ordinates within the current viewable area of the room.

When you call this function, the variables you pass will be converted to hold the equivalent room co-ordinates, such as stored in the character and object structs, and used in the text script.

Returns the bitmap with the graphic for sprite slot number slot.

This method will automatically load the sprite from disk into the sprite cache if it is not already present.
The AGS Sprite Cache may destroy any sprite from memory at any time. Therefore, never keep a pointer obtained with this command. Always call this method again if you need to perform multiple operations with the bitmap.

Creates a blank bitmap sized width x height pixels at coldepth-bit colour. The bitmap will initially be filled with the transparent colour for the colour depth.

Returns NULL if the bitmap could not be created. You should always check the return value to avoid crashes.

To draw onto the bitmap either use GetRawBitmapSurface, or the SetVirtualScreen command followed by one of the drawing commands such as DrawText or BlitBitmap.
The bitmap will remain in memory until you explicitly free it with FreeBitmap. Use this command sparingly, as each bitmap you create eats into the engine’s available memory.
Only use this command with bitmaps you created with CreateBlankBitmap. Using it with an AGS system bitmap, such as one obtained with GetVirtualScreen, GetScreen or GetSpriteGraphic will crash the engine.

Returns a reference to the requested mask for the current room. which is one of the following values:
MASK_WALKABLE
MASK_WALKBEHIND
MASK_HOTSPOT
MASK_REGIONS

The walk-behind mask is exactly the same size as the room, and is at the current resolution. For example, a 320×200 room, being run at 640×400 in the engine, will give you a 640×400 bitmap.

The walkable area, hotspot and region masks are the size of the current room, but at the 320×200 resolution.

All of the masks are bitmaps with 8-bit colour depth, irrespective of what colour depth the game is running at.

The area masks are re-allocated when the player changes rooms, so do not keep a pointer returned by this function longer than you need it.

Added in version: 8 (MASK_REGIONS requires version 11).

Returns the view frame structure for the specified frame. view is the number you get from the editor (that’s used in SetCharacterView and so forth), not the view minus 1.

If view or loop are invalid, AGS will exit with an error message.

Returns the baseline for walk-behind area number area. This is always in character-resolution, ie. the maximum value is 200 in all resolutions.

Returns the memory address of the text script exported function funcName. This allows you to call any of the functions which AGS makes available to the text scripts.

Returns NULL if you specify a function that doesn’t exist.

Returns the pixel colour which is skipped when rendering the bitmap. This is 0 in 256-colour bitmaps and RGB (255,0,255) in hi-color bitmaps, so this function returns the pixel value to check for if you need to know.

Returns the walkable area scaling level at the specified co-ordinates. This ranges from 5 to 200, and specifies the scaling percentage, as set in the editor. The co-ordinates are specified as room co-ordinates.

Equivalent to the text script IsGamePaused function. This returns non-zero if the game is paused, or 0 if it is not paused.

Converts color, as specified in the AGS Editor, to the appropriate raw pixel colour for the current graphics mode.

If the user is running 8-bit colour, the value is returned unchanged.

If the user is running 16-bit colour, the value is returned unchanged unless it is less than 32, in which case it is converted to be the appropriate locked colour from the editor.

If the user is running 15-bit colour, the value is converted to an appropriate 15-bit RGB pixel value.

Returns the width, in pixels, of sprite number slot.

This is faster than using GetBitmapDimensions with GetSpriteGraphic, since the image does not need to be retrieved from the sprite cache.

Returns the height, in pixels, of sprite number slot.

This is faster than using GetBitmapDimensions with GetSpriteGraphic, since the image does not need to be retrieved from the sprite cache.

Calculates the width and height, in pixels, of displaying text in game font number font.

width or height can be NULL if you only want to know the other one.

Prints message to the in-game debug console (which the user can pop up with the

Equivalent to the text script function of the same name, returns 1 if the channel is currently in use, 0 if not.

Plays a new sound on the sound channel number channel. volume can be from 0 to 255, loop is 0 or 1.

soundType determines which sound driver is used to load the file:

All engine API functions such as DrawText and BlitBitmap call this automatically, so you only need to call it if you manually modify the bitmap surface.

Returns the mouse cursor struct which AGS uses to store details about the specified cursor mode.

The returned struct is read-only. You should not modify any members of it directly; rather, call the script functions such as ChangeCursorGraphic which ensure that the game state is updated properly.

Given a raw color (from a bitmap’s raw surface, or from GetRawPixelColor) at a given colour depth, returns the red, green, blue and alpha components, as values from 0-255.

You can pass any of the pointers as NULL if you don’t want to know that value. The alpha value only has meaning for 32-bit pixels; for all other colour depths, it will just be returned as 0.

Given a colour depth, and RGB values (from 0-255), this function returns the raw pixel value needed to display the requested colour on a bitmap of coldepth bits per pixel.

The alpha value is only meaningful for 32-bit colour alpha channel bitmaps, and it allows you to set the alpha value for the pixel. For bitmaps without an alpha channel, pass alpha as 0.

Returns what type of font fontNum is, as one of the following values:

FNT_INVALID invalid font number supplied
FNT_SCI font is a SCI font
FNT_TTF font is a TTF font

Creates a new dynamic sprite with the supplied colour depth, width and height. A dynamic sprite is not controlled by the AGS Sprite Cache, and so is not removed from memory until you manually call DeleteDynamicSprite. Thus, you can write to its bitmap surface without a problem.

You must remember to free the memory when you are done with the sprite, by calling DeleteDynamicSprite.

Returns 0 if the sprite could not be created, or the sprite slot number on success.

Removes the previously created dynamic sprite from memory. It can no longer be used in the game.

Determines whether the supplied sprite has an alpha channel or not. Returns 1 if it does, 0 if it does not.

This function is useful for determining whether you can ignore the alpha value when doing raw bitmap manipulations. If a sprite does have an alpha channel, you cannot ignore it since the default alpha value of 0 means totally invisible and the pixel would disappear.

Only 32-bit bitmaps can have an alpha channel. For all other colour depths, this function will always return 0.

Tells the engine not to call this plugin any longer when the specified event occurs. The values of event are the same as for RequestEventHook.

This is useful to call for performance reasons if you no longer require notification of an event.

Draws graphic spr to the current virtual screen at (x,y), with translucency over the background.

trans is the translucency level, from 0 to 255 (where 0 is fully transparent, and 255 is fully opaque). Pixels in the bitmap’s transparent colour are skipped completely.

Draws graphic spr to the current virtual screen at (x,y), but rotated to angle. Pixels in the bitmap’s transparent colour are skipped completely.

The sprite is positioned with its upper-left corner at (x,y), then it is rotated about its centre by angle. The angle is specified as a number from 0 to 255, where 128 would turn it 180 degrees, and 64 would turn it 90 degrees.

Returns the main IDirectSound interface that the engine is using. This command does not AddRef the pointer it returns, so you don’t need to Release it.

This function returns NULL if sound is disabled, or if the player is using the WaveOut driver rather than the DirectSound one.

Disables AGS’s sound system completely. Use this if you want your plugin to take over all audio functionality.

Determines whether a game script function can be run now. Returns 0 if there is currently a script running, or 1 if there isn’t.

Runs a script function in the game’s script. name is the name of the function to call. If globalScript is 1, it will call the function in the global script; if it is 0, the function will be run in the room script.

This function returns 0 on success, and a non-zero value otherwise. This will always fail when CanRunScriptFunctionNow returns 0.

Queues a script function to be run in the game’s script. name is the name of the function to call. If globalScript is 1, it will call the function in the global script; if it is 0, the function will be run in the room script.

If no scripts are currently running, the requested script will be run straight away. If there are scripts running, however, then the requested script will be queued up to run when the current one finishes.

Notifies the engine that the specified sprite has been updated by the plugin. You would call this if you changed the contents of a dynamic sprite, to make sure that the screen is updated to reflect your changes.

Allows you to specify whether the sprite is alpha blended or not. This allows you to create dynamic 32-bit RGBA sprites. Pass isAlphaBlended as 1 to enable the sprite’s alpha channel, or pass it as 0 to disable the alpha channel.

This function should only be used with 32-bit dynamic sprites. Using it with sprites of lower colour depths, or of sprites created in the AGS Editor, can have unpredictable results.

Registers a new managed object with the script engine. object points to the actual object itself, and callback points to the class implementing the IAGSScriptManagedObject interface, which will be called to perform operations on the object.

callback and object can, but do not have to, point to the same thing (ie. it is possible to have the actual object implement the interface; but if you do so, beware that you should not expose any normal variables from the class due to the vtable occupying the first part of the memory).

The object is added to the managed object pool, with a reference count of zero. Once this function has been called, object can be returned to the script and will be automatically picked up by the script engine.

See further down this page for a description of the IAGSScriptManagedObject interface.

From engine interface version 16 and later, this function returns the managed pool key for the object. You will not normally need this, but it can be useful to link a parent and child object if your structure is complex.

Registers the specified managed object type with the script engine, and supplies an IAGSManagedObjectReader, which provides the functionality for de-serializing objects of that type. This is used when the user restores a save game, in order to recreate any managed objects that were in existence when the game was saved.

See further down this page for a description of the IAGSManagedObjectReader interface.

AGS only keeps a pointer to typeName and does not copy the string, so make sure you do not supply a temporary or local variable as the type name.

Used from within the IAGSManagedObjectReader, this function re-registers a managed object after it has been read back from disk (for example, when the player restores a save game).

The key parameter is the object’s key, supplied to the ObjectReader, which allows AGS to match up the object internally. You should pass the key in here exactly as it is passed to the ObjectReader.

Gets the managed pool key of the specified object address. You will not normally need to use this function, however it can be useful to link up related objects after de-serialization.

This function is quite slow so you should avoid using it wherever possible.

Gets the memory address of the specified object from the managed pool. You will not normally need to use this function, however it can be useful to link up related objects after de-serialization.

Returns NULL if the key is invalid.

The new string becomes part of the AGS Managed Object Pool and will be freed automatically when there are no longer any script references to it. Note that it creates a copy of fromText, so it is safe for you to free the contents of fromText after calling this function.

Increments the reference count of the specified object in the managed object pool. This should be used if you are storing a reference to a managed object between script function calls, in order to ensure that the object does not get deleted.

Returns the new reference count of the object.

Be very careful when using this function. If you adjust the reference count incorrectly, you could cause a memory leak or the game could crash.

Decrements the reference count of the specified object in the managed object pool. This should be used if you are storing a reference to a managed object between script function calls, in order to ensure that the object does not get deleted.

Returns the new reference count of the object.

Be very careful when using this function. If you adjust the reference count incorrectly, you could cause a memory leak or the game could crash.

Changes the mouse cursor position to (x,y). As with GetMousePosition, these co-ordinates are specified in real resolution units, so in a 640×480 game the co-ordinates do go up to 640,480 (unlike the script function of the same name).

Simulates the mouse being clicked by the player. button is which mouse button (1=left, 2=right, 3=middle) to simulate. The effect should be identical to the user clicking the equivalent button on their mouse.

Gets the number of waypoints on the specified movement path.

The GetMovementPath family of functions allow you to access the paths for moving characters and objects in the game; and therefore allow you to anticipate where they will end up. The pathId is the value found in the AGSCharacter.walking and AGSObject.moving variables (but only if these variables are greater than 0; 0 or less means they are not moving).

Gets the last waypoint that was passed on this movement path. The starting point is waypoint 0, and the destination is the WaypointCount minus 1 (though this can never be returned, since the move is marked as finished once the last waypoint is reached).

Gets the X and Y co-ordinates of the specified waypoint on the specified path.

No error checking is done on these functions for performance reasons, so make sure you supply a valid pathId and waypoint.

Gets the X and Y speed at which the character/object will move from the specified waypoint to the next. The speeds are returned as 32-bit fixed point numbers. This means that the high 16 bits is the whole part of the number, and the low 16 bits is the fractional part. For example, if xSpeed is 0x00038000, that would represent a speed of 3.5 pixels per frame.

Returns whether the game is currently running under the AGS Editor’s debugger. If it is, then you are able to use the BreakIntoDebugger command.

Tells AGS to stop and break out into the editor’s debugger. This will not happen immediately, but will happen when the next line of script code is run. This function will only work if IsRunningUnderDebugger returns 1.

Fills in buffer with a path that you can use to open the specified file that resides in the Compiled folder.

If the game is running under the debugger, buffer will end up containing CompiledfileName
Otherwise, buffer will simply be set to a copy of fileName.

You should allocate buffer as MAX_PATH bytes long.

Returns a pointer to the IDirectInputDevice interface that AGS is using to control the keyboard. This command does not AddRef the pointer it returns, so you don’t need to Release it.

Returns a pointer to the IDirectInputDevice interface that AGS is using to control the mouse. This command does not AddRef the pointer it returns, so you don’t need to Release it.

Replaces the font renderer that AGS is currently using to draw the specified font with one of your own. The old renderer is returned.

This allows you to override AGS’s built-in font rendering with your own system. For example, if you didn’t want to use SCI or TTF fonts, this allows you to provide a custom implementation. See further down this page for a description of theIAGSFontRenderer interface.

IAGSScriptManagedObject interface

The IAGSScriptManagedObject interface is implemented for objects which the plugin wants to return to the game script. It allows a callback mechanism for AGS to request various operations on the object. You must implement the following:

Called when the reference count of the specified object reaches zero. The address parameter points to the particular object that is no longer referenced.

If force is zero, then you are merely being informed that the reference count has reached zero. Either you can destroy the object (in which case you should return 1), or you can leave it (return 0). If you leave it, then this function will be called again at various intervals to give you another opportunity to destroy the object.

If force is non-zero, then this is the object’s last chance to free its memory and it will not be called again. This is the case if the player is about to restore a saved game, or is quitting the game, and so forth.

Returns the type name of the object. This must match the type name supplied to AddManagedObjectReader for the corresponding reader.

Called when the player saves the game. You must write any persistent data for the object at address into the supplied buffer. The buffer is bufsize bytes long, and you must not write any more data than that.

You must return the number of bytes written to the buffer.

IAGSManagedObjectReader interface

The IAGSManagedObjectReader interface is implemented for each managed object type, to enable the objects to be reconstructed after being read back from disk. You must implement the following:

Called for each managed object when a saved game is restored. serializedData is the buffer that you wrote to in Serialize, and dataSize is the length of this buffer.

You should re-construct the object from the serialized data, and then re-register it using the RegisterUnserializedObject function. The key supplied to you here should be passed on unmodified to RegisterUnserializedObject in order for the object to be fully restored.

IAGSFontRenderer interface

The IAGSFontRenderer interface can be implemented to override AGS’s built-in text rendering with a custom system. The methods on the interface are as follows:

Used internally by AGS to load the font from disk. However, you currently cannot insert a custom renderer early enough in the process to override this method, therefore it will never be called.

Called when the engine is shutting down, to free the memory associated with this font. You should perform your own clean-up here, and then call onto the FreeMemory method of the old renderer that you replaced.

AGS will call this method to determine whether the specified font supports extended characters (ie. characters with a ASCII value of 128 or above). Return true or false, depending on your implementation.

If you return false from this function, AGS will not necessarily strip extended characters out of text. If you do not support extended characters, then you should implement the EnsureTextValidForFont method (below) to strip them out.

AGS will call this method to find out the width, in pixels, of drawing the specified text in the specified font. You should return the number of pixels that this will take up (assuming the text is all on one line and does not wrap).

AGS will call this method to find out the height, in pixels, of drawing the specified text in the specified font. You should return the number of pixels that this will take up (assuming the text is all on one line and does not wrap).

AGS calls this method to render text to a bitmap. destination is the bitmap surface that AGS is rendering to (you can use this with other functions like GetBitmapDimensions and GetRawBitmapSurface), and you need to draw the text starting with its top-left position at(x, y) on this surface.

colour is a raw pixel colour, not an AGS Colour Number.

This method is a workaround introduced for TTF fonts, which allows you to adjust the Y-position of the rendered text. You should implement this method so that it does nothing unless you have problems with text positioning.

AGS calls this method prior to actually rendering text, and allows you to check that all the characters in the text are supported by the font. If not, text is a writable buffer and you could replace them with question marks.

By default, you should implement this method so that it does nothing.

Источник

Поделиться с друзьями
Советы экспертов и специалистов
Adblock
detector