Наваял. "Скрытие_и_показ_героя" таки пригодилась.
Code:
proc DeleteTown uses ebx esi edi, x, y, l, addrCopy
rv esi, GetTownStrucXYL, [x], [y], [l]; получаем структуру города
.if [addrCopy]; задано копирование
CopyMemory esi, [addrCopy], sizeof._Town_; копируем структуру города в заданный буфер
.endif
movsx edi, [esi + _Town_.Хозяин]
movsx ebx, [esi + _Town_.Номер]
mov ecx, [esi+_Town_.Номер_героя_гостя]
.if signed ecx > -1
GetHeroStruc ecx
Скрытие_и_показ_героя eax, 0
.endif
mov eax, [y]
dec eax; удаляем город с клетки выше входа, чтобы не задеть героя, стоящего во вратах
DeleteObject [x], eax, [l]; удалить город
mov eax, [x]
dec eax
DeleteObject eax, [y], [l]; удалить возможную левую Коновязь
mov eax, [x]
inc eax
DeleteObject eax, [y], [l]; удалить возможную правую Коновязь
.if edi <> -1; не нейтральный город
rv esi, GetPlayerStruc, edi
dec [esi+_Player_.Количество_городов]; вычесть 1 город
.if bl = [esi+_Player_.Номер_активного_города]
or [esi+_Player_.Номер_активного_города], -1;
.endif
mov al, bl
lea edi, [esi+_Player_.Номера_городов]
mov ecx, 48
repne scasb
lea eax, [edi-1]
CopyMemory edi, eax, ecx; сдвигаем список номеров городов на 1 вперёд
.endif
mov esi, BASE
add esi, 21614h
mov ecx, 48
mov edi, [esi]; - начало структур городов
@@:
cmp [edi + _Town_.Номер], bl
je @f
dec ecx
add edi, sizeof._Town_
jnz @b
@@:
mov eax, [esi+4]; конец структур
sub eax, sizeof._Town_; переместиться к началу структуры последнего города
CopyMemory eax, edi, sizeof._Town_; копировать данные последнего города на место освободившегося
sub dword [esi+4], sizeof._Town_; структуры - уменьшить на одну
sub dword [esi+8], sizeof._Town_; памяти под города - на 1 меньше
dec Количество_городов_на_карте
ret
endp
Вариант, может, и не окончательный, но багов пока не заметил. Герой-гость спокойно остаётся на месте. Герой внутри города исчезает и его не найти нигде в Обзоре Королевства. Однако, на следующий день, если снаружи бегают не 8 героев игрока, он спокойно появляется на месте удалённого города. Если же внешних героев 8 - пропадает неизвестно куда.
Остаётся выяснить, какие сюрпризы сулит копирование структуры удалённого города на место структуры вновь построенного.
Circle of destruction, hammer comes crushing
Powerhouse of energy
Whipping up a fury, dominating flurry
We create the battery
|