Evil Islands (Add-On) *последняя версия*
(16.08.2020, 12:03)Vasial Написал:
(16.08.2020, 10:46)MorgenS Написал: Кстати да, хорошая идея. Я думаю, имелось ввиду описание выбранного мода. Другой вопрос: откуда их брать? Большинство старых модов не то что не поддерживают это, их авторов то даже не найти. Можно, конечно, каким-то образом впилить это в стартер, но тогда как ему отличать моды? По названию? Ну и как бы не совсем это задача стартера.

Их не так много, можно вставить описание самим, там делов минут 10.
Можно, апример, на github сделать reposotiry с описниями и стартер их оттуда смог бы подтягивать.
А отличать можно, ну например по хэшу.
Ответ
Меня всегда интересовала а вот эту проблему пинга 9999 стартером вообще можно решить?
Ответ
(17.08.2020, 04:15)Vasial Написал: Меня всегда интересовала а вот эту проблему пинга 9999 стартером вообще можно решить?

На всякий случай (мб ты знаешь), этот пинг означает, что ip сервера закрыт извне.
Это может быть из-за провайдера, клиенты которого скрыты под NAT, может быть из-за роутера по аналогичной причине но по отношению к пользователям домашней сети, так и просто из-за брендмауера. Возможно, есть и другие причины, о которых я не знаю или не смог вспомнить, но эти - самые распространнёные.

Может ли аддон помочь их решить? В теории, да. Многие torrent-клиенты используют средства для обхода NAT и добавления исключения в брендмауер. Аддон, в принципе, может делать так же. Хотя даже это не гарантирует, что серверу удастся стать доступным извне...

Эта идея есть у нас в TODO, но не могу точно сказать, когда до её реализации дойдут руки.
Ответ
Подредактировал изображение, может пригодится подобная иконка для стартера. Жаль исходников нету.


Файлы вложений Эскизы(ов)
   

.zip   Icon.zip (Размер: 91.3 KB / Загрузок: 215)
Ответ
(17.08.2020, 15:03)Vasial Написал: Подредактировал изображение, может пригодится подобная иконка для стартера. Жаль исходников нету.

Есть, кстати, исходник логотипа: https://allods.gipat.ru/index.php?p=file...atye-zemli
Из него тоже можно попробовать иконку сделать. Правда 16х16 всё равно придётся руками рисовать, а то на втупую уменьшенной ничего не видно даже при сохранении всех цветов (у .ico вроде как есть ограничения на 256 цветов).

16x16:    
32x32:    
96x96:    
310x310:    
Ответ
(17.08.2020, 21:57)Demoth Написал:
(17.08.2020, 15:03)Vasial Написал: Подредактировал изображение, может пригодится подобная иконка для стартера. Жаль исходников нету.

Есть, кстати, исходник логотипа: https://allods.gipat.ru/index.php?p=file...atye-zemli
Из него тоже можно попробовать иконку сделать. Правда 16х16 всё равно придётся руками рисовать, а то на втупую уменьшенной ничего не видно даже при сохранении всех цветов (у .ico вроде как есть ограничения на 256 цветов).

16x16:
32x32:
96x96:
310x310:
Ну в моем случае смысл был сохранить оригинал, тут же совсем другой значек.
Ответ
Всегда было интересно, а вот этот EI_Plugin нельзя включить в стартер? А то к некоторым модам его нужно устанавливать отдельно.
Так же увидел в классик моде версию 1.10.2 это как?
https://yadi.sk/d/pDzneB7IbvFVHg/%D0%9F%...0%BB%D0%B8
Ответ
(23.08.2020, 04:18)Vasial Написал: Всегда было интересно, а вот этот EI_Plugin нельзя включить в стартер? А то к некоторым модам его нужно устанавливать отдельно.
Так же увидел в классик моде версию 1.10.2 это как?
https://yadi.sk/d/pDzneB7IbvFVHg/%D0%9F%...0%BB%D0%B8
Да вот переношу как раз потихоньку его функциональность в аддон (в 0.10 перенёс новые скриптовые функции).

0.10.2 в классике это хотфикс релиз, который я ещё не публиковал официально. Через неделю вернусь из отпуска, сделаю ещё несколько изменений и зарелижу как 0.10.3 сразу.
Ответ
(23.08.2020, 06:36)Demoth Написал:
(23.08.2020, 04:18)Vasial Написал: Всегда было интересно, а вот этот EI_Plugin нельзя включить в стартер? А то к некоторым модам его нужно устанавливать отдельно.
Так же увидел в классик моде версию 1.10.2 это как?
https://yadi.sk/d/pDzneB7IbvFVHg/%D0%9F%...0%BB%D0%B8
Да вот переношу как раз потихоньку его функциональность в аддон (в 0.10 перенёс новые скриптовые функции).

0.10.2 в классике это хотфикс релиз, который я ещё не публиковал официально. Через неделю вернусь из отпуска, сделаю ещё несколько изменений и зарелижу как 0.10.3 сразу.
Пнятно, а то я думал мож человек своё что-то пилит.
Ответ
Багрепорт 2020.08.24/1

