ВНИМАНИЕ: В этом скрипте нет подхилов чара! Для этого надо запустить параллельно данному скрипту скрипт на непрерывный подхил чара (каждому чару, естественно):
http://stealth.od.ua/forum/viewtopic.php?t=577
Code: Select all
Program SparringUP;
// Спарринг двух воинов. Пауза для подхилла если здоровье меньше
// максимального минус заданная величина. Проверка сериала чара,
// скомандовавшего останов или рестарт боя (от приколистов).
// Добор бинтов с пола в радиусе двух клеток (бинты положить или
// между чарами, или у каждого за спиной.
// Один скрипт для обоих чаров. Скрипт сам разберется, кто первый, а
// кто второй :)
// Не забудьте обоим чарам в параллель запустить скрипт SparringHeal!
// Вам также потребуется любой чар в пределах видимости, для временного
// сброса флага атаки. Желательно, чтобы этот чар не стоял на соседней
// клетке, иначе ему достанется :)
//
// v.1.01b (c) Edred
//
// todo: ввести лечение спирит спиком, если закончились бинты
{$Include 'all.inc'}
const
Warrior1 = $0004D053; // Первый чар
Warrior2 = $0004ACFB; // Второй чар (порядок не важен)
Delta = 30;
// Чар, на которого сбрасывать временно атаку
FarAttack = $0005288D; //
var
War1Flag : boolean; // true - готов к бою, false - нет
War2Flag : boolean; // аналогично
CurWarrior : integer; // какой чар использует скрипт (1 или 2)
EnemyWarrior : integer; // соответственно - противник
ctime : TDateTime;
procedure CheckWarrior;
// Сверяет сериал чара с заданными и определяет, какой чар
// (1 или 2) использует этот скрипт. Устанавливает соотв. флаг
begin
waitconnection(3000);
if Self = Warrior1 then
begin
CurWarrior := 1;
EnemyWarrior := 2;
War1Flag := true;
end
else
begin
CurWarrior := 2;
EnemyWarrior := 1;
War2Flag := true;
end;
end;
procedure AttackEnemy(var f:integer);
begin
if f = 1 then attack(Warrior1);
if f = 2 then attack(Warrior2);
end;
function CheckPeaceFlag(var f:integer; var ctime:TDateTime):boolean;
var i:integer;
begin
result := false;
if f = 1 then
begin
i := InJournalBetweenTimes('Stop', ctime, Now);
if (i<>-1) and (LineId = Warrior1) then result := true;
end
else begin
i := InJournalBetweenTimes('Stop', ctime, Now);
if (i<>-1) and (LineId = Warrior2) then result := true;
end;
end;
function CheckWarFlag(var f:integer; var ctime:TDateTime):boolean;
var i:integer;
begin
result := false;
if f = 1 then
begin
i := InJournalBetweenTimes('Start', ctime, Now);
if (i<>-1) and (LineId = Warrior1) then result := true;
end
else begin
i := InJournalBetweenTimes('Start', ctime, Now);
if (i<>-1) and (LineId = Warrior2) then result := true;
end;
end;
procedure ChangeWarFlag(var f:integer);
begin
if f = 1 then
begin
// для первого чара
if War1Flag then begin
// отменим бой
UOSay( 'Stop' ); War1Flag := false; SetWarMode(false); end
else begin
// готовы к бою
UOSay( 'Start' ); War1Flag := true; attack(FarAttack);
end;
end
else begin
// для второго чара
if War2Flag then begin
// отменим бой
UOSay( 'Stop' ); War2Flag := false; SetWarMode(false); end
else begin
// готовы к бою
UOSay( 'Start' ); War2Flag := true; attack(FarAttack);
end;
end;
end;
Begin
CheckWarrior;
while not Dead do
begin
if not WarMode then SetWarMode(true);
ctime := Now;
AttackEnemy(EnemyWarrior);
addtosystemjournal('проверка 0')
repeat
wait(100);
checksave;
until CheckPeaceFlag(EnemyWarrior, ctime) or (Life <= (MaxLife - Delta));
ChangeWarFlag(CurWarrior);
// Иногда сразу не срабатывает сброс вара, пока сделаем так:
wait(100)
SetWarMode(false)
wait(100)
SetWarMode(false)
repeat
wait(100);
checksave;
until HP = MaxHP;
ctime := Now;
ChangeWarFlag(CurWarrior);
repeat
wait(100);
checksave;
until CheckWarFlag(EnemyWarrior, ctime) or (Life < MaxLife);
end;
End.
1. В подхилл - мытье бинтов
2. В спарринг - лечение спирит спиком и медитацией, если бинты кончились
3. В спарринг - оружие, армы, щиты. Добор по разрушению из контейнера (один на обоих чаров)