Page 1 of 1

Посмотрите пожалуйста скрипт.

Posted: 24.01.2007 14:44
by Fantastick

Code: Select all

Program Inscription; 

{$Include 'all.inc'} 

var 
k:integer;  

const 
// TypeC='lt'; 
// TypeC='fs'; 
TypeC='gh';
// TypeC='eb'; 
// TypeC='mr'; 

// Реги 
BPreg=$0F7A; 
BMreg=$0F7B; 
GAreg=$0F84; 
GSreg=$0F85; 
MRreg=$0F86; 
NSreg=$0F88; 
SAreg=$0F8C; 
SSreg=$0F8D; 

procedure getitems(item:cardinal); 
   // процедура берет из контейнера 100 шт указанного предмета 
   begin 
      if (count(item)=0) then 
      begin 
         findType(item,$5EC684C7); 
         if (FindCount > 0) then 
         begin 
            k := FindQuantity; 
            Grab(finditem,100)
            wait(1000); 
            case item of 
             //  BPreg : addtosystemjournal('взял 100 BP из ' + inttostr(k)); 
             //  BMreg : addtosystemjournal('взял 100 BM из ' + inttostr(k)); 
               GAreg : addtosystemjournal('взял 100 GA из ' + inttostr(k)); 
               GSreg : addtosystemjournal('взял 100 GS из ' + inttostr(k)); 
               MRreg : addtosystemjournal('взял 100 MR из ' + inttostr(k)); 
             //  NSreg : addtosystemjournal('взял 100 NS из ' + inttostr(k)); 
             //  SAreg : addtosystemjournal('взял 100 SA из ' + inttostr(k)); 
               SSreg : addtosystemjournal('взял 100 SS из ' + inttostr(k)); 
            end; 
         end 
         else addtosystemjournal('Мало!!!'); 
      end; 
   end; 

procedure Cast2; 
   begin 
       case TypeC of 
         'gh' :    begin getitems(GAreg); getitems(SSreg); getitems(MRreg); getitems(GSreg); end; 
         'lt' :    begin getitems(BPreg); getitems(MRreg); getitems(SAreg); end; 
         'fs' :    begin getitems(SSreg); getitems(SAreg); end; 
         'mr' :    begin getitems(GAreg); getitems(MRreg); getitems(SSreg); end; 
	 'eb' :    begin getitems(NSreg); getitems(BPreg); end; 
      end;
    end; 

procedure pucovka; 
begin 
If (Mana>=16) then 
		begin 
		   UseObject($5EC684C7)	
		   UseObject(FindType($0E34,$5EC684C7));
		   wait(1000) ;
		   Waitmenu('Select a circle to inscribe', 'Circle 4 spells')
		   wait(1000) 
		   Waitmenu('Select a spell to inscribe', 'Greater Heal')	
		   end
end;

Begin 
   Uosay ('.macro on')
   i:=0;	
   repeat
   Cast2;
	begin
	  wait(200); 
	  pucovka; 
	      begin 
		While (Mana<Int) do begin Useskill('Meditation'); wait(5100);end;
	  pucovka;
       i:=i+1;
	  end;
     end
until (i=1000000)
End.
Хотелось бы услышать много критики :oops: и небольшую помощь, как можно сделать выкладку готовых скролов?

Posted: 24.01.2007 17:22
by Edred
Сорри, счас просто некогда твой скрипт анализировать, так что поройся в этом, найди что тебе нужно:

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.

Posted: 13.05.2008 14:27
by Купидон
Едред, а твой скрипт рабочий был?

Code: Select all

15:13:21 []: Compiling
15:13:21 []: Compiled succesfully
15:13:22 []: Контейнеры открыты в 13.05.2008 15:13:22
15:13:22 []: Out Of Range at 29.331
15:13:22 []: Script Inscription.sc stoped successfuly


Как найти где ошибка? Помогите пожалуйста.

Posted: 13.05.2008 16:54
by Edred
он точно рабочий, но не знаю для какой версии стелса. Вполне может быть для RC1, например.

