| 
 
				 (22.08.2011 19:05)Berserker Wrote:  MOP, ты не смотрел проблему потери опыта, если передаётся последний отряд? 
Посмотрел, но ни черта не понял. Бряк на вог-хук срабатывает в любом случае, последний это отряд или нет. Какая такая проверка может стоять в ВОГе и зачем она нужна - ума не приложу.
  (27.08.2011 17:17)Berserker Wrote:  Патчит Arsenal.dll - плагин Мора, позволяющий в кузнице нанимать все три машины войны.Посмотрел - у меня нет его исходников.
 
Кое-как откопал. Моя самая первая длл:
 
Code:
 LIBRARY Arsenal;{!INFO
 MODULENAME = 'Arsenal'
 VERSION = '1.0'
 AUTHOR = 'Master Of Puppets'
 }
 
 USES Win, Utils, SysUtils, VPUtils;
 
 //PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN); external 'angel' name 'HookCode';
 
 CONST
 (* HookCode constants *)
 C_HOOKTYPE_JUMP = FALSE;
 C_HOOKTYPE_CALL = TRUE;
 C_OPCODE_JUMP = $E9;
 C_OPCODE_CALL = $E8;
 C_UNIHOOK_SIZE = 5;
 
 TYPE
 (* Caienu, iaiaoiaeiay aey ?aaiou n ooieoeyie iao?eiaa *)
 THookRec = RECORD
 Opcode: BYTE;
 Ofs: INTEGER;
 END; // .record THookRec
 
 VAR
 Temp: INTEGER; // Oieaa?naeuiay a?aiaiiay ia?aiaiiay
 
 PROCEDURE WriteAtCode(P: POINTER; Buf: POINTER; Count: INTEGER);
 BEGIN
 Win.VirtualProtect(P, Count, PAGE_READWRITE, @Temp);
 Win.CopyMemory(P, Buf, Count);
 Win.VirtualProtect(P, Count, Temp, NIL);
 END; // .procedure WriteAtCode
 
 PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN);
 VAR
 HookRec: THookRec;
 BEGIN
 IF UseCall THEN BEGIN
 HookRec.Opcode:=C_OPCODE_CALL;
 END // .if
 ELSE BEGIN
 HookRec.Opcode:=C_OPCODE_JUMP;
 END; // .else
 HookRec.Ofs:=INTEGER(NewAddr)-INTEGER(P)-C_UNIHOOK_SIZE;
 WriteAtCode(P, @HookRec, 5);
 END; // .procedure HookCode
 
 // Функция показа диалога Арсенала (работает лишь в городе):
 PROCEDURE ARSENAL_FUNCTION; ASSEMBLER; {$FRAME-}
 ASM
 PUSH EBP
 MOV EBP,ESP
 MOV ECX,DWORD PTR DS:[$69954C]
 PUSH -1
 PUSH $63656B
 MOV EAX, LARGE FS:0
 PUSH EAX
 MOV LARGE FS:0, ESP
 PUSH ECX
 PUSH ESI
 MOV ESI,ECX
 MOV ECX,DWORD PTR DS:[ESI+$38]
 CMP DWORD PTR DS:[ECX+$3C],-1
 JNZ @@No_call
 MOV EAX, $5BDB50
 CALL EAX
 @@No_call:
 MOV EAX,DWORD PTR DS:[ESI+$38]
 PUSH EDI
 MOV EAX,DWORD PTR DS:[$69CCFC]
 MOV EDX,DWORD PTR DS:[$69CCF4]
 IMUL EDX,EDX,$168
 SUB EAX,EDX
 MOV EDX,DWORD PTR SS:[EBP+8]
 IMUL EDX,EDX,$492
 ADD EDX,EAX
 ADD EDX,$0B50
 MOV DWORD PTR SS:[EBP+8],EDX
 PUSH $4AA2F5
 END;
 
 //Вклиниваемся в адрес, откуда начинается вызов диалога Кузницы
 PROCEDURE HOOK_Blacksmith; ASSEMBLER; {$FRAME-}
 ASM
 PUSH 0
 PUSH ESI
 CALL ARSENAL_FUNCTION
 PUSH $5D22E1
 END;
 
 //Вырубаем все функции обновления экрана мира при входе в город
 PROCEDURE Disable_Redraw_Map; ASSEMBLER; {$FRAME-}
 ASM
 PUSH EBP
 MOV EBP, ESP
 PUSH -1
 MOV DWORD PTR DS:[$415D44],$114E9
 MOV BYTE PTR DS:[$415D48],0
 MOV DWORD PTR DS:[$4032E5],$124E9
 MOV BYTE PTR DS:[$4032E9],0
 MOV DWORD PTR DS:[$403423],$123E9
 MOV BYTE PTR DS:[$403427],0
 PUSH $5C6C75
 END;
 
 //Врубаем все функции обновления экрана мира при выходе из города
 PROCEDURE Enable_Redraw_Map; ASSEMBLER; {$FRAME-}
 ASM
 MOV DWORD PTR DS:[$415D44],$BE83F18B
 MOV BYTE PTR DS:[$415D48],$98
 MOV DWORD PTR DS:[$4032E5],$0D8BF18B
 MOV BYTE PTR DS:[$4032E9],$38
 MOV DWORD PTR DS:[$403423],$8B565351
 MOV BYTE PTR DS:[$403427],$0F1
 MOV EAX,2
 PUSH $5D4C74
 END;
 
 BEGIN
 HookCode(POINTER($5D21A4), @HOOK_Blacksmith, C_HOOKTYPE_JUMP);
 HookCode(POINTER($5C6C70), @Disable_Redraw_Map, C_HOOKTYPE_JUMP);
 HookCode(POINTER($5D4C6F), @Enable_Redraw_Map, C_HOOKTYPE_JUMP);
 END.
  (22.08.2011 19:05)Berserker Wrote:  Пока что удали его лучше, а потом нужно выловить Мора и поругать. 
Пусть лучше мир прогнётся под нас...
			 
 Circle of destruction, hammer comes crushing
 Powerhouse of energy
 Whipping up a fury, dominating flurry
 We create the battery
 |