Current time: 11.04.2024, 11:47 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Typhon v. 2.9
» Инструмент мододелов из MoP для ЭРЫ
Author Message
Berserker Offline
Administrators

Posts: 16467
Post: #286

daemon_n, нет, переименовывать нельзя. А версия Эры?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
09.02.2020 01:01
Find all posts by this user Quote this message in a reply
Ethereal Offline

Posts: 342
Post: #287

Версия старая. Я потому и спрашивал, есть ли у вас такое. Мне или Эру обновлять, или Тифон без дополнения использовать. Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.
09.02.2020 01:13
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2267
Post: #288

(09.02.2020 01:13)Ethereal Wrote:  Первое - чудовищно трудно будет сделать, ввиду массы изменённых скриптов ВоГ-а.

Можно обновить и без обновления скриптов - содержимое папки data/s просто не заменяй (т.е. устанавливай вручную). Например у меня вог-скрипты волочатся ещё от эры 2.46 (т.к. у себя в сборке обновляю только то, что мне надо - ERM весь всё равно нужно переписывать под новую ЭРА) и на ERA 2.9.9 они как-то умудряются работать (правда я ЭРУ использую только для моддинга, а не игры).
09.02.2020 02:11
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #289

Или на время обновления скопировать скрипты в другую папку.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
09.02.2020 03:35
Find all posts by this user Quote this message in a reply
Ethereal Offline

Posts: 342
Post: #290

128 Всё оказалось не так просто! Приходится теперь концентрировать все мои художества с ДЕФами, БМПхами, звуками и скриптами в одном, отдельным от всего, моде с Тифоном во главе. Давно это сделать надо было, что бы не шарахаться от обновлений, как конь от пожара. А потом придётся ставить заново чистый СоД, ВоГ и Эру последней модели. :D
09.02.2020 17:04
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #291

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
09.02.2020 17:13
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2267
Post: #292

(08.02.2020 01:11)Berserker Wrote:  -) Уведомляет Эру о перенесённой таблице монстров. Команда !!RD и мод «Новые Жилища» должны работать с Тифоном, используя верные стоимости монстров для расчётов.

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

Image: 7b5795a30bed.png

Почему ж всё в ЭРЕ так недокументировано и приходится осваивать методом научного тыка??? Из-за чего разработка плагинов растягивается на энное количество времени.
(This post was last modified: 10.02.2020 17:45 by XEPOMAHT.)
10.02.2020 16:25
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #293

XEPOMAHT, перенеси все изменения и назови файл *.era, тогда успеешь обработать OnAfterWoG событие.

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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
10.02.2020 20:10
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2267
Post: #294

(10.02.2020 20:10)Berserker Wrote:  Потому как у Мора изначально по сто раз устанавливаются хуки — некорректно реализована стартовая процедура TYPHON. У меня корректно с проверкой на тип события и инициализацией лишь единожды.

Я поставил твою проверку в стартовую процедуру, спасибо Yes . Все тифоновские хуки устанавливаются в AfterWog, которая срабатывает из dll нормально, единоразово (но почему-то кроме уведомления эры). Переименовывал *.dll в *.era - разницы не заметил: Тифон патчит игру и там и там одинаково (может быть потому, что я вместо эровских событий оставил моповский хук на все триггеры - боюсь трогать то, что работает без ошибок. Когда начну встраивать воговские скрипты - буду использовать события эры - теперь уже знаю как).
(This post was last modified: 10.02.2020 21:00 by XEPOMAHT.)
10.02.2020 20:59
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #295

Смысл в том, что главная функция 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


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
10.02.2020 21:07
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2267
Post: #296

(10.02.2020 21:07)Berserker Wrote:  Хук на ProcessErm рушит вообще всё ядро интерпретатора (ускорение, поддержку циклов, !!re, работу с контекстом). Потому его заменил на нормальные три обработчика событий:

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

Code:
proc CallTriggerERA
    call CallTrigger - функция тифона, исполняющаяся на всех триггерах
    jmp [Erafunction] - прыжок в код era.dll по заранее сохранённому адресу эровского хука
endp
(This post was last modified: 11.02.2020 00:55 by XEPOMAHT.)
11.02.2020 00:49
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #297

XEPOMAHT, если что, RegisterHandler поддерживает универсальные OnTrigger XXX, где XXX — номер ЕРМ триггера.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
11.02.2020 02:57
Find all posts by this user Quote this message in a reply
Mahno Offline

Posts: 49
Post: #298

Жаль, что в Эра + не работает typhonZ(Когда редактор городов переносишь в папку с тифоном, то он работает только,если typhon.dll удалить, т.е. без причала(В итоге:либо причал,либо редактор городов...Жаль-жаль-жаль
(This post was last modified: 14.02.2020 03:32 by Mahno.)
14.02.2020 03:31
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16467
Post: #299

Mahno, там совсем немного изменений в TyphonZ. Возможно, Херомант сможет выпустить небольшое обновление с таким же эфектом, но для 3.х Тифона.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
14.02.2020 05:01
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2267
Post: #300

1. Редактор городов не поддерживает новые города.
2. Исходники редактора есть только у Мастера.
3. У меня точно не выйдет пересобрать исходники так же точно как не пересобираются исходники редактора монстров из-за отсутствия данных формы окна в исходниках.
4. Сейчас завяз в исходниках патча для редактора карт я (увы, там банально высокоуровневым кодом имена монстров из тифоновских текстовиков в массив строк с нулевыми разделителями преобразовать не могу я - гугл не выдаёт примеров подобного кода на Дельфе, придётся наверное опять придумывать костыли...).
4. В какой-нибудь версии ERA+ все параметры городов начнут грузиться из текстовиков (пока что не получается написать загрузчик и обработчик текстовиков, который бы не глючил, увы преобразование текста в нужный символьный вид для меня - большая проблема).
14.02.2020 11:22
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group