Пописал немножко, отдаю на рецензирование: 
Quote:  I. Новые команды.     Новые команды были введены при помощи расширения стандартной операции "SN". Все команды Эры могут работать со следующими элементами ЕРМ:       - Числовыми положительными и отрицательными константами;       - Синтаксисом установки (без модификатора "d") и получения ("?") значений;       - Переменными y+, v, w, x, z+, f..t, e;       - Строковыми константами в виде ^...^.     Ядро Эры передаёт командам набор целых чисел (4 байта каждое). В случае строк или синтаксиса получения значения, эти числа представляют собой адреса переменных. Адрес переменной - числовое значение, описывающее местоположение данных в оперативной памяти. Максимальное количество параметров команды: 64.     Примеры:     !!SN:Xv1;     передать число в v1     !!SN:X?v1;    передать адрес переменной v1     !!SN:Xz1;     передать адрес переменной z1     !!SN:X^text^; сохранить текст и передать его адрес          << Подгрузка динамической библиотеки (DLL) >>     !!SN:L[путь к библиотеке]/?[описатель загруженной библиотеки];          Пример:     !!SN:L^kernel32.dll^/?y1;          << Получить адрес машинной функции из библиотеки >>     !!SN:[описатель загруженной библиотеки]/[название функции]/?[адрес функции];          Пример:     !!SN:L^kernel32.dll^/?y1 Ay1/^lstrcpyA^/?y2;          << Выполнить машинную функцию >>     !!SN:E[адрес функции]/[соглашение о вызове]/аргументы...          Соглашение о вызове:       - 0 (PASCAL)       - 1 (CDECL или STDCALL)       - 2 (THISCALL)       - 3 (FASTCALL)            По умолчанию от функции ожидается целочисленный результат, который будет помещён в переменную v1. Если же функция возвращает вещественный результат, то к номеру соглашения нужно прибавить 4. Все системные библиотеки используют соглашение STDCALL.          Пример:     !!SN:L^kernel32.dll^/?y1;     !!SN:Ay1/^lstrcpyA^/?y2;     !!SN:Ey2/1/z1/z2; Скопировать содержимое z2 в z1. Аналог !!VRz1:Sz2;          << Переход на определённую команду текущего триггера >>     !!SN:G[номер команды, начиная с 0];          Пример:     !?CM0; правая кнопка мыши на карте приключений     0; !!SN:G2; перейти на команду №2     1; !!IF:M^данный текст никогда не покажется^;     2; !!IF:M^покажется этот текст^;          Примечание: нумерация команд приведена сугубо для примера.          << Получение адреса ЕРМ функции >>     !!SN:C0/[номер функции]/?[адрес функции];          Адрес ЕРМ функции используется для перехода на её любую команду.          << Переход на команду ЕРМ функции >>     !!SN:C[адрес ЕРМ функции]/[номер команды, начиная с 0];          Функция, получившая управления, использует те же локальные переменные, что и вызывающая. В этом её плюс. Обычный вызов функции (!!FU:P) - весьма дорогостоящая операция, а переход происходит почти мгновенно, при этом Эра запоминает адрес возврата.          << Возврат из перехода к ЕРМ функции >>     !!SN:R;          Пример:     !?FU40000;     0; !!IF:M^пока^;     1; !!IF:M^привет^;     2; !!SN:R;          !?CM0; правая кнопка мыши на карте приключений     !!SN:C0/40000/?y1;  y1 - адрес ЕРМ функции 40000     !!SN:Cy1/1;         Выполнить переход на 40000:1     !!IF:M^мир^;          Будет показано два сообщения: "привет" и "мир". 
     ! Внимание ! Очень важно, чтобы количество переходов совпадало с количеством возвратов.          << Прервать обработку текущего события >>     !!SN:Q;          Команда отличается от !!FU:E тем, что прерывает всю цепочку однотипных триггеров.     Пример:     !?FU40000;     !!SN:Q; покинуть цепочку триггеров FU40000          !?FU40000;     !!IF:M^это сообщение никогда не будет показано^;          !?CM0;     !!FU40000:P; вызвать функцию 40000          << Доступ к параметрам новых событий >>     !!SN:X[до 16 параметров]...          Новые события Эры (о которых речь пойдёт ниже) и добавляемые модулями события нуждаются в возможности обмениваться данными со скриптами. Эту возможность обеспечивает команда X, выступающая в качестве хранилища значений. Тип значений определяется способом работы с ними. Так, можно установить в слот 0 значение 5, а потом получить его в вещественную e-переменную. Поскольку работа происходит на машинном уровне, то в "e" окажется вовсе не 5, а неопределённый мусор. В случае получения строки, команда трактует значение в слоте как адрес. Поэтому "!!SN:X0; !!SN:X?z1;" приведёт к вылету, так как по адресу 0 нет никакой строки.          Пример:     !!SN:X?y1/?y2;  получить первых два параметра события     !!SN:Xz1;       первый параметр - адрес строки z1     !!SN:X?y1;      y1 - адрес строки z1          << Работа с дополнительной памятью >>       !!SN:M[...];            ЕРМ переменные статичны и ограничены в количестве. Статичность приводит к невозможности организовывать динамические структуры данных (например, списки), для которых нужны функции выделения и освобождения памяти, а ограниченное количество ведёт к необходимости строгого учёта индексов без возможности выйти за их пределы. Более того, ЕРМ строки в виде z-переменных занимают ровно 512 байт каждая в независимости от размера их содержимого. Эра предоставляет программисту до 2 млрд. слотов под массивы новых переменных (числовых или строковых). Размер массивов может изменяться средствами ЕРМ. Поскольку работа с динамическими структурами предполагает автоматическое выделение номеров слотов, то такая возможность присутствует. Слоты с положительными индексами принадлежат пользователю, а с отрицательными используются при автовыделении памяти.            << Удаление слота памяти >>       !!SN:M[номер слота, начиная с 0];              Пример:       !!SN:M5; удалить слот 5              << Получение/установка размера слота >>       !!SN:M[номер слота]/[?][количество элементов];              Размер слота - это количество элементов в массиве. Команда возвращает -1, если слот не существует.       Пример:       !!SN:M2/5;    установить количество элементов в слоте 2 равное 5.       !!SN:My1/?y2; получить размер слота y1 в переменную y2.              << Работа со значениями элементов слотов >>       !!SN:M[номер слота]/[номер элемента, начиная с 0]/[?][значение];              Пример:       !!SN:M1/3; размер слота 1 - 3 элемента       !!SN:M1/0/111 M1/1/222 M1/2/333; содержимое слота 1: 111, 222, 333       !!SN:M1/1/?y5;                    y5 - содержимое 1-го элемента слота 1       !!IF:M^%Y5^;                      выведет: "222"              << Получение адреса элемента слота >>       !!SN:M[номер слота]/?[адрес элемента]/[номер элемента];              ! Внимание ! При удалении слота или изменении его размера адрес станет недействительным!              Пример:       !!SN:M1/?y1/2; y1 содержит адрес 2-го элемента слота 1              << Создание нового слота >>       !!SN:M[номер слота]/[количество элементов]/[тип элементов]/[запоминать ли значения в сохранёнках];              Старое содержимое слота, если оно было, уничтожается.       *номер слота* - "-1" для автовыделения свободного номера и помещения его в v1.       *тип элементов*:         - 0 (число)         - 1 (строка)       *запоминать ли значения в сохранёнках*         - 0 (нет, при загрузке игры содержимое элементов будет представлять собой случайный мусор)         - 1 (да, содержимое нужно сохранять как есть)       Примечание: при 0 экономится место в файле и возрастает скорость сохранения.              Пример:       !!SN:M0/4/1/1;          выделить массив из 4-х строк в слоте 0. Сохранять их содержимое при загрузке       !!SN:M0/2/^привет^;     установить значение 2-й строки слота 0       !!SN:M0/3/^мир^;        установить значение 3-й строки слота 0       !!SN:M0/2/?z1 M0/3/?z2; получить значения 2-й и третьей строк в z1, z2       !!IF:M^%Z1 %Z2^;        выведет "привет мир"       !!SN:M0;                удалить слот 0       !!SN:M-1/0/0/0;         выделить пустой слот под временный массив чисел       !!VRy1:S1 R6;           сгенерировали случайное число 1..6       !!SN:Mv1/y1;            установили размер нового слота в это число       !!VRy1:-1;              y1 - индекс последнего элемента в слоте       !!SN:Mv1/y1/777;        значение последнего элемента слота - 777            << Получение размера строки >>     !!SN:K[строка или её адрес]/?[размер строки];          Пример:     !!VRz1:S^123^;     !!SN:Kz1/?y1; y1 = 3          << Работа с символами строки >>     !!SN:K[строка или её адрес]/[номер символа, начиная с 0]/[?][значение символа];          Пример:     !!VRz1:S^abc^;     !!SN:Kz1/2/^d^; установить 2-й символ строки z1 в "d"     !!IF:M^%Z1^;    выведет "abd"          << Копирование блока памяти >>     !!SN:K[кол-во байт]/[адрес источника]/[адрес приёмника]/[произвольное значение];          Пример:     !!SN:K12/?v1/?y1/1; скопировать 12 байт (3 числа по 4 байта) из v1, v2, v3 в y1, y2, y3     !!VRv1:C1/2/3;      v1 = 1, v2 = 2, v3 = 3     !!SN:K12/?y1/?v1/1; восстановить значения v1, v2, v3               II. Новые события (триггеры).     Новые события вводятся в игру не в виде привычных ЕРМ триггеров в виде !?XX, а в виде нестандартных номеров функций > 30000. Эра резервирует для своих нужд функции с номерами 77000..77999. Скриптописцы и создатели плагинов могут использовать значения в диапазоне 40000..134217727. Была убрана привязка к диапазону 0..30000 для ЕРМ функций.     Все новые события обладают набором из 16 локальных (неизменяемых повторно генерируемыми событиями) параметров. Доступ к параметрам осуществляется посредством команды SN:X.          << Расширенные стандартные события >>     Расширенные стандартные события также обладают собственными SN:X параметрами и дополнительными возможностями.             << !?GM1 >>        Параметры: Имя сохранения.                Пример:        !?GM1;        !!SN:X?z1;       получили имя сохраняемой игры        !!VRz1:+^_%Gc^;  добавили к нему цвет текущего игрока        !!SN:Xz1;        установили новое имя сохранения                Если красный игрок выбрал newgame, то игра будет сохранена в файл: "newgame_Красный.gm1".                << !?MM0 >>        Параметры:         1: Номер текущего отряда или -1.         2: Номер отряда, на который наведён курсор или -1.         3: Минимальный урон.         4: Максимальный урон.                 Триггер удобен для замены стандартной подсказки на расширенную с указанием, сколько единиц противника будут убиты при ударе.                Пример:         !?MM;         !!SN:X?y1/?y2/?y3/?y4;  получили параметры события         !!FU&y2=-1:E;           вышли, если это не подсказка об уроне         !!BMy2:H?y5 L?y6 N?y7;  y5 - жизнь, y6 - потерянное здоровье, y7 - кол-во единиц противника         !!VRy8:Sy5-y6;          y8 - здоровье последней единицы отряда         !!VRy9:Sy3:y5;          y9 - мин. кол-во умрут         !!VRy10:Sy3%y5;         y10 - урон по последней единице в худшем случае         !!VRy9&y10>=y8:+1;      y9 - мин. кол-во умрут         !!VRy11:Sy4:y5;         y11 - макс. кол-во умрут         !!VRy12:Sy4%y5;         y12 - урон по последней единице в лучшем случае         !!VRy11&y12>=y8:+1;     y11 - макс. кол-во умрут         !!VRy13:Sy5*y7-y6;      y13 - общее кол-во здоровья отряда         !!VRy9&y9>y7:Sy7;       y9 - мин. кол-во умрут         !!VRy11&y11>y7:Sy7;     y11 - макс. кол-во умрут         !!IF:V2/0;         !!IF&y9=y11:V2/1;       флаг 2 говорит о том, что мин. и макс. уроны совпадают         !!IF:V3/0;         !!IF&y9=y7:V3/1;        флаг 3 говорит о том, что весь отряд по-любому умрёт         !!VRz2:S^%Y3-%Y4^;      урон в формате "мин - макс"         !!VRz2&y3=y4:S^%Y3^;    урон в формате "урон"         !!VRz3:S^Damage:^;         !!if&3:;                если весь отряд умрёт           !!VRz1:S^%Z3 %Z2. {~Yellow}FATALITY{~}^;         !!el:;           !!VRz1:S^%Z3 %Z2. Kills: {~Yellow}%Y9-%Y11{~}^; урон с разбросом           !!VRz1&2:S^%Z3 %Z2. Kills: {~Yellow}%Y9{~}^;    урон без разброса         !!en:;         !!MM:Mz1;               установить новую подсказку 
			 
			
			
  
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов 
Поддержать проект 
			
		 |