Wake of Gods Forum | Форум Во Имя Богов

Full Version: New Era Of Heroes
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Украл из dll бараторча:
IsNetworkGame (69959C) dword
GameType (698A40) dword (hotseat = 3)
MOP, странно, у меня ЭРА ненавидит все твои dll и bin, кроме AllStartHeroes. Встречалось такое? Как только любой из них оказывается в папке с плагинами, при нажатии на кнопку "Сценарии" игра вылетает сразу после того, как прочтет карты.
Как применялись заплатки?
Berserker, все лежит в своих фолдерах. В частности, в EraPlugins. Честно говоря, куда я их только ни кидал.
Вот то-то и оно, что не всё должно лежать в папках. Я ведь не случайно указываю - "это для памяти", "это для exe". Что для exe - должно быть внутри exe, который патчить надо этим бинарником с помощью ExeBuilder-а.
Вообще, стоило бы делать всегда версии и для памяти, и для экзешника, но мне лень. В последнее время предпочитаю для народа делать только для памяти, чтобы подобных вопросов не возникало.
Длл-ки должны работать, если им ничего не мешает.

P.S. Обновил Battery.dll. Исправил одну ошибку (спасибо Майору за тестинг) и добавил триггер на клики к окне Форта (по его же предложению).
http://zalil.ru/31485326
Две главы из руководства по Эре. Если есть замечания - пишите сейчас. Осталась глава для программистов/скриптописцев, самая объёмная.
MOP, а где сам майор-то?
Berserker, MOP, прошу прощения. Я не очень то и внимателен в таких вещах.
+) В ядро Эры 1.9 добавлен контроль выполнения ЕРМ кода, так что F12 не действует больше во время выполнения ЕРМ.
+) Добавлены события OnBeforeTrigger/OnAfterTrigger для универсального отлова вызова любого ЕРМ триггера. Эра использует их для сохранения y-переменных.
-) Исправлена критическая ошибка в движке Эра 1.9- (не сохранялись локальные y-переменные для всех триггеров с ID > 30000).
(29.07.2011 23:44)Berserker Wrote: [ -> ]MOP, а где сам майор-то?
Это и для меня загадка. Когда-то был частым гостем, а теперь даже если на форум зайдёт - ничего не пишет.
немного не скромный вопрос, Берс - на сколько ты знаешь внутряк ERM, можешь прицепить lua.dll к era.dll
ждать 3.59 можно бесконечно, а реализовать частичное LUA-програмирование можно и сейчас.
если мне не изменяет восприятие (не совсем трезвого мозга), то:
инструкции - STANDART function с обязательным вызовом при старте
триггеры - CALLBACK function
ресиверы - STANDART function
вроде вся эта ахинея доступна для реализации на lua.

с учётом сколько всего нагородили, очень странно что до сих пор луа не фурычит
   GreyGhost, ЕРМ я знаю настолько, насколько могу знать из случайных вылазок в отладчик и поиска нужных вещей в исходниках. Lua может кто хочет добавлять, Эра всё для этого даёт: секции в сохранённом файле, подписку на события, выполнение команд ЕРМ на лету. Если не ошибаюсь, были попытки на heroescommunity.
   Мне это просто не интересно, а мало кто из нас делает то, что неинтересно.
луа уже добавлено в 3.59, можно выпросить у корвог Sm
Там через исходники. Здесь нужно самим. Главное найти энтузиаста.
вот если бы герои были на .NET... тогда бы они страшно тормозили и грузили проц тогда легко можно было бы сделать что угодно.
Пописал немножко, отдаю на рецензирование:

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; установить новую подсказку
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Reference URL's