Знали бы вы, сколько я с этим намучился, заменяя Тюрьмы... В итоге выход был найден с помощью этого кода:
Code:
; Продолжается условие нулевого дня (то есть, старт карты, а не загрузка игры)
rvnz edi, .Нет_Тюрем_на_карте, CalculateObjects, 62, 0
mov byte [5087805], 235; убрать обновление экрана
– [Search_X]
.repeat
FindObject 62, 0, addr Search_X
GetMapItem [Search_X], [Search_Y], [Search_L]
GetHeroStruc [eax + MapItem.контрольное_слово]; контрольное число = номер героя в Тюрьме
push eax
movsx ecx, [eax+_Hero_.Хозяин]
push ecx
mov byte [eax+22h], Player_Pink; передаём героя последнему игроку
KillHero eax, 1, 0
pop eax
pop ecx
test eax, eax
jl .герой_не_был_стартовым
mov [ecx+_Hero_.Хозяин], al; устанавливаем хозяина
imul esi, [ecx+_Hero_.Номер],5Ch
lea edx, [esi+679DF4h]
movlps xmm0, [edx]
movlps qword [ecx + _Hero_.Тип_существ_в_слоте_0], xmm0
push dword [edx+8];
pop [ecx + _Hero_.Тип_существ_в_слоте_2]
add esi, 7C4504h
m2m dword [esi],[ecx + _Hero_.Количество_существ_в_слоте_0]
m2m dword [esi+8], [ecx + _Hero_.Количество_существ_в_слоте_1]
m2m dword [esi+10h],[ecx + _Hero_.Количество_существ_в_слоте_2]
.герой_не_был_стартовым:
; установка БМ, если специалист:
cmp [ecx + _Hero_.Номер], HERO_Вирсавия
jnz @f
mov [ecx+_Hero_.Артефакт_в_слоте_Катапульты], ART_Воздушный_Шар
jmp .дать_знамя
@@:
imul eax, [ecx + _Hero_.Номер], Размер_структуры_специализации_героя
add eax, Адрес_структуры_специализаций_героев
cmp [eax+Структура_специализации_героя.Тип_специальности], 1
jnz @f
cmp [eax+Структура_специализации_героя.Подтип_специальности_1], CR_Баллиста
jnz @f
mov [ecx+_Hero_.Артефакт_в_слоте_Баллисты], ART_Баллиста
jmp .дать_знамя
@@:
.if [eax+Структура_специализации_героя.Тип_специальности] = 0 & [eax+Структура_специализации_героя.Подтип_специальности_1] = SS_Первая_Помощь
mov [ecx+_Hero_.Артефакт_в_слоте_Палатки], ART_Санитарная_Палатка
.endif
.дать_знамя:
push ecx
.if Option_Stacks_Experience & ~[Таблица_запрета_артефактов + ART_Знамя_Полководца]
GiveArtToHero ecx, Данные_Знамени_Полководца_при_раздаче_баннеров
.endif
; Даём начальный опыт (по правилам SoD)
RandomNumber 40, 90
pop ecx
mov [ecx+_Hero_.Опыт], eax
DeleteObject [Search_X], [Search_Y], [Search_L]
mov eax, [Search_X]
inc eax
PlaceObject eax, [Search_Y], [Search_L], 20, 2, -1
dec edi
.until ZERO?
mov byte [5087805], 116; вернуть обновление экрана
.Нет_Тюрем_на_карте: