Начиная с версии 3.3 Beta 1 в игре появилась использовать плагины. Плагины - набор расширений к игре. Они добавляют новые возможности в игру, могут изменять ее ход и т.д.
Примечание 1: здесь и далее будут рассматриваться примеры плагинов для текущей версии (на данный момент текущей версией является 4.0.3). Это связано с тем, что в более ранних версиях могли быть найдены ошибки или недоступны некоторые параметры.Примечание 2: Рассматриваемый здесь материал рассчитан на человека знакомого с языком программирования Object Pascal или С++, в частности с системой проектирования прикладных программ Delphi или Visual Studio. Также очень желательны навыки работы с указателями и функциями.Примечание 3: Написанные плагины несовместимы с версиями игры ниже 4.0.3.Примечание 4: Поскольку в программе для строк используется тип данных shortstring - запись в строковые параметры для Visual C++ невозможна. А чтение строк должно начинаться не с нулевого символа, а с первого. Однако если вы используете Borland C++ Builder, то вместо создания типа char*, можно создать тип shortstring*, тогда запись в строковые параметры будет возможна..
Формат плагинов Все плагины должны быть сделаны в виде динамических библиотек. То есть иметь расширение dll. Другие форматы плагинов будут проигнорированы.
Настройка Delphi
Создание плагина в Delphi начинается с создания DLL. Создайте DLL и сохраните проект в папку Plugins, которая находится там, где вы установили игру. Можете нажать Ctrl+F9, чтобы убедиться, что был создан файл имя_вашего_проекта.dll. Поскольку в момент загрузки плагина ему передается управление, то неплохо было бы автоматически запускать игру и во время передачи управления плагину отслеживать возникающие события. Это даст возможность ставить точки прерывания и выполнять плагин по шагам. Активизируем данную возможность. Для этого в Delphi выбираем пункт Run -> Parameters.... В появившемся окне устанавливаем следующие параметры: Host Application - путь_к_исполняемому_файлу_игры; Working Directory - папка_где_у_вас_установлена_игра. На рисунке справа показано данное окно.
Настройка Visual C++ .NET
Создайте DLL с использованием библиотек MFC и сохраните проект в папку Plugins. Теперь откройте окно свойств проекта (Project -> Имя_проекта_Properties). На рисунке слева показано окно настройки проекта. В разделе Debugging, параметр Command, укажите путь к exe файлу игры. А параметру Working Directory присвойте путь к каталогу игры. В разделе Linker -> General установить параметр Output File равным имя_проекта.dll.
Описание функций В плагине обяхательно должны присутствовать две функции. Одна из функций - данные об авторе. Другая - управляющая функция. Описание первой функции выглядит следующим образом:
function PluginAuthor:Pchar;beginPluginAuthor:='||';end;Для Visual C++ это будет выглядеть так:
extern "C" __declspec(dllexport) char* PluginAuthor(void){ return "||"; }Здесь функция имеет пустой список формальных параметров и возвращает только один единственный параметр - данные об авторе. Этот параметр состоит из 3-х секций, каждая из которых разделяется знаком '|'. Первая секция - Имя автора плагина. Вторая секция - E-mail автора плагина. Третья секция - краткое описание плагина.Вторая функция выглядит так:function PluginExec(I,R,S,B:pointer;ISize,RSize,SSize,BSize:integer):boolean; stdcall;beginPluginExec:=true;end;И соответственно функция на Visual C++:extern "C" __declspec(dllexport) __stdcall PluginExec(void *I, void *R, void *S, void *B){ return true; } В отличие от предыдущей функции данная функция имеет несколько формальных параметров и возвращаемый параметр типа boolean (bool для Visual C++). Первые четыре формальных параметра в функции имеют тип Pointer (указатель без типа - void *). Это указатели на массив указателей: I - указатель на массив указателей на тип integer (int); R - тип real (double); S - тип shortstring (char*); B - тип boolean (bool). Параметры типа integer это длины соответствующих им массивов: ISize - длина массива указателей на тип integer; RSize - тип real; SSize - тип shortstring; BSize - тип boolean (для Visual C++ данные параметры необязательны). Данная функция возвращает в главную функцию значение 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;Теперь вкратце рассмотрим реализацию на Visual C++:typedef int* intp;typedef double* realp;typedef char* charp;typedef bool* boolp;
IntMas=static_cast(I); CharMas=static_cast(S); RealMas=static_cast(R); BoolMas=static_cast(B);
if (*IntMas[13]>90)MessageBox(NULL,"Отношение властей нормальное.","Сообщение из плагина",MB_OK|MB_ICONINFORMATION);Кроме этого следует в .def файле проекта, в разделе EXPORTS прописать следующие строки:PluginAuthor @1PluginExec @2
Значения элементов массивов Далее приводится таблица значений элементов массивов, которые можно использовать в плагинах.
Целые числа
Номер элемента Значение 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 Производительность добавляемая при включении технологии Hyper Threading 36 Скидка на винчестеры (если в магазине проходит акция) 37 Скидка на видеокарты (если в магазине проходит акция) 38 Скидка на процессоры (если в магазине проходит акция) 39 Объем установленной оперативной памяти 40 Тип установленной оперативной памяти (PC 2100, 2700, и т.д.) 41 Скорость чтения дисков CD-ROM 42 Скорость записи дисков CD-R 43 Скорость записи дисков CD-RW 44 Скорость записи дисков DVD-R 45 Скорость записи дисков DVD-RW 46 Скорость течения времени (часов в секунду) 47 Количество взломанных Unix-машин 48 Количество взломанных Windows-машин 49 Количество арестов 50 Степень неприятия к последней запущенной игре 51 Количество испорченных при записи болванок 52 Текущий час 53 Время с момента последнего обновления антивирусных баз 54 Производительность добавляемая после дефрагментации диска 55 Сумма кредита игрока 56 Процент кредита 57 Количество дней до конца срока кредита 58 Время в днях со времени последней дефрагментации 59 Количество знаний по Basic 60 Степень прозрачности главного окна 61 Количество значий по программированию (общий рейтинг) 62 Диагональ используемого монитора 63 Количество предоплаченного трафика за интернет 64 Температура видеокарты 65 Ежемесячная стоимость размещения сайта на платном хостинге (0 - бесплатный хостинг) 66 Ежемесячная квартплата 67 Престиж купленного автомобиля 68 Комфорт купленного жилья 69 Размер активного раздела 70 Свободное место на активном разделе 71 Количество дней оставшихся до завершения обучения игрока программированию 72 Язык изучаемый игроком на курсах программирования (56 - Basic; 57 - Pascal; 58 - Assembler; 59 - C++)
Вещественные числа
Номер элемента Значение 0 Рейтинг игрока 1 Деньги игрока 2 Настроение игрока 3 Напряжение на процессоре 4 Сумма пени снимаемого с игрока при просрочке кредита
Строковые параметры
Номер элемента Значение 0 Рабочая папка программы 1 Имя игрока 2 Чипсет материнской платы 3 Чип видеокарты 4 Тип разъема на материнской плате куда может быть установлена видеокарта 5 Тип операционной системы(установленной на активном разделе) 6 Тип разъема видеокарты для подключения к материнской плате 7 Тип среды разработки(установленной на активном разделе) 8 Дата последнего обновления антивирусных баз 9 Имя последней запущенной пользователем игры 10 Тип установленной оперативной памяти (DDR, DDR2 и т.д.) 11 Адрес сервера обновления антивирусных баз 12 Комментарий к сохраненной игре 13 Метка активного раздела 14 Файловая система активного раздела 15 Операционная система установленная на активном разделе 16 Установленная среда разработки(здесь и далее идут программы установленные в систему находящуюся на активном разделе, при том что сами программы могут быть расположены как на логических разделах, так и на активном основном) 17 Установленный антивирус 18 Установленный противоспамный фильтр 19 Установленный брандмауер 20 Установленная программа дефрагментации 21 Установленная программа для работы с разделами жесткого диска 22 Установленный браузер 23 Установленный файловый менеджер 24 Установленная программа для тестирования компьютера 25 Установленная программа для копирования дисков 26 Установленный аудио конвертер 27 Установленный видео конвертор 28 Установленная программа для разгона видеокарты
Флаговые параметры
Номер элемента Значение 0 Имеет ли игрок самую престижную работу (начальник) 1 Возможность записи DVD дисков 2 Будет ли игроку предоставлено 100 Мб преоплаченного трафика за интернет при покупке модема (если в магазине проходит соответствующая акция) 3 Делал ли игрок экстримальный разгон видеокарты 4 Проходит ли игрок обучение на курсах программирования
Пример плагина на 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.
Пример плагина на Visual C++ typedef int* intp;typedef double* realp;typedef char* charp;typedef bool* boolp;
extern "C" __declspec(dllexport) char* PluginAuthor(void){ return "Ревенков Павел|RPsoft@mail.ru|Тестовый плагин"; }
extern "C" __declspec(dllexport) __stdcall PluginExec(void *I, void *R, void *S, void *B){intp *IntMas;charp *CharMas;realp *RealMas;boolp *BoolMas;
IntMas=static_cast(I); CharMas=static_cast(S); RealMas=static_cast(R); BoolMas=static_cast(B);
if (*IntMas[13]>90)MessageBox(NULL,"Отношение властей нормальное.","Сообщение из плагина",MB_OK|MB_ICONINFORMATION);
return true;}
Установка плагина После того, как вы создали окончательный dll файл, сохраните его вместе с файлами необходимыми для работы плагина (картинки, музыка и т.д.) в папку Plugins, которая находится там, где у вас установлена игра.
Обратная связь Если вам что-то непонятно в этом руководстве или вы хотите задать мне какие-то вопросы, пишите мне на e-mail: RPsoft@mail.ru