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

Full Version: ERA III
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
daemon_n, в оригинале состояние ГСЧ тоже не сохраняется в сейве. И, поправь меня, если ошибаюсь, разве не по-разному выпадает мораль/удача при одинаковых действиях?
Berserker, по-разному. Мораль, удача, страх, урон...
Но вот есть возможность это контролировать бинарником или плагином?
Я вот для некоторых своих модов хотел бы иметь одинаковый результат.


Но зачем нам оригинальное состояние? Просто многие скрипты, генерирующие разные объекты/события можно "заобузить" на желаемый результат.

Хотя бы опционально это можно зафиксировать на одном значении?
Нет, даже теоретически. Либо ты пишешь скрипт, снижающий качество ГСЧ, который на основе координат боя, номеров героев и прочих фиксированных данных генерирует хэш, которым уже инициализируешь ГСЧ через VR:R в OnSetupBattlefield или OnBattleRound 0.
Berserker, тогда просто вернуть "повторяемость".

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

И всё же. Смотрю на пример Хота и переигровка битвы.
Там мы получаем всегда один результат в точном повторении действий в битве.

Но вопрос мой такой:

Почему ты отменил внесённое ранее сохранение ГСЧ? Было ведь даже особо объявлено, а лично мной принято с восторгом. Каковы же причины возврата?102
Дима, ну где сохранять состояние ГСЧ? В воздухе? В Хоте используется корявый родной генератор на простой хэш функции от текущего времени в миллисекундах. Состояние генератора — 4 байта простив 1000+ у Вихря Мерсенна. Его инициализация происходит до боя и при переигровке в фиксированное значение, которое получается из набора параметров, вроде координат боя. Ровно так, как сейчас работает генерация препятствий в бою. В сохранённой игре состояние генератора не запоминается. Потому, если хочется детерминированности, то делается это скриптом ровно схожим макаром: принудительная инициализация ГСЧ хэшем от набора фиксированных параметров.

У меня в моде Смешанные Нейтралы схожим образом реализована случайная расстановка отрядов.

Подсказываю как сделать:
Получаешь фикс. параметры x, y, z, leftHero, rightHero, day. Можешь взять другие.
Получаешь первый хэш = x OR (y SHL 8) OR (z SHL 16)
Получаешь второй хэш = (leftHero SHL 4) OR (rightHero SHL 12) OR (day SHL 20).
Получаешь комбинированный хэш = первый_хэш XOR второй_хэш XOR случайное_число_карты
Вызываешь Tm32Encode из Era Erm Framework для получения конечного хэша от комбинированного
Вызываешь VR:R0/хэш T0/хэш для установки ГСЧ в фиксированное значение.

Хэш можешь рассчитать в OnBattlefieldVisible с приоритетом 999 у скрипта. Его же использовать в OnBeforeBattleReplay, например. Нужно тестировать и смотреть очерёдность событий.

Случайное число карты генерируешь при старте игры.
Berserker, а как ты сделал в тот раз? Работало ведь
Никак и ничего. В лучшем случае могу вернуть родной генератор и всё. Именно его состояние принудительно устанавливает игра в значение хэша от нескольких параметров.
Berserker, нет, пока не надо. Я сперва должен найти лог этого. Возможно, я уже придумывать начал.96-copy
Для бинарников не работает проверка через !!SN:L; - так понимаю, и не должна?
Однако-таки есть возможность их определить:
Berserker, потрясающе!
Всё ещё жду список всех этих !!SN:F^штучек^;96-copy
Berserker, а что будет, если установить ERA III на WoG 3.59 от GrayFace? Это будет работать?
(12.02.2021 13:01)Raistlin Wrote: [ -> ]что будет, если установить ERA III на WoG 3.59 от GrayFace? Это будет работать?

Теоретически должно, т.к. конфликтной папки s (которую переименовывали при установке ERA на WoG 3.58) там уже нет.

Но папку WoG в ЭРЕ придётся переименовать, иначе её содержимое будет смешано с одноимённой папкой из WoG 3.59. Можно и не переименовывать, тогда будет полный бардак. 148
Несколько я знаю, не заведётся.
Angel.dll не позволит.
Ну и exe другой приведёт к неожиданным последствиям
XEPOMAHT, хорошо, я понял. Единственное, в новый ехе придется ведь подгрузить era.dll и еще пару библиотек? Если да, то как это сделать? Вот так получится?
Code:
call loadlib
db "mydll.dll", 0
Code:
loadlib:
call LoadLibraryA
jmp OriginalEntryPoint


daemon_n, возможно. Меня просто на эксперименты тянет, да и делать прямо сейчас это необязательно - не получится, так не получится. Зато мы все потом будем это знать ))
Reference URL's