| Berserker   
   
   Posts: 16785
 
 | 
			| 
 
				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: 16785
 
 | 
			| 
 
				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: 2481
 
 | 
			| 
 
				 (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: 16785
 
 |  | 
	| 27.01.2020 17:32 |  | 
	
		| Algor   
   
   Posts: 3883
 
 | 
			| 
 
				 (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: 2481
 
 | 
			| 
 
				 (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: 16785
 
 |  | 
	| 27.01.2020 18:10 |  | 
	
		| XEPOMAHT   
   
   Posts: 2481
 
 | 
			| 
 
				 (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: 16785
 
 |  | 
	| 27.01.2020 22:16 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 27.01.2020 22:53 |  | 
	
		| igrik   
   Posts: 2821
 
 | 
			| 
 
				 (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 |  |