Начиная с версии 3.3 Beta 1 в игре появилась использовать плагины. Плагины - набор расширений к игре. Они добавляют новые возможности в игру, могут изменять ее ход и т.д.
Примечание 1: здесь и далее будут рассматриваться примеры плагинов для текущей версии. Это связано с тем, что в более ранних версиях могли быть найдены ошибки или недоступны некоторые параметры.Примечание 2: Рассматриваемый здесь материал рассчитан на человека знакомого с языком программирования Object Pascal и в частности с системой проектирования прикладных программ Delphi. Также очень желательны навыки работы с указателями и функциями.
Формат плагинов Все плагины должны быть сделаны в виде динамических библиотек. То есть иметь расширение dll. Другие форматы плагинов будут проигнорированы.
Настройка Delphi
Создание плагина в Delphi начинается с создания DLL. Создайте DLL и сохраните проект в папку Plugins, которая находится там, где вы установили игру. Можете нажать Ctrl+F9, чтобы убедиться, что был создан файл имя_вашего_проекта.dll. Поскольку в момент загрузки плагина ему передается управление, то неплохо было бы автоматически запускать игру и во время передачи управления плагину отслеживать возникающие события. Это даст возможность ставить точки прерывания и выполнять плагин по шагам. Активизируем данную возможность. Для этого в Delphi выбираем пункт Run -> Parameters.... В появившемся окне устанавливаем следующие параметры: Host Application - путь_к_исполняемому_файлу_игры; Working Directory - папка_где_у_вас_установлена_игра. На рисунке справа показано данное окно.
Описание функций В плагине обяхательно должны присутствовать две функции. Одна из функций - данные об авторе. Другая - управляющая функция. Описание первой функции выглядит следующим образом:
function PluginAuthor:Pchar;beginPluginAuthor:='||';end;Здесь функция имеет пустой список формальных параметров и возвращает только один единственный параметр - данные об авторе. Этот параметр состоит из 3-х секций, каждая из которых разделяется знаком '|'. Первая секция - Имя автора плагина. Вторая секция - E-mail автора плагина. Третья секция - краткое описание плагина.Вторая функция выглядит так:function PluginExec(I,R,S,B:pointer;ISize,RSize,SSize,BSize:integer):boolean;beginPluginExec:=true;end;В отличие от предыдущей функции данная функция имеет несколько формальных параметров и возвращаемый параметр типа boolean. Первые четыре формальных параметра в функции имеют тип Pointer. Это указатели на массив указателей: I - указатель на массив указателей на тип integer; R - тип real; S - тип shortstring; B - тип boolean. Параметры типа integer это длины соответствующих им массивов: ISize - длина массива указателей на тип integer; RSize - тип real; SSize - тип shortstring; BSize - тип boolean. Данная функция возвращает в главную функцию значение true или false. True свидетельствует о том, что плагин выполнился нормально. Если вы используете в исходном коде блоки try и except, то в зависимости от ситуации передавайте значение true или false.
Принципы работы со значениями в главной программе Понятно, что создание плагинов было бы бессмысленным, если бы они не меняли какие-то значения в главной программе. Для доступа к значениям хранящимся в главной программе необходимо объявить имена типов указателей на массивы и произвести операцию разыменования. Рассмотрим, как это делается:
typeIntMas=array of ^integer;Данная запись создает тип IntMas, который является массивом указателей на тип integer. Аналогичные записи можно сделать и для других типов массивов:RealMas=array of ^real;StrMas=array of ^shortstring;BoolMas=array of ^boolean;Далее в теле функции PluginExec осуществляем следующие операции:varIntegers:IntMas;beginsetlength(Integers,ISize);Integers:=I;Здесь мы объявляем переменную Integers типа IntMas. Задаем длину массива Integers(поскольку тип IntMas как раз и является массивом указателей), используя формальный параметр ISize. Аналогичную операцию проводим для остальных массивов:varReals:RealMas;Strings:StrMas;Booleans:BoolMas;beginsetlength(Reals,RSize);setlength(Strings,SSize);setlength(Bolleans,BSize);Reals:=R;Strings:=S;Booleans:=B;Теперь можно работать со значениями, хранящимися в главной программе, используя операцию разыменования:Reals[0]^Используя данную запись мы получаем значение (операция разыменование), которое хранится в массиве указателей на вещественные числа под номером 0 (нумерация всех массивов в плагинах должна начинаться с 0). Под номером 0 хранится рейтинг игрока. Таким образом, если мы к примеру напишем такую запись:ShowMessage(IntToStr(Reals[0]^));...на экран выведется сообщение с текущим рейтингом игрока. Если же мы хотим изменить рейтинг игрока к примеру на 10 очков, то запись должна быть такой:Reals[0]^:=Reals[0]^+10;В конце плагина, в разделе exports необходимо обязательно указывать имена функций PluginExec и PluginAuthor.exports PluginExec, PluginAuthor;
Значения элементов массивов Далее приводится таблица значений элементов массивов, которые можно использовать в плагинах.
Целые числа
Номер элемента Значение 0 Текущий месяц 1 Текущий год 2 Текущий день 3 Возраст игрока 4 Сумма вклада в банке 5 Процент вклада в банке 6 Нумерация текущего статуса игрока: 0 - человек1 - чайник2 - юзер3 - продвинутый4 - хакерок7 Количество записанных дисков CD-ROM 8 Количество знаний по Assembler (аналогично C , Pascal и Basic): 0 - ничего не знаете1 - вступили на курсы2 - прошли 1-й этап обучения3 - прошли 2-й этап обучения4 - Закончили обучение9 Количество знаний по Pascal 10 Количество знаний по C 11 Количество чистых дисков CD-ROM 12 Количество написанных программ 13 Отношение властей 14 Скорость работы сканера 15 Скорость печати принтера 16 Безопасность монитора 17 Скорость работы с интернетом 18 Надежность ИБП 19 Производительность процессора 20 Производительность добавляемая при разгоне процессора 21 Тактовая частота шины FSB 22 Процент разгоняемости процессора 23 Множитель на процессоре 24 Температура процессора 25 Частота вращения кулера 26 Частота вращения шпинделя жесткого диска 27 Объем жесткого диска 28 Количество занятого места на жестком диске 29 Ежемесячная зарплата игрока 30 Тактовая частота шины на видеокарте 31 Тактовая частота памяти на видеокарте 32 Процент разгоняемости видеокарты 33 Объем установленной на видеокарте памяти 34 Производительность добавляемая при разгоне видеокарты 35 Производительность видеокарты 36 Производительность добавляемая при включении технологии Hyper Threading 37 Скидка на винчестеры (если в магазине проходит акция) 38 Скидка на видеокарты (если в магазине проходит акция) 39 Скидка на процессоры (если в магазине проходит акция) 40 Объем установленной оперативной памяти 41 Тип установленной оперативной памяти (PC 2100, 2700, и т.д.) 42 Скорость чтения дисков CD-ROM 43 Скорость записи дисков CD-R 44 Скорость записи дисков CD-RW 45 Скорость записи дисков DVD-R 46 Скорость записи дисков DVD-RW 47 Скорость течения времени (часов в секунду) 48 Количество взломанных Unix-машин 49 Количество взломанных Windows-машин 50 Количество арестов 51 Степень неприятия к последней запущенной игре 52 Количество испорченных при записи болванок 53 Текущий час 54 Время с момента последнего обновления антивирусных баз 55 Производительность добавляемая после дефрагментации диска 56 Сумма кредита игрока 57 Процент кредита 58 Количество дней до конца срока кредита 59 Время в днях со времени последней дефрагментации 60 Количество знаний по Basic 61 Степень прозрачности главного окна
Вещественные числа
Номер элемента Значение 0 Рейтинг игрока 1 Деньги игрока 2 Настроение игрока 3 Количество знаний игрока (приобретенных при разработке программ) 4 Напряжение на процессоре 5 Сумма пени снимаемого с игрока при просрочке кредита
Строковые параметры
Номер элемента Значение 0 Рабочая папка программы 1 Имя игрока 2 Чипсет материнской платы 3 Чип видеокарты 4 Тип разъема на материнской плате куда может быть установлена видеокарта 5 Тип операционной системы 6 Тип разъема видеокарты для подключения к материнской плате 7 Тип среды разработки 8 Дата последнего обновления антивирусных баз 8 Дата последнего обновления антивирусных баз 9 Имя последней запущенной пользователем игры
Флаговые параметры
Номер элемента Значение 0 Наличие CloneCD 1 Наличие DivX 2 Наличие AudioGrabber 3 Скачана ли программа для тестирования компьютера 4 Имеет ли игрок самую престижную работу (начальник) 5 Есть ли у игрока DVD привод
Пример плагина на Delphi
library Test;
usesDialogs, SysUtils;
{$R *.res}
type IntMas=array of ^integer;
function PluginAuthor:Pchar;beginPluginAuthor:='Ревенков Павел|RPsoft@mail.ru|Тестовый плагин';end;
function PluginExec(I,R,S,B:pointer;ISize,RSize,SSize,BSize:integer):boolean;varMyMas:IntMas;beginsetlength(MyMas,ISize); MyMas:=I;ShowMessage('Тестовый пример плагина. Текущий месяц - '+IntToStr(MyMas[0]^));PluginExec:=true;end;
exports PluginExec, PluginAuthor;
end.
Установка плагина После того, как вы создали окончательный dll файл, сохраните его вместе с файлами необходимыми для работы плагина (картинки, музыка и т.д.) в папку Plugins, которая находится там, где у вас установлена игра.
Обратная связь Если вам что-то непонятно в этом руководстве или вы хотите задать мне какие-то вопросы, пишите мне на e-mail: RPsoft@mail.ru