У меня вот так работает с помощью Максаdrabadan wrote:Претензия на ассинхронный хил. Как он работает не знаю, общая идея возникла, решил реализовать.
Может, у кого есть возможность потестировать - потестируйте.
Code: Select all
program asyncHealer; type TTimer = record Ticks : Integer; MaxTicks : Integer; Enabled : Boolean; end; var Timers : Array of TTimer; procedure InitTimer(Timer : TTimer; MaxTicks : Integer); begin Timer.Ticks := 0; MaxTicks := MaxTicks; Timer.Enabled := False; end; procedure InitVars; begin SetLength(Timers, 3); InitTimer(Timers[0], 40);//bandage InitTimer(Timers[1], 250);//gh InitTimer(Timers[2], 200);//item end; procedure HealSelf; begin if (HP < MaxHP) and (not Timers[0].Enabled) then begin UOSay('.bandageself'); Timers[0].Enabled := True; end; if (HP < 50) and (not Timers[1].Enabled) then begin UOSay('.drink greaterhealpotion'); Timers[1].Enabled := True; end; if (HP < 60) and (not Timers[1].Enabled) then begin UOSay(',usetype 123123'); Timers[2].Enabled := True; end; end; procedure TimerProc; var i : Integer; begin for i := 0 to 2 do if (Timers[i].Enabled) then begin Timers[i].Ticks := Timers[i].Ticks + 1; if (Timers[i].Ticks >= Timers[i].MaxTicks) then Timers[i].Enabled := False; end; end; begin SetEventProc(evTimer1, 'TimerProc'); while true do wait(50); end.
Code: Select all
Program heal;
begin
while true do
begin
if (HP < MaxHP) then
begin
uosay('.bandage self');
wait(4000);
End;
if (hp < (maxhp-49)) then //
begin
uosay('.drink greaterhealpotion');
wait(25000);
End;
if (hp < (maxhp-59)) then //
begin
uosay(',usetype 123123');
wait(20000);
End;
End;
end.
кстати туда бы вместо задержки на бинты сделать бы проверку журнала на фразу после того как вылечит бинтом, тогда бы задержка не нужна была бы