Наваял. "Скрытие_и_показ_героя" таки пригодилась. 
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
			
		 |