09.02.2020, 01:01
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
09.02.2020, 01:13
Версия старая. Я потому и спрашивал, есть ли у вас такое. Мне или Эру обновлять, или Тифон без дополнения использовать. Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.
09.02.2020, 02:11
(09.02.2020 01:13)Ethereal Wrote: [ -> ]Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.
Можно обновить и без обновления скриптов - содержимое папки data/s просто не заменяй (т.е. устанавливай вручную). Например у меня вог-скрипты волочатся ещё от эры 2.46 (т.к. у себя в сборке обновляю только то, что мне надо - ERM весь всё равно нужно переписывать под новую ЭРА) и на ERA 2.9.9 они как-то умудряются работать (правда я ЭРУ использую только для моддинга, а не игры).
09.02.2020, 03:35
Или на время обновления скопировать скрипты в другую папку.
09.02.2020, 17:04

09.02.2020, 17:13
Ethereal, это самое правильное решение. Отдельный мод со своим именем 

10.02.2020, 16:25
(08.02.2020 01:11)Berserker Wrote: [ -> ]-) Уведомляет Эру о перенесённой таблице монстров. Команда !!RD и мод «Новые Жилища» должны работать с Тифоном, используя верные стоимости монстров для расчётов.
Метод научного тыка показал, что для Тифона 3.1 уведомлять ЭРУ нужно прямо во время инициализации typhon.dll, тогда всё работает (правда, не уверен, что !!RD при этом начинает работать корректно, но главное, что появляются стоимости ресурсов в окне найма монстров, т.е. хотя бы это сейчас работает на все 100%). Если сделать это во время afterwog'а, то в игре - ноль реакции. А если немного позже - ЭРА начинает ругаться и следует критическая ошибка с последующим падением игры:

Почему ж всё в ЭРЕ так недокументировано и приходится осваивать методом научного тыка??? Из-за чего разработка плагинов растягивается на энное количество времени.
10.02.2020, 20:10
XEPOMAHT, перенеси все изменения и назови файл *.era, тогда успеешь обработать OnAfterWoG событие.
1) Файлы с расширением *.dll грузятся после AfterWoG события.
2) Ошибка явно говорит о том, что функция вызывается дважды. Потому как у Мора изначально по сто раз устанавливаются хуки — некорректно реализована стартовая процедура TYPHON. У меня корректно с проверкой на тип события и инициализацией лишь единожды.
1) Файлы с расширением *.dll грузятся после AfterWoG события.
2) Ошибка явно говорит о том, что функция вызывается дважды. Потому как у Мора изначально по сто раз устанавливаются хуки — некорректно реализована стартовая процедура TYPHON. У меня корректно с проверкой на тип события и инициализацией лишь единожды.
10.02.2020, 20:59
(10.02.2020 20:10)Berserker Wrote: [ -> ]Потому как у Мора изначально по сто раз устанавливаются хуки — некорректно реализована стартовая процедура TYPHON. У меня корректно с проверкой на тип события и инициализацией лишь единожды.
Я поставил твою проверку в стартовую процедуру, спасибо

