Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

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

тут можно задать вопрос по скриптингу
Post Reply
Fantastick
Neophyte
Neophyte
Posts: 10
Joined: 02.12.2006 20:37

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

Post 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: и небольшую помощь, как можно сделать выкладку готовых скролов?
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post 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.
Купидон
Posts: 5
Joined: 13.05.2008 14:04

Post 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


Как найти где ошибка? Помогите пожалуйста.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

он точно рабочий, но не знаю для какой версии стелса. Вполне может быть для RC1, например.

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

Post by Купидон »

Ок. Сейчас начну пробовать сообщения вставлять.

А версию стелса попробовал РЦ1 скачал и тоже самое пишет.
Купидон
Posts: 5
Joined: 13.05.2008 14:04

Post 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;

Помоги пожалуйста.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post by Edred »

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

Code: Select all

DropScroll(true);
и

Code: Select all

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

Да, и сколько у тебя инскрипта напиши.
Купидон
Posts: 5
Joined: 13.05.2008 14:04

Post by Купидон »

Да, это ж я удалил процедуру и понял, что в ней проблема.

А инскрипт только начал качать - 30.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post 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;
Купидон
Posts: 5
Joined: 13.05.2008 14:04

Post 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;
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post 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;
Насчет первого - у тебя должны быть прописаны правильно типы скроллов и названия менюшек к ним.
Edred
Moderator
Moderator
Posts: 559
Joined: 28.03.2006 21:29

Post 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.
Post Reply