Пописал немножко, отдаю на рецензирование:
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 для старых модов
Поддержать проект
|