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

Full Version: ERA II
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Algor, спасибо, VR:R, конечно, исправил.
Да, вместо него выполняется VR:R. Какая обратная совместимость в вопросе ГСЧ? Это был в своё время просто костыль на коленке в ответ на «нам не нравится, как генерирует rand-фуннкция игры». Хороший генератор псевдослучайных чисел и так обладает свойством слабой предсказуемости и равномерности распределения. Вихрь Мерсенна — один из лучших. Алгоритмически же VR:T и VR:V не отличимы.

И да, VR:T — один из источников рассинхронизации в сетевой игре (событие сработает только у одного из игроков) и абсолютно ненадёжен в плане генерации последовательности (выдаёт одинаковые). Если нужно намеренно сбросить значение генератора на число, зависимое от времени, то пример кода я указал. Берём то же время, что и Слава использовал (timeGetTime) и инициализируем генератор. Но такое не нужно почти нигде.

У меня при первом использовании генератор инициализируется от времени. Дальше хоть до конца жизни будет генерироваться неповторяемая последовательность чисел. Разве что можно было бы сделать сохранение его состояния в сейве, но тогда можно было бы в точности воспроизводить ход боя при перезагрузке, чего не было в оригинале.

XEPOMAHT, можно чуть подробнее? У меня не стоит Era Scripts на тестовой сборке.
Algor, да, объясняю, почему остаток от деления даёт неравномерно распределённые результаты.
Генератор выдаёт двоичное число, скажем 0..15 (16 значений). Мы хотим сгенерировать 0..12 (13 значений).
Если на генераторе выпало 0..12, они и станут итоговыми значениями. Если 13, 14, 15, они станут 0, 1, 2 соответственно (остаток от деления на 13). Имеем удвоенные шансы выпадения 0, 1, 2.
Правильный вариант реализован у меня в модуле Mersenne Twister. При выпадении 13, 14, 15 нужно отбросить результат и повторить генерацию. И так, пока не выпадет 0..12. Вот тогда будут одинаковые вероятности на желаемом числовом диапазоне. С VR:T такой финт не проходит, там не генератор, а просто текущий счётчик миллисекунд.
(27.01.2020 16:14)Berserker Wrote: [ -> ]можно чуть подробнее? У меня не стоит Era Scripts на тестовой сборке.

По версии bug fixes.erm этот код почему-то должен выдавать номер стека, но практически почему-то не выдаёт (вообще не ясно, зачем тут !!SN:X, когда номер можно и нужно получать из батлменеджера):

Code:
!?FU77007;                            [фаза регенерации (перед получением хода)]
!!SN:X?y1;                            [y1 - Отряд]

Вообще данный костыль на палатку, на которую навешивается паралич на 1 ход, давно пора удалить из Era Scripts.
XEPOMAHT, спасибо огромное, обязательно проверю. Мне пришлось менять все команды Эры, не исключаю ошибку.
(27.01.2020 17:11)XEPOMAHT Wrote: [ -> ]Вообще данный костыль на палатку, на которую навешивается паралич на 1 ход, давно пора удалить из Era Scripts.
Если есть более прямой рабочий фикс - я только за, кидай ссылку.
Просто когда я делал, такого не было. Сейчас даже и не помню, как оно работает.

Berserker, понятно все, кроме ""but prefer not do to it for multiplayer support". Какие там подводные камни?
XEPOMAHT, проверил. У меня идеально работает на тестовом бое.
!?FU77007; [фаза регенерации (перед получением хода)]
!!SN:X?y1; [y1 - Отряд]
!!IF:M^%Y1 %X1^;

Что выдаёт у тебя?

Algor, детерминизм в мультиплеере работает так. Одно и то же событие вызывается на обоих сторонах. Генератор с одним и тем же состоянием выдаёт одни и те же последовательности. Код работает одинаково. VR:T был не таким. На двух сторонах он давал разные (миллисекунды-то отличались) последовательности. Далее код шёл по разному сценарию (разные события, координаты, урон). То есть рассинхронизация. Сейчас VR:T равносилен качественному VR:R и можно использовать где угодно. Но сама команда объявляется устаревшей и на старых версиях платформы остаётся убийцей сетевой игры в большом числе случаев.
(27.01.2020 17:52)Berserker Wrote: [ -> ]Что выдаёт у тебя?

Image: b63e0ac351dd.png

(27.01.2020 17:39)Algor Wrote: [ -> ]Если есть более прямой рабочий фикс - я только за, кидай ссылку.

Из плагина game bug fixes.dll (входит в текущий состав ЭРА):

Code:
_BattleStack_* mon = (_BattleStack_*)(int)(c->esi -656);

    // если выстрелов у катапульты или балисты больше нет
    // то делаем пропуски передачи хода этим машинам
    if (mon->creature_id == 145 || mon->creature_id == 146) {
        if ( mon->creature.shots < 1 ) {
            c->return_address = 0x464DAD;
            return NO_EXEC_DEFAULT;
        }    
    }

и

Code:
// исправление бага палатки, когда на её ходу невозможно убежать или сделать другие действия
    _PI->WriteByte(0x75C82C, 0xEB);
XEPOMAHT, я рассчитываю номер стека как адрес структуры отряда из ecx - адрес первой структуры / размер структуры отряда в бою. вероятно, один из плагинов подменяет у тебя что-то. Предлагаешь как получать в этот момент номер отряда?
Перехват по адресу 446B50.
XEPOMAHT, о, спасибо, уберу у себя тогда.
XEPOMAHT, Berserker, Algor, в сборке bug fixes.erm слегка отличается от того, что в чистой Era Scripts.
Я вырезал несколько строк точно и целый кусок с отменой берсерка, кажется, потому что все отряды делали заметную паузу перед "ожиданием", что преаращало игру в слайдшоу во время боя с большим количесвтом отрядов.
Berserker, в sublime_editor не хватает автовставки для ресивера !!IF, предлагает лишь !!if/!!en и тп.

(27.01.2020 18:04)XEPOMAHT Wrote: [ -> ]

Какой прекрасный интерфейс. Его бы под hd mod и некоторые иные моды доработать.Ab
(27.01.2020 18:10)Berserker Wrote: [ -> ]XEPOMAHT, я рассчитываю номер стека как адрес структуры отряда из ecx - адрес первой структуры / размер структуры отряда в бою.

Теоретически, проще и быстрее получать номер стека можно так: mov eax, dword [ecx+F8]

(27.01.2020 18:10)Berserker Wrote: [ -> ]вероятно, один из плагинов подменяет у тебя что-то.

Вроде бы нет. Перехват Тифона идёт позже, а больше и не кому.

(27.01.2020 18:42)daemon_n Wrote: [ -> ]bug fixes.erm слегка отличается от того, что в чистой Era Scripts.

Пробовал - то же самое, что и в чистой ES.

(27.01.2020 20:21)daemon_n Wrote: [ -> ]Какой прекрасный интерфейс. Его бы под hd mod и некоторые иные моды доработать.Ab

Да вроде какие-то энтузиасты делали адаптацию и под HD-мод, и даже кое-кто под MoP:

XEPOMAHT, +F8 разве не уровень существа?
XEPOMAHT, возможно, какой-то скрипт в этом событии меняет x1. Можешь проверить с одним тестовым скриптом?
(27.01.2020 18:04)XEPOMAHT Wrote: [ -> ]Из плагина game bug fixes.dll (входит в текущий состав ЭРА):
Не входит.
Названия у плагинов одинаковые, но тот плагин, который в оригинальном установщике ЭРЫ имеет 10% функционала от моего.
Reference URL's