Сорри, счас просто некогда твой скрипт анализировать, так что поройся в этом, найди что тебе нужно:
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.