Выловить подобную ошибку можно только расставив по скрипту вывод тестовых сообщений, пронумеровав их, естественно. А дальше следить после запуска после какого сообщения и перед каким ругнется. Дальше уже в выбранном куске дополнительные сообщения, пока не локализуешь ошибку с точностью до 3-4 строк. Далее внимательный анализ этих строк (если сам не можешь - кидай сюда).

Posted: 13.05.2008 17:58
by Купидон
Ок. Сейчас начну пробовать сообщения вставлять.

А версию стелса попробовал РЦ1 скачал и тоже самое пишет.

Posted: 13.05.2008 18:12
by Купидон
Нашел где, но как исправить не знаю...

Code: Select all

 procedure DropScroll(flag : boolean);
   // если flag true - скидываем все скроллы, если false - только если много
   var tmp1 : cardinal;
      tmp2, tmp3 : Integer;
   begin
      waitconnection(3000);
     [b] if not flag then[/b]
      begin
        [b] if Count(InscriptMethod[SelectLevel].scroll) < CountResources then exit;[/b]
      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;

Помоги пожалуйста.

Posted: 13.05.2008 19:51
by Edred
То есть проблемы в процедуре DropScroll. Прежде чем разбираться, попробуй закомментарить в основном тексте программы (начиная с Begin с заглавной буквы) все вызовы (по идее, два) этой процедуры:

Code: Select all

DropScroll(true);
и

Code: Select all

DropScroll(false);
и запусти. Если работает - тогда бум разбираться с процедурой. Надолго не оставляй - он скроллы сбрасывать не будет.

Да, и сколько у тебя инскрипта напиши.

Posted: 13.05.2008 22:42
by Купидон
Да, это ж я удалил процедуру и понял, что в ней проблема.

А инскрипт только начал качать - 30.

Posted: 15.05.2008 8:44
by Edred
Хрен его поймет что в этой процедуре не так. Давай методом научного тыка действовать. Пробуй так:

Code: Select all

 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;

Posted: 15.05.2008 15:59
by Купидон
Все равно Out Of Range at 29.141.
А что б время не терять, вставляю в ручную айди скролов.

Code: Select all

procedure DropScroll;
var tmp1 : cardinal;
      tmp2, tmp3 : Integer;

   begin
      waitconnection(3000);
    tmp3 := 0;
      tmp1 := findtype(mycop,backpack);
      while findcount > 0 do
      begin
         tmp2 := GetQuantity(tmp1);
         MoveItem(tmp1,tmp2,TrashID,0,0,0);
        wait(1000);
         checksave;
         tmp3 := tmp3 + tmp2;
         tmp1 := findtype(mycop,backpack);
      end;
         end;

Posted: 15.05.2008 18:12
by Edred
Ну, наверное, не айди, а типы? Перепроверь еще раз, что у тебя прописано в массиве:

Code: Select all

   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;
И не изменял ли ты определение массива записей:

Code: Select all

type CraftMethod = Record 
   head1,punkt1,head2,punkt2 : String; 
   scroll : Cardinal; 
   skill : double; 
   end;
Насчет первого - у тебя должны быть прописаны правильно типы скроллов и названия менюшек к ним.

Posted: 15.05.2008 18:13
by Edred
Хммм... Кстати, счас глянул - у меня чуть другая по тексту версия скрипта в архиве лежит...

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
// от 90 до 100 скилла качаем на:
// Summon Fire Elemental Scroll: 1 blank scroll, 1 SS, 1 BM, 1 MR

{$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 := 'Spell Circles';
		InscriptMethod[5].punkt1 := 'Eighth Circle';
		InscriptMethod[5].head2 := 'Spell Circle 8';
		InscriptMethod[5].punkt2 := 'Summon Water Elemental';
		InscriptMethod[5].scroll := $1F6C;
		InscriptMethod[5].skill := 90.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
	FindDistance := 1;
	InitDim;
	OldSkill := GetSkillValue('Inscription');
	LastContOpen := Now;
	OpenContainer(true);
	FirstTime := True;
	SelectLevel := 5;
	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] := BM; regs[3] := MR; 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.