23.07.2011, 18:45
26.07.2011, 02:26
MOP, странно, у меня ЭРА ненавидит все твои dll и bin, кроме AllStartHeroes. Встречалось такое? Как только любой из них оказывается в папке с плагинами, при нажатии на кнопку "Сценарии" игра вылетает сразу после того, как прочтет карты.
26.07.2011, 04:38
Как применялись заплатки?
26.07.2011, 10:07
Berserker, все лежит в своих фолдерах. В частности, в EraPlugins. Честно говоря, куда я их только ни кидал.
29.07.2011, 08:57
Вот то-то и оно, что не всё должно лежать в папках. Я ведь не случайно указываю - "это для памяти", "это для exe". Что для exe - должно быть внутри exe, который патчить надо этим бинарником с помощью ExeBuilder-а.
Вообще, стоило бы делать всегда версии и для памяти, и для экзешника, но мне лень. В последнее время предпочитаю для народа делать только для памяти, чтобы подобных вопросов не возникало.
Длл-ки должны работать, если им ничего не мешает.
P.S. Обновил Battery.dll. Исправил одну ошибку (спасибо Майору за тестинг) и добавил триггер на клики к окне Форта (по его же предложению).
Вообще, стоило бы делать всегда версии и для памяти, и для экзешника, но мне лень. В последнее время предпочитаю для народа делать только для памяти, чтобы подобных вопросов не возникало.
Длл-ки должны работать, если им ничего не мешает.
P.S. Обновил Battery.dll. Исправил одну ошибку (спасибо Майору за тестинг) и добавил триггер на клики к окне Форта (по его же предложению).
29.07.2011, 23:44
http://zalil.ru/31485326
Две главы из руководства по Эре. Если есть замечания - пишите сейчас. Осталась глава для программистов/скриптописцев, самая объёмная.
MOP, а где сам майор-то?
Две главы из руководства по Эре. Если есть замечания - пишите сейчас. Осталась глава для программистов/скриптописцев, самая объёмная.
MOP, а где сам майор-то?
30.07.2011, 16:12
Berserker, MOP, прошу прощения. Я не очень то и внимателен в таких вещах.
01.08.2011, 17:49
+) В ядро Эры 1.9 добавлен контроль выполнения ЕРМ кода, так что F12 не действует больше во время выполнения ЕРМ.
+) Добавлены события OnBeforeTrigger/OnAfterTrigger для универсального отлова вызова любого ЕРМ триггера. Эра использует их для сохранения y-переменных.
-) Исправлена критическая ошибка в движке Эра 1.9- (не сохранялись локальные y-переменные для всех триггеров с ID > 30000).
+) Добавлены события OnBeforeTrigger/OnAfterTrigger для универсального отлова вызова любого ЕРМ триггера. Эра использует их для сохранения y-переменных.
-) Исправлена критическая ошибка в движке Эра 1.9- (не сохранялись локальные y-переменные для всех триггеров с ID > 30000).
01.08.2011, 18:01
(29.07.2011 23:44)Berserker Wrote: [ -> ]MOP, а где сам майор-то?Это и для меня загадка. Когда-то был частым гостем, а теперь даже если на форум зайдёт - ничего не пишет.
02.08.2011, 19:59
немного не скромный вопрос, Берс - на сколько ты знаешь внутряк ERM, можешь прицепить lua.dll к era.dll
ждать 3.59 можно бесконечно, а реализовать частичное LUA-програмирование можно и сейчас.
если мне не изменяет восприятие (не совсем трезвого мозга), то:
инструкции - STANDART function с обязательным вызовом при старте
триггеры - CALLBACK function
ресиверы - STANDART function
вроде вся эта ахинея доступна для реализации на lua.
с учётом сколько всего нагородили, очень странно что до сих пор луа не фурычит
ждать 3.59 можно бесконечно, а реализовать частичное LUA-програмирование можно и сейчас.
если мне не изменяет восприятие (не совсем трезвого мозга), то:
инструкции - STANDART function с обязательным вызовом при старте
триггеры - CALLBACK function
ресиверы - STANDART function
вроде вся эта ахинея доступна для реализации на lua.
с учётом сколько всего нагородили, очень странно что до сих пор луа не фурычит
02.08.2011, 20:25
GreyGhost, ЕРМ я знаю настолько, насколько могу знать из случайных вылазок в отладчик и поиска нужных вещей в исходниках. Lua может кто хочет добавлять, Эра всё для этого даёт: секции в сохранённом файле, подписку на события, выполнение команд ЕРМ на лету. Если не ошибаюсь, были попытки на heroescommunity.
Мне это просто не интересно, а мало кто из нас делает то, что неинтересно.
Мне это просто не интересно, а мало кто из нас делает то, что неинтересно.
02.08.2011, 22:10
луа уже добавлено в 3.59, можно выпросить у корвог 

02.08.2011, 22:38
Там через исходники. Здесь нужно самим. Главное найти энтузиаста.
03.08.2011, 00:03
вот если бы герои были на .NET... тогда бы они страшно тормозили и грузили проц тогда легко можно было бы сделать что угодно.
03.08.2011, 00:33
Пописал немножко, отдаю на рецензирование:
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; установить новую подсказку