Версия игры: GOG
Если сразу после установки игры (не запуская её!) устновить EIStarter, он НЕ скопирует себе параметры из Nival Interactive (вероятно, потому что их там ещё нет). И при попытке запустить игру появится сообщение с просьбой вставить диск 2.

1. Хотелось бы, чтобы Addon использовал настройки из Nival Interactive. Пока не понимаю, зачем он их дублирует, нарушая нормализацию реестра.
2. Если это невозможно, и во время установки нужных параметров нет, стоит не завершать установку, а выбросить ошибку и попросить пользователя сперва запустить игру.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
Багрепорт 2020.08.24/2
Версия игры: GOG

При выборе разрешения 1920x1080x32bit игра удваивает его.
Скриншот: https://i.imgur.com/jvVFtwI.jpg

Если выбрать 1280x720x32bit такой проблемы нет.
Оригинальный лаунчер запускает в 1920x1080 без проблем.

Решение:
https://www.gipat.ru/forum/thread-2784-p...l#pid44949

На оригинальном game.exe этот праметр указан, а вот на скопированном в Starter/Engine - нет. Было бы здорово автоматически выставлять его при установки.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
(24.08.2020, 03:02)Albeoris Написал: Багрепорт 2020.08.24/2
Версия игры: GOG

При выборе разрешения 1920x1080x32bit игра удваивает его.
Скриншот: https://i.imgur.com/jvVFtwI.jpg

Если выбрать 1280x720x32bit такой проблемы нет.
Оригинальный лаунчер запускает в 1920x1080 без проблем.

Случайно не Windows 10 с включенным масштабированием?
Если в папке стартера в папке Engine в свойствах game.exe установить режим скейлинга приложением (см. скриншот в аттаче), проблема исчезает?
Потому что такая проблема есть при включенном в системе масштабировании.


Файлы вложений Эскизы(ов)
   
Visit allods.gipat.ru - best resource about Evil Islands and Rage of Mages series
Ответ
(24.08.2020, 09:55)MorgenS Написал: Случайно не Windows 10 с включенным масштабированием?
Если в папке стартера в папке Engine в свойствах game.exe установить режим скейлинга приложением (см. скриншот в аттаче), проблема исчезает?

Всё верно, спасибо! Smile
Было бы здорово, копировать этот параметр для .exe'ка в Starter/Engine/ при установке Addon'а.

Фича реквест 2020.08.24/1:
Проблема: Бег на дальние дистанции состоит из постоянных остановок для восстановления энергии.
Решение: Разрешить восстановление энергии, если персонаж перемещается шагом.


Фича реквест 2020.08.24/2:
Проблема: Длительность бафов отображается на отдельной вкладке, на которой отсутствует полоска здоровья (индивидуально - раздражает затемнение модели, не знаю почему).
Решение: Отображать маленькие иконки бафов с таймером или визуальным эффектом для оставшегося времени на основной вкладке.


Фича реквест 2020.08.24/3:
Проблема: Мгновенное переключение оружия в бою даёт огромное преимущество. Особенно если речь о маге.
Решение: Добавить анимацию смены оружия.




Фича реквест 2020.08.24/4:
Проблема: Часто для победы над противником не хватает одного удара, но: "вы умерли".
Решение: Добавить скрытую особенность, которая срабатывает раз в минуту. Если враг наносит смертельный удар атакой, которая могла бы нанести меньше урона, и его персонаж бы пережил, снижать урон до безопасного значения, оставляя персонажу 1-3 пункта жизни. Это создаст больше ситуаций "чудом выжил". Для начала отката способности персонаж должен закончить бой.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
Фича реквест 2020.08.24/5:
Проблема: Каждый переход на новую локацию начинается с ориентации камеры на север.
Решение: Добавить возможность автоматически ориентировать камеру.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
Demoth
Я правильно понимаю, что стартер перехватывате вызовы и заменяет их на реализацию из addon.dll?
Какой подход вы для этого используете?
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
(24.08.2020, 15:19)Albeoris Написал: Demoth
Я правильно понимаю, что стартер перехватывате вызовы и заменяет их на реализацию из addon.dll?
Какой подход вы для этого используете?

Стартер - просто графический интерфейс для выбора мода и настраивания игры/аддона.длл в реестре и для запуска игры таким образом, чтобы в процесс игры подгрузить addon.dll. Сейчас для этого достаточно запустить engine\game.exe вместо обычного, а в качестве рабочей директории процесса указать директорию стартера.

Аддон.длл делает всю полезную работу патча код игры в оперативной памяти.
Ответ
(24.08.2020, 18:08)Demoth Написал: чтобы в процесс игры подгрузить addon.dll. Аддон.длл делает всю полезную работу патча код игры в оперативной памяти.

Тот же самый вопрос. Smile
Какой подход использует Addon.dll для модификации / перехвата вызовов?

