Сорри, счас просто некогда твой скрипт анализировать, так что поройся в этом, найди что тебе нужно:
Code: Select all
Program InscriptionUp;
// Принцип: двойной клик по бланк скроллам. Первый крафт через меню, следующие через
// .makelast (отключается комментарием одной строки в скрипте - там указано).
// Скрипт сам берет реги и бланки из мешка, скидывает скрафченное в другой мешок
// (или мусорку - выбирается в скрипте).
// В зависимости от размера скилла переключается на крафт других скроллов.
//
// v.1.04b (c) Edred
// от 10 до 30 скилла качаем на:
// Magic Arrow: 1 blank scroll, 1 BP, 1 NS
// от 30 до 50 скилла качаем на:
// Poison Scroll: 1 blank scroll, 1 NS
// от 50 до 60 скилла качаем на:
// Recall: 1 blank scroll, 1 BP, 1 BM, 1 MR
// от 60 до 80 скилла качаем на:
// Energy Bolt Scroll: 1 blank scroll, 1 BP, 1 NS
// от 80 до 100 скилла качаем на:
// Flamestrike Scroll: 1 blank scroll, 1 SS, 1 SA
{$Include 'all.inc'}
const
MoveToTrash = true; // false - в мешок, true - в мусорку (скрафченное)
Blank = $0E34;
BagWithRegs = $4001CE31;
BagForScroll = $40049CA7;
MinResources = 2;
CountResources = 50;
TrashID = $4005198D;
type CraftMethod = Record
head1,punkt1,head2,punkt2 : String;
scroll : Cardinal;
skill : double;
end;
var
ctime : TDateTime;
InscriptMethod : array [1..5] of CraftMethod;
regs : array [1..3] of Cardinal;
SelectLevel, i : Integer;
LastContOpen : TDateTime;
OldSkill : Double;
FirstTime : Boolean;
procedure InitDim;
begin
InscriptMethod[1].head1 := 'Spell Circles';
InscriptMethod[1].punkt1 := 'First Circle';
InscriptMethod[1].head2 := '(any)';
InscriptMethod[1].punkt2 := 'Magic Arrow';
InscriptMethod[1].scroll := $1F32;
InscriptMethod[1].skill := 10.0;
InscriptMethod[2].head1 := 'Spell Circles';
InscriptMethod[2].punkt1 := 'Third Circle';
InscriptMethod[2].head2 := '(any)';
InscriptMethod[2].punkt2 := 'Poison';
InscriptMethod[2].scroll := $1F40;
InscriptMethod[2].skill := 30.0;
InscriptMethod[3].head1 := 'Spell Circles';
InscriptMethod[3].punkt1 := 'Fourth Circle';
InscriptMethod[3].head2 := '(any)';
InscriptMethod[3].punkt2 := 'Recall';
InscriptMethod[3].scroll := $1F4C;
InscriptMethod[3].skill := 50.0;
InscriptMethod[4].head1 := 'Spell Circles';
InscriptMethod[4].punkt1 := 'Sixth Circle';
InscriptMethod[4].head2 := '(any)';
InscriptMethod[4].punkt2 := 'Energy Bolt';
InscriptMethod[4].scroll := $1F56;
InscriptMethod[4].skill := 70.0;
InscriptMethod[5].head1 := '';
InscriptMethod[5].punkt1 := '';
InscriptMethod[5].head2 := '';
InscriptMethod[5].punkt2 := '';
InscriptMethod[5].scroll := $0000;
InscriptMethod[5].skill := 80.0;
end;
procedure OpenContainer(f : boolean);
// если f - true - просто открываем все нужные контейнеры, то есть:
// BagWithRegs,BagForScroll (если не выбрана утилизация)
// если f - false - проверяем, был ли реконнект чара после последнего
// открывания контейнеров, если был - переоткрываем контейнеры и записываем
// новое значение в переменную LastContOpen, если не был - ничего не делаем
begin
waitconnection(3000);
if (f = true) OR (LastContOpen < ConnectedTime) then
begin
UseObject(BagWithRegs);
wait(1000);
checksave;
if not MoveToTrash then
begin
UseObject(BagForScroll);
wait(1000);
checksave;
end;
LastContOpen := Now;
addtosystemjournal('Контейнеры открыты в ' + DateTimeToStr(Now));
end;
end;
procedure DropScroll(flag : boolean);
// если flag true - скидываем все скроллы, если false - только если много
var tmp1 : cardinal;
tmp2, tmp3 : Integer;
begin
waitconnection(3000);
if not flag then
begin
if Count(InscriptMethod[SelectLevel].scroll) < CountResources then exit;
end;
tmp3 := 0;
tmp1 := findtype(InscriptMethod[SelectLevel].scroll,backpack);
while findcount > 0 do
begin
tmp2 := GetQuantity(tmp1);
if MoveToTrash then MoveItem(tmp1,tmp2,TrashID,0,0,0)
else MoveItem(tmp1,tmp2,BagForScroll,0,0,0);
wait(1000);
checksave;
tmp3 := tmp3 + tmp2;
tmp1 := findtype(InscriptMethod[SelectLevel].scroll,backpack);
end;
addtosystemjournal('Сбросил ' + inttostr(tmp3) +' ' + InscriptMethod[SelectLevel].punkt2 +' scrolls');
end;
function NameRegs(r : Cardinal) : String;
begin
Result := 'Unknown';
Case r of
BP : Result := 'BP';
BM : Result := 'BM';
GA : Result := 'GA';
GS : Result := 'GS';
MR : Result := 'MR';
NS : Result := 'NS';
SA : Result := 'SA';
SS : Result := 'SS';
end;
end;
function CheckResources : Boolean;
// Проверяем есть ли все реги и скроллы, добираем, если чего-то не хватает -
// возвращаем false. Реги с типом $0000 не берем.
var tmpid : Cardinal;
tmpnum, tmpcount : integer;
begin
Result := False;
waitconnection(3000);
if (Count(Blank) < MinResources) then
begin
waitconnection(3000);
OpenContainer(false);
tmpid := Findtype(Blank,BagWithRegs);
if tmpid = 0 then exit;
tmpcount := GetQuantity(tmpid);
Grab(finditem,CountResources);
wait(1000);
checksave;
addtosystemjournal('Взял ' + inttostr(CountResources) + ' blank scrolls from ' + inttostr(tmpcount) + '.');
end;
for tmpnum := 1 to 3 do
begin
if regs[tmpnum] = $0000 then continue;
if Count(regs[tmpnum]) < MinResources then
begin
waitconnection(3000);
OpenContainer(false);
tmpid := Findtype(regs[tmpnum],BagWithRegs);
if tmpid = 0 then exit;
tmpcount := GetQuantity(tmpid);
Grab(finditem,CountResources);
wait(1000);
checksave;
addtosystemjournal('Взял ' + inttostr(CountResources) + ' ' + NameRegs(regs[tmpnum]) + ' из ' + inttostr(tmpcount) + '.');
end;
end;
Result := True;
end;
Begin
InitDim;
OldSkill := GetSkillValue('Inscription');
LastContOpen := Now;
OpenContainer(true);
FirstTime := True;
repeat
for i := 1 to 5 do
begin
if (GetSkillValue('Inscription') >= InscriptMethod[i].skill) AND (SelectLevel < i) then
// скилл дорос до нового уровня и перед этим был меньше левел
begin
DropScroll(true);
SelectLevel := i;
FirstTime := True;
end;
end;
// виды регов
if FirstTime then
begin
Case SelectLevel of
1: begin regs[1] := BP; regs[2] := NS; regs[3] := $0000; end;
2: begin regs[1] := NS; regs[2] := $0000; regs[3] := $0000; end;
3: begin regs[1] := BP; regs[2] := BM; regs[3] := MR; end;
4: begin regs[1] := BP; regs[2] := NS; regs[3] := $0000; end;
5: begin regs[1] := SS; regs[2] := SA; regs[3] := $0000; end;
end;
end;
waitconnection(3000);
if not CheckResources then
begin
Addtosystemjournal('Нет ресурсов!');
exit;
end;
OpenContainer(false);
if TargetPresent then CancelTarget;
wait(1000);
ctime := Now;
i := 0;
if FirstTime then
begin
CancelMenu;
WaitMenu(InscriptMethod[SelectLevel].head1,InscriptMethod[SelectLevel].punkt1);
WaitMenu(InscriptMethod[SelectLevel].head2,InscriptMethod[SelectLevel].punkt2);
if UseType(Blank,$FFFF) = 0 then exit;
end
else
begin
UOSay('.makelast');
end;
repeat
wait(100);
i := i + 1;
checksave;
until (InJournalBetweenTimes('You put|You fail to inscribe|You scribble', ctime, Now)<>-1) or (i > 200);
if InJournalBetweenTimes('You scribble', ctime, Now)<>-1 then Wait(4000);
if (InJournalBetweenTimes('You put', ctime, Now)<>-1) AND (FirstTime = True) then
begin
// === Если у вас нет команды .makelast - закомментарьте следующую строку:
FirstTime := False;
CancelMenu;
wait(1000);
end;
// ===
DropScroll(false);
if GetSkillValue('Inscription') > OldSkill then
begin
AddToSystemJournal('Скилл Inscription вырос. Теперь он равен ' + FloatToStr(GetSkillValue('Inscription')));
OldSkill := GetSkillValue('Inscription');
end;
until GetSkillValue('Inscription') >= 100.0;
End.