10.02.2020, 21:07
Смысл в том, что главная функция dll aka DLLMain вызывается при присоединении DLL к процессу, выгрузке из процесса, создании и удалении каждого потока. Событий много, а инициализацию нужно выполнить в самый первый раз.
Заменённая главная DLLMain:
Заменённая процедура установки хуков и патчей:
Хук на ProcessErm рушит вообще всё ядро интерпретатора (ускорение, поддержку циклов, !!re, работу с контекстом). Потому его заменил на нормальные три обработчика событий:
Заменённая главная DLLMain:
Code:
_OnAfterWoG db 'OnAfterWoG', 0
_OnCustomDialogEvent db 'OnCustomDialogEvent', 0
_OnBeforeBattleAction db 'OnBeforeBattleAction', 0
_OnAfterBattleAction db 'OnAfterBattleAction', 0
DLL_PROCESS_ATTACH = 1
match =FALSE, COPYMODE
{
proc TYPHON, hDll, Reason, Reserved
; только при подключении dll к процессу, не к потокам
.if dword [Reason] = DLL_PROCESS_ATTACH
; регистрируем обработчики событий
stdcall [RegisterHandler], OnAfterWoG, _OnAfterWoG
stdcall [RegisterHandler], OnCustomDialogEvent, _OnCustomDialogEvent
stdcall [RegisterHandler], OnBeforeBattleAction, _OnBeforeBattleAction
stdcall [RegisterHandler], OnAfterBattleAction, _OnAfterBattleAction
mov dword [761381h], 39859587; Заглушить вог-функцию ResetMonTable,
mov dword [761385h], 3271623302; мешающую редактору существ
mov dword [71180Fh+1], LoadCreatures
.endif
; возвращаем успех инициализации dll
xor eax, eax
inc eax
ret
endp
}
Заменённая процедура установки хуков и патчей:
Code:
; ГЛАВНАЯ ПРОЦЕДУРА
proc OnAfterWoG uses esi edi ebx, Event ; после инициализации WoG
; ставим хуки
mov esi, Table_Hooks
...
; Возврат:
ret
endp
Хук на ProcessErm рушит вообще всё ядро интерпретатора (ускорение, поддержку циклов, !!re, работу с контекстом). Потому его заменил на нормальные три обработчика событий:
Code:
proc OnCustomDialogEvent uses esi edi ebx, Event
.if dword [27F9964h] = 1986; диалог №1986
mov eax, dword [27F9968h]
.if signed eax > 4 & signed eax < 9 & dword [27F996Ch] <> 13
sub eax, 5
mov ecx, [Адрес_параметров_альтерветки_для_диалога_постройки_альтерветок]
mov eax, [eax * 4 + ecx]
xor ecx, ecx
xor edx, edx
inc edx
cmp dword [27F996Ch], 12
jnz .правый_клик
xchg ecx, edx
.правый_клик:
stdcall OpenCreatureWindow, eax, 119, 20, ecx, edx
.elseif (eax = 11 | eax = 13) & dword [27F996Ch] = 13
mov dword [887658h], 1; CloseDialog
.endif
.endif
ret
endp
proc OnBeforeBattleAction uses esi edi ebx, Event
mov ebx, dword [699420h]; COMBAT_MANAGER; ebx теперь хранит CombatManager
mov eax, [ebx + 3Ch]; Тип_действия
mov [Тип_действия_в_бою], eax
call Получить_адрес_структуры_стека_совершающего_действие
mov [Адрес_структуры_стека_совершающего_действие], eax
call Получить_адрес_структуры_стека_на_которого_направлено_действие
mov [Адрес_структуры_стека_на_которого_направлено_действие], eax
ret
endp
proc OnAfterBattleAction uses esi edi ebx, Event
mov ebx, dword [699420h]; COMBAT_MANAGER; ebx теперь хранит CombatManager
mov edi, [Адрес_структуры_стека_совершающего_действие]
mov esi, [Адрес_структуры_стека_на_которого_направлено_действие]
.if [Тип_действия_в_бою] = 7 & signed esi > -1 & signed [esi + Структура_стека.Текущее_количество] > 0 & [edi + Структура_стека.Тип_существа] <> 149; CR_Стрелковая_Башня
mov eax, [esi + Структура_стека.Тип_существа]
cmp byte [eax + RangeRetaliation_Table], 0
je .нет_способности
.есть_способность:
push 0
mov ecx, esi
mov eax, 442610h; проверка возможности стрельбы
call eax
test al, al
je .нет_способности
push edi
mov ecx, esi
mov eax, 43F620h; Стрельба_отряда_по_отряду
call eax
; фикс бага стрельбы уже в мёртвом состоянии, если стеку выпала Мораль
.if signed [edi + Структура_стека.Текущее_количество] < 1; стек убит
bt [edi + Структура_стека.Флаги], 24; Флаг_Отряду_выпала_Мораль; проверка на выпавшую мораль
jnb .нет_Морали
mov dword [ebx + 3Ch], 12; Отмена_действия_отряда
.нет_Морали:
.endif
.нет_способности:
.endif
ret
endp
11.02.2020, 00:49
(10.02.2020 21:07)Berserker Wrote: [ -> ]Хук на ProcessErm рушит вообще всё ядро интерпретатора (ускорение, поддержку циклов, !!re, работу с контекстом). Потому его заменил на нормальные три обработчика событий:
Для третьего Тифона там событий поболее будет - запрограммированные способности добавленных монстров и постинструкция для настройки некротрона. Тифоновский хук на ProcessErm не рушит ядро интерпретатора ЭРЫ. Он только сохраняет эровский хук в переменную, затем заменяет его хуком Тифона, а после исполнения кода из typhon.dll происходит прыжок в era.dll в ядро интерпретатора:
Code:
proc CallTriggerERA
call CallTrigger - функция тифона, исполняющаяся на всех триггерах
jmp [Erafunction] - прыжок в код era.dll по заранее сохранённому адресу эровского хука
endp
11.02.2020, 02:57
XEPOMAHT, если что, RegisterHandler поддерживает универсальные OnTrigger XXX, где XXX — номер ЕРМ триггера.
14.02.2020, 03:31
Жаль, что в Эра + не работает typhonZ(Когда редактор городов переносишь в папку с тифоном, то он работает только,если typhon.dll удалить, т.е. без причала(В итоге:либо причал,либо редактор городов...Жаль-жаль-жаль
14.02.2020, 05:01
Mahno, там совсем немного изменений в TyphonZ. Возможно, Херомант сможет выпустить небольшое обновление с таким же эфектом, но для 3.х Тифона.
14.02.2020, 11:22
1. Редактор городов не поддерживает новые города.
2. Исходники редактора есть только у Мастера.
3. У меня точно не выйдет пересобрать исходники так же точно как не пересобираются исходники редактора монстров из-за отсутствия данных формы окна в исходниках.
4. Сейчас завяз в исходниках патча для редактора карт я (увы, там банально высокоуровневым кодом имена монстров из тифоновских текстовиков в массив строк с нулевыми разделителями преобразовать не могу я - гугл не выдаёт примеров подобного кода на Дельфе, придётся наверное опять придумывать костыли...).
4. В какой-нибудь версии ERA+ все параметры городов начнут грузиться из текстовиков (пока что не получается написать загрузчик и обработчик текстовиков, который бы не глючил, увы преобразование текста в нужный символьный вид для меня - большая проблема).
2. Исходники редактора есть только у Мастера.
3. У меня точно не выйдет пересобрать исходники так же точно как не пересобираются исходники редактора монстров из-за отсутствия данных формы окна в исходниках.
4. Сейчас завяз в исходниках патча для редактора карт я (увы, там банально высокоуровневым кодом имена монстров из тифоновских текстовиков в массив строк с нулевыми разделителями преобразовать не могу я - гугл не выдаёт примеров подобного кода на Дельфе, придётся наверное опять придумывать костыли...).
4. В какой-нибудь версии ERA+ все параметры городов начнут грузиться из текстовиков (пока что не получается написать загрузчик и обработчик текстовиков, который бы не глючил, увы преобразование текста в нужный символьный вид для меня - большая проблема).