Руководство по созданию плагинов для игры Компьютерная эволюция 3
  1. Введение
  2. Формат плагинов
  3. Настройка Delphi
  4. Описание функций
  5. Принципы работы со значениями в главной программе
  6. Значения элементов массивов
  7. Пример плагина на Delphi
  8. Установка плагина
  9. Обратная связь

Введение

Начиная с версии 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;
begin
   PluginAuthor:='||';
end;
Здесь функция имеет пустой список формальных параметров и возвращает только один единственный параметр - данные об авторе. Этот параметр состоит из 3-х секций, каждая из которых разделяется знаком '|'. Первая секция - Имя автора плагина. Вторая секция - E-mail автора плагина. Третья секция - краткое описание плагина.
Вторая функция выглядит так:
function PluginExec(I,R,S,B:pointer;ISize,RSize,SSize,BSize:integer):boolean;
begin
   PluginExec:=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.



Принципы работы со значениями в главной программе

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

type
   IntMas=array of ^integer;
Данная запись создает тип IntMas, который является массивом указателей на тип integer. Аналогичные записи можно сделать и для других типов массивов:
RealMas=array of ^real;
StrMas=array of ^shortstring;
BoolMas=array of ^boolean;
Далее в теле функции PluginExec осуществляем следующие операции:
var
   Integers:IntMas;
begin
   setlength(Integers,ISize);
   Integers:=I;
Здесь мы объявляем переменную Integers типа IntMas. Задаем длину массива Integers(поскольку тип IntMas как раз и является массивом указателей), используя формальный параметр ISize. Аналогичную операцию проводим для остальных массивов:
var
   Reals:RealMas;
   Strings:StrMas;
   Booleans:BoolMas;
begin
   setlength(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;

uses
   Dialogs, SysUtils;

{$R *.res}

type IntMas=array of ^integer;

function PluginAuthor:Pchar;
begin
   PluginAuthor:='Ревенков Павел|RPsoft@mail.ru|Тестовый плагин';
end;

function PluginExec(I,R,S,B:pointer;ISize,RSize,SSize,BSize:integer):boolean;
var
   MyMas:IntMas;
begin
   setlength(MyMas,ISize); MyMas:=I;
   ShowMessage('Тестовый пример плагина. Текущий месяц - '+IntToStr(MyMas[0]^));
   PluginExec:=true;
end;

exports PluginExec, PluginAuthor;

end.


Установка плагина

После того, как вы создали окончательный dll файл, сохраните его вместе с файлами необходимыми для работы плагина (картинки, музыка и т.д.) в папку Plugins, которая находится там, где у вас установлена игра.

Обратная связь

Если вам что-то непонятно в этом руководстве или вы хотите задать мне какие-то вопросы, пишите мне на e-mail: RPsoft@mail.ru