Code:
//****************************************тифоновская функция копирования памяти
procedure MemCopy;
asm
mov ecx, [esp+0Ch]
push esi
mov esi, [esp+08h]
push edi
mov edi, [esp+10h]
mov eax, ecx
shr ecx, 02h
rep movsd
mov ecx, eax
and ecx, 3
rep movsb
pop edi
pop esi
end;
//*******************************************функция загрузки структуры монстров
procedure MakeMonList;
var i:integer; a:TRSByteArray; ps1:TRSParsedString;
begin
//загрузка тифоновских бинарников и текстовиков
if not FileExists(AppPath + 'EraPlugins\MCrEdit\MonstersSetup.mop') then
begin
Showmessage('MonstersSetup.mop not found. Please, re-install ERA PLUS');
exit;
end;
a:=RSLoadFile(AppPath + 'EraPlugins\MCrEdit\MonstersSetup.mop');
if not FileExists(AppPath + 'EraPlugins\MCrEdit\rus\Monsters.txt') then
begin
Showmessage('Monsters.txt not found. Please, re-install ERA PLUS');
exit;
end;
s_names1:= RSLoadTextFile(AppPath + 'EraPlugins\MCrEdit\rus\Monsters.txt');
if not FileExists(AppPath + 'EraPlugins\MCrEdit\rus\Plural.txt') then
begin
Showmessage('Plural.txt not found. Please, re-install ERA PLUS');
exit;
end;
s_names2:= RSLoadTextFile(AppPath + 'EraPlugins\MCrEdit\rus\Plural.txt');
if not FileExists(AppPath + 'EraPlugins\MCrEdit\rus\Ability.txt') then
begin
Showmessage('Ability.txt not found. Please, re-install ERA PLUS');
exit;
end;
s_opisanie:= RSLoadTextFile(AppPath + 'EraPlugins\MCrEdit\rus\Ability.txt');
SetLength(MonList,MaxMon+1); //выделить память под таблицу монстров
for i:=0 to 2 do SetLength(MonstersTables[i],MaxMon+1); //выделить память под массив массивов текстов монстров
//переписать всё в таблицу монстров
asm
pushad
mov edi, DWord(a) //получить адрес буфера
mov ebx, DWord(MonList) //получить адрес таблицы монстров
xor esi, esi // счётчик монстров
@Typhon2Editor:
//установить город
movsx eax, byte [esi+edi+26000]
mov [ebx], eax
//установить уровень
movsx eax, byte [esi+edi+25000]
mov [ebx+4], eax
//установить озвучку
mov eax, esi
sal eax, 2 // умножить на 4
add eax, esi
lea eax, [eax+edi+16000] //посчитаем адресок
mov [ebx+8], eax //запишем адресок
//установить деф
mov eax, esi
sal eax, 4 // умножить на 16
lea eax, [eax+edi]
mov [ebx+12], eax
//установить флаги
push dword [esi*4+edi+21000]
pop dword [ebx+16]
//копировать всё остальное
push 84 // кол-во байт для копирования
lea eax, [ebx+32]
push eax // приёмник
imul eax, esi, 84
lea eax, [eax+edi+85000]
push eax // источник
call MemCopy
add esp, 12
//условия цикла
add ebx, 116
inc esi
cmp esi, MaxMon
jl @Typhon2Editor
popad
end;
//установить названия монстров: ед. число
ps1:=nil;
ps1:=RSParseString(s_names1, [#13#10]);
for i:=0 to MaxMon do
begin
PStr(@MonstersTables[0][i])^:= RSGetToken(ps1,i+1);
MonList[i].Name:= MonstersTables[0][i];
end;
//установить названия монстров: множ. число
ps1:=nil;
ps1:=RSParseString(s_names2, [#13#10]);
for i:=0 to MaxMon do
begin
PStr(@MonstersTables[1][i])^:= RSGetToken(ps1,i);
MonList[i].PluralName:= MonstersTables[1][i];
end;
//установить описания монстров
ps1:=nil;
ps1:=RSParseString(s_opisanie, [#13#10]);
for i:=0 to MaxMon do
begin
PStr(@MonstersTables[2][i])^:= RSGetToken(ps1,i);
MonList[i].Features:= MonstersTables[2][i];
end;
end;
Да простит меня Сергей Роженко.