Работа с ini-файлами в Game Maker

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

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

Для того чтобы сохранить необходимые нам данные можно воспользоваться ini-файлами. Они достаточно просты в использовании, при помощи них легко создать и редактировать. Правда, в большинстве случаев, именно простоту в редактировании можно отнести к недостаткам ini-файлов. Ведь если есть возможность открыть их при помощи Блокнота и отредактировать любое значение - что помешает игроку изменить количеств бонусов/жизней или чего-либо еще? Исходя из этого, по моему мнению, ini-файлы благоразумней использовать для хранения не столь жизненно важных данных. Например - хранение данных игровых настроек.

Итак, нам требуется создание ini-файла так, чтобы мы могли взаимодействовать с ним непосредственно из игры.
Прежде всего нужно его создать. Сделать это можно используя простой Блокнот, открыв его и в разделе "сохранить как..." даём файлу любое имя не забывая при этом в конце добавить к имени ".ini".(кавычки ставить естественно не требуется. (В качестве примера-"settings.ini"). ini-файл создан.
Теперь нужно созданный файл заполнить, он состоит из секций, включающих в себя ключи. Секции записываются, например, так "[section_name]", (как вы вероятно догадались, кавычки тут тоже не нужны), ключи, входящие в секции, могут быть двух видов: числовые и строковые. Думаю, объяснять в чём их различие будет излишним.
Вот, мы создали ini-файл и прописали в нем, допустим:

[SETTINGS]
vol=0.2
light=0.5
player_skin=12
[DATA]
mass1=12
mass2=23
mass3=1

Примечание: количество возможных секций и ключей неограниченно для одного файла. Делать несколько секций необязательно, можно обойтись одной, правда, в этом случае будут возникать неудобства при редактировании ini-файла, будет тяжелее ориентироваться, если у Вас множество разных ключей. Однако, если у ключей у Вас мало - можете использовать одну секцию.

в данном примере были созданы две секции: секция "SETTINGS" c тремя значениями vol light player_skin, и секция “DATA”
c значениями mass 1,2 и 3

Game Maker предоставляет гибкие возможности по взаимодействию с ini-файлами, от просто считывания информации и записи новых данных, до полного удаления самого файла. Правда, на данный момент нам необходимо считать данные. Для этого, в нужном нам событии (Create, Game Start, Room Start, или еще где-нибудь) прописываем строку:

ini_open('settings.ini');

В данном примере написано settings.ini, а Вам следует прописать то имя, которое Вы указали при сохранении ini-файла.

Внимание: Имя файла обязательно должно быть заключено в апострофы. В противном случае Game Maker выдаст нам ошибку, ибо примет наше название за переменную.

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

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

volume=ini_read_real('SETTINGS',’vol',0); //Считывание значения ключа " vol "  из секции " SETTINGS "  и присваивание данного значения переменной volume. (Названия секции  и ключа также необходимо заключать  в апострофы)
mass[1]=ini_read_string('DATA','mass1',''); //Этой функцией мы считываем строковые данные ключа "mass1"  из секции "DATA". Все  то же самое, что  и при считывании числовых данных, кроме того, что результат будет строкой.

Внимание! Последний аргумент функций ini_read_real и ini_read_string (в предоставленном примере это 0 и '' (пустая строка)) - это значение, которое будет выдаваться программе по умолчанию. То есть, при случайном удалении ini-файла, программа не выдаст ошибку, а примет за значения переменных те значения, которые вы задали в этих функциях. А при переписывании данных под этими ключами - нужные секции и ключи будут созданы автоматически.

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

ini_close();

Ну вот и все. Вам был предоставлен минимум возможных манипуляций с ini-файлами. Основные функции для взаимодействия с ini-файлами приведены в справке:
ini_open(name) Открывает INI файл с именем name. Файл должен храниться в папке с игрой.
ini_close() Закрывает открытый INI файл (нельзя открыть несколько INI файлов одновременно).
ini_read_string(section,key,default) Возвращает строковое значение записи из секции section, с ключом key. Если такой пары ключ-значение не существует, то возвращается строка default.
ini_read_real(section,key,default) Возвращает числовое значение записи из секции section, с ключом key. Если такой пары ключ-значение не существует, то возвращается число default.
ini_write_string(section,key,value) Записывает в секцию section пару с ключом key и строковым значением value.
ini_write_real(section,key,value) Записывает в секцию section пару с ключом key и числовым значением value.
ini_key_exists(section,key) Возвращает true, если в секции section существует ключ key.
ini_section_exists(section) Возвращает true, если секция с именем section существует.
ini_key_delete(section,key) Удаляет ключ с именем key из секции с именем section.
ini_section_delete(section) Удаляет секцию с именем section.

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

В следующей статье мы с Вами рассмотрим использование файлов для сохранения необходимых нам данных, что позволит лучше защитить их, чем ini-файл. Хотелось-бы вместить всю необходимую информацию в одну статью, но, рассмотрев всё вышесказанное, я сделал вывод, что следует их разделить.
Также приношу извинения за отсутствие примера, иллюстрирующего статью. Он будет вместе со следующей статьей. Благодарю за понимание.