MS Detours/вручную расставляет джампы/патчит машинный код/что-то ещё?
Интересует последний пункт, вдруг изобрели что-нибудь супер-удобное. о.о
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ
(24.08.2020, 23:18)Albeoris Написал:
(24.08.2020, 18:08)Demoth Написал: чтобы в процесс игры подгрузить addon.dll. Аддон.длл делает всю полезную работу патча код игры в оперативной памяти.

Тот же самый вопрос. Smile
Какой подход использует Addon.dll для модификации / перехвата вызовов?

MS Detours/вручную расставляет джампы/патчит машинный код/что-то ещё?
Интересует последний пункт, вдруг изобрели что-нибудь супер-удобное. о.о

Да прям какого-то единого подхода нет. Detours/minhook хорошо подходят для перехвата простых (stdcall/cdecl) функций и заменой их своими, но для аддона они, к сожалению, не очень подходят - только какие-то отдельные редкие (редкие именно для аддона) случаи можно решить с их помощью. Если вдруг я ошибаюсь и не знаю каких-то возможностей детурса, с помощью которых можно было бы и остальные аддоновские кейсы решить, то (без иронии) с удовольствием бы про них узнал. Так-то detours шикарнейшая вещь.

Вообще, многие патчи в аддоне тупо патчат отдельные байты оригинального движка (nop-ят оригинальный код, заменяют какой-нибудь push одной константы на push другой константы или всякое в таком духе).

Для более сложных случаев в старом коде аддона сделано просто - замена оригинальной инструкции, которую нужно перехватить, на jmp на naked-функцию (declspec(naked)) с ассемблерной вставкой. Для нового кода я сделал в чём-то похожую на detours либу для
1) перехвата функций,
2) для перехвата конкретных вызовов функций,
3) для перехвата кода внутри функции.

Первый кейс точно можно решить с помощью detours, но не уверен, что он умеет перехватывать thiscall-функции (хотя не удивлюсь, если уже умеет). Второй кейс в общем-то настолько простой, что для этого никакая либа особо не нужна. А вот с третьим кейсом всё намного сложнее и я сильно сомневаюсь, что его можно как-то автоматизировать.

Вот пример третьего случая: https://gist.github.com/koteyur/416a6804...93b8214554
Тут под "как можно автоматизировать" я имею в виду проверку кода, который будет запатчен, правильный выбор позиции оригинального кода (после выполнения хука или перед) и адаптацию этого кода. Поэтому в моей либе предполагается, что тот кто будет писать код сам хорошо понимает, что он делает. Так что в моей либе ничего инновационного нет - простой cpp на 300 строчек кода.
Ответ
всегда хотел узнать, а реально ли вообще при помощи стартера решить главную проблему одиночной игры - генерация урона перед ударом, ну я про эту классику, когда замахивавшийся персом, сохраняешься, а потом перезагрузками пытаешься выкинуть максимальное число.
Ответ
(25.08.2020, 00:03)Demoth Написал: Вот пример третьего случая: https://gist.github.com/koteyur/416a6804...93b8214554
Тут под "как можно автоматизировать" я имею в виду проверку кода, который будет запатчен, правильный выбор позиции оригинального кода (после выполнения хука или перед) и адаптацию этого кода. Поэтому в моей либе предполагается, что тот кто будет писать код сам хорошо понимает, что он делает. Так что в моей либе ничего инновационного нет - простой cpp на 300 строчек кода.

Хм. Пока не понимаю проблемы.

При помощи Detours, мы перенаправляем все вызовы метода в нашу либину и получаем линку на оригинал. К нам приходит вызов, анализируем аргументы, в зависимости от них либо вызываем оригинал, либо выполняем наш хук. Вроде, всё тоже самое?

Единственное, в твоём случае я вижу некоторый контекст, у которого оттопырены значения регистров. В этой области я не силён, но предполагаю, что мы точно также можем получить их значения на момент вызова?

Возможность патчить отдельные инструкции в методах сама по себе интересная, но на мой взгляд очень скрупулёзная. Dodgy Вытащить его полностью и дело с концом. Smile

Ясно, я вот тоже всё ищу какую-нибудь серебряную пулю, которая может превратить рутину в "я просто пишу код", но всё никак не выходит. >_> И mail, не отвечают ни по одному из официальных ящиков...

P.S. А у тебя не было проблем с Hardware Breakpoint'ами? Выставляю в Cheat Engine бряку на чтение, и игра вылетает при первом же обращении. Sad


(25.08.2020, 00:45)Vasial Написал: всегда хотел узнать, а реально ли вообще при помощи стартера решить главную проблему одиночной игры - генерация урона перед ударом, ну я про эту классику, когда замахивавшийся персом, сохраняешься, а потом перезагрузками пытаешься выкинуть максимальное число.

Насколько я знаю, такой функции нет, но само собой, ничто не мешает это реализовать. Но зачем? Игра уже сейчас представляет собой Save/Load, а ты увеличишь их число в сотни раз. Я бы наоборот отключил сохранение, оставив только автоматическое при переходе между локациями. Smile

Кстати!

Feature Request 2020.08.25/1
Добавить возможность отключить сохранения в одиночной игре, оставив только N последних автосохранений, которые создаются автоматически при переходе между локациями.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 6 Гость(ей)