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

Full Version: Typhon v. 2.9
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
daemon_n, нет, переименовывать нельзя. А версия Эры?
Версия старая. Я потому и спрашивал, есть ли у вас такое. Мне или Эру обновлять, или Тифон без дополнения использовать. Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.
(09.02.2020 01:13)Ethereal Wrote: [ -> ]Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.

Можно обновить и без обновления скриптов - содержимое папки data/s просто не заменяй (т.е. устанавливай вручную). Например у меня вог-скрипты волочатся ещё от эры 2.46 (т.к. у себя в сборке обновляю только то, что мне надо - ERM весь всё равно нужно переписывать под новую ЭРА) и на ERA 2.9.9 они как-то умудряются работать (правда я ЭРУ использую только для моддинга, а не игры).
Или на время обновления скопировать скрипты в другую папку.
128 Всё оказалось не так просто! Приходится теперь концентрировать все мои художества с ДЕФами, БМПхами, звуками и скриптами в одном, отдельным от всего, моде с Тифоном во главе. Давно это сделать надо было, что бы не шарахаться от обновлений, как конь от пожара. А потом придётся ставить заново чистый СоД, ВоГ и Эру последней модели. :D
Ethereal, это самое правильное решение. Отдельный мод со своим именем 132
(08.02.2020 01:11)Berserker Wrote: [ -> ]-) Уведомляет Эру о перенесённой таблице монстров. Команда !!RD и мод «Новые Жилища» должны работать с Тифоном, используя верные стоимости монстров для расчётов.

Метод научного тыка показал, что для Тифона 3.1 уведомлять ЭРУ нужно прямо во время инициализации typhon.dll, тогда всё работает (правда, не уверен, что !!RD при этом начинает работать корректно, но главное, что появляются стоимости ресурсов в окне найма монстров, т.е. хотя бы это сейчас работает на все 100%). Если сделать это во время afterwog'а, то в игре - ноль реакции. А если немного позже - ЭРА начинает ругаться и следует критическая ошибка с последующим падением игры:

Image: 7b5795a30bed.png

Почему ж всё в ЭРЕ так недокументировано и приходится осваивать методом научного тыка??? Из-за чего разработка плагинов растягивается на энное количество времени.
XEPOMAHT, перенеси все изменения и назови файл *.era, тогда успеешь обработать OnAfterWoG событие.

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

Я поставил твою проверку в стартовую процедуру, спасибо Yes . Все тифоновские хуки устанавливаются в AfterWog, которая срабатывает из dll нормально, единоразово (но почему-то кроме уведомления эры). Переименовывал *.dll в *.era - разницы не заметил: Тифон патчит игру и там и там одинаково (может быть потому, что я вместо эровских событий оставил моповский хук на все триггеры - боюсь трогать то, что работает без ошибок. Когда начну встраивать воговские скрипты - буду использовать события эры - теперь уже знаю как).
Смысл в том, что главная функция dll aka DLLMain вызывается при присоединении DLL к процессу, выгрузке из процесса, создании и удалении каждого потока. Событий много, а инициализацию нужно выполнить в самый первый раз.

Заменённая главная 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
(10.02.2020 21:07)Berserker Wrote: [ -> ]Хук на ProcessErm рушит вообще всё ядро интерпретатора (ускорение, поддержку циклов, !!re, работу с контекстом). Потому его заменил на нормальные три обработчика событий:

Для третьего Тифона там событий поболее будет - запрограммированные способности добавленных монстров и постинструкция для настройки некротрона. Тифоновский хук на ProcessErm не рушит ядро интерпретатора ЭРЫ. Он только сохраняет эровский хук в переменную, затем заменяет его хуком Тифона, а после исполнения кода из typhon.dll происходит прыжок в era.dll в ядро интерпретатора:

Code:
proc CallTriggerERA
    call CallTrigger - функция тифона, исполняющаяся на всех триггерах
    jmp [Erafunction] - прыжок в код era.dll по заранее сохранённому адресу эровского хука
endp
XEPOMAHT, если что, RegisterHandler поддерживает универсальные OnTrigger XXX, где XXX — номер ЕРМ триггера.
Жаль, что в Эра + не работает typhonZ(Когда редактор городов переносишь в папку с тифоном, то он работает только,если typhon.dll удалить, т.е. без причала(В итоге:либо причал,либо редактор городов...Жаль-жаль-жаль
Mahno, там совсем немного изменений в TyphonZ. Возможно, Херомант сможет выпустить небольшое обновление с таким же эфектом, но для 3.х Тифона.
1. Редактор городов не поддерживает новые города.
2. Исходники редактора есть только у Мастера.
3. У меня точно не выйдет пересобрать исходники так же точно как не пересобираются исходники редактора монстров из-за отсутствия данных формы окна в исходниках.
4. Сейчас завяз в исходниках патча для редактора карт я (увы, там банально высокоуровневым кодом имена монстров из тифоновских текстовиков в массив строк с нулевыми разделителями преобразовать не могу я - гугл не выдаёт примеров подобного кода на Дельфе, придётся наверное опять придумывать костыли...).
4. В какой-нибудь версии ERA+ все параметры городов начнут грузиться из текстовиков (пока что не получается написать загрузчик и обработчик текстовиков, который бы не глючил, увы преобразование текста в нужный символьный вид для меня - большая проблема).
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
Reference URL's