Berserker
Posts: 16657
|
Algor, спасибо, VR:R, конечно, исправил.
Да, вместо него выполняется VR:R. Какая обратная совместимость в вопросе ГСЧ? Это был в своё время просто костыль на коленке в ответ на «нам не нравится, как генерирует rand-фуннкция игры». Хороший генератор псевдослучайных чисел и так обладает свойством слабой предсказуемости и равномерности распределения. Вихрь Мерсенна — один из лучших. Алгоритмически же VR:T и VR:V не отличимы.
И да, VR:T — один из источников рассинхронизации в сетевой игре (событие сработает только у одного из игроков) и абсолютно ненадёжен в плане генерации последовательности (выдаёт одинаковые). Если нужно намеренно сбросить значение генератора на число, зависимое от времени, то пример кода я указал. Берём то же время, что и Слава использовал (timeGetTime) и инициализируем генератор. Но такое не нужно почти нигде.
У меня при первом использовании генератор инициализируется от времени. Дальше хоть до конца жизни будет генерироваться неповторяемая последовательность чисел. Разве что можно было бы сделать сохранение его состояния в сейве, но тогда можно было бы в точности воспроизводить ход боя при перезагрузке, чего не было в оригинале.
XEPOMAHT, можно чуть подробнее? У меня не стоит Era Scripts на тестовой сборке.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
27.01.2020 16:14 |
|
Berserker
Posts: 16657
|
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 такой финт не проходит, там не генератор, а просто текущий счётчик миллисекунд.
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
27.01.2020 16:58 |
|
XEPOMAHT
Posts: 2356
|
(27.01.2020 16:14)Berserker Wrote: можно чуть подробнее? У меня не стоит Era Scripts на тестовой сборке.
По версии bug fixes.erm этот код почему-то должен выдавать номер стека, но практически почему-то не выдаёт (вообще не ясно, зачем тут !!SN:X, когда номер можно и нужно получать из батлменеджера):
Code:
!?FU77007; [фаза регенерации (перед получением хода)]
!!SN:X?y1; [y1 - Отряд]
Вообще данный костыль на палатку, на которую навешивается паралич на 1 ход, давно пора удалить из Era Scripts.
(This post was last modified: 27.01.2020 17:15 by XEPOMAHT.)
|
|
27.01.2020 17:11 |
|
Berserker
Posts: 16657
|
|
27.01.2020 17:32 |
|
Algor
Posts: 3881
|
(27.01.2020 17:11)XEPOMAHT Wrote: Вообще данный костыль на палатку, на которую навешивается паралич на 1 ход, давно пора удалить из Era Scripts.
Если есть более прямой рабочий фикс - я только за, кидай ссылку.
Просто когда я делал, такого не было. Сейчас даже и не помню, как оно работает.
Berserker, понятно все, кроме ""but prefer not do to it for multiplayer support". Какие там подводные камни?
|
|
27.01.2020 17:39 |
|
XEPOMAHT
Posts: 2356
|
(27.01.2020 17:52)Berserker Wrote: Что выдаёт у тебя?
(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);
|
|
27.01.2020 18:04 |
|
Berserker
Posts: 16657
|
|
27.01.2020 18:10 |
|
XEPOMAHT
Posts: 2356
|
(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 и некоторые иные моды доработать.
Да вроде какие-то энтузиасты делали адаптацию и под HD-мод, и даже кое-кто под MoP:
(This post was last modified: 27.01.2020 20:44 by XEPOMAHT.)
|
|
27.01.2020 20:39 |
|
Berserker
Posts: 16657
|
|
27.01.2020 22:16 |
|
Berserker
Posts: 16657
|
|
27.01.2020 22:53 |
|
igrik
Posts: 2819
|
(27.01.2020 18:04)XEPOMAHT Wrote: Из плагина game bug fixes.dll (входит в текущий состав ЭРА):
Не входит.
Названия у плагинов одинаковые, но тот плагин, который в оригинальном установщике ЭРЫ имеет 10% функционала от моего.
game bug fixes extended.dll || My Plugins || My GitHub
|
|
27.01.2020 23:27 |
|