Posted: Fri Feb 09, 2007 1:44 Post subject: Скрипт на Lumber. Шард Forest Wars.
Файл маршрута выглядит так:
Code: Select all
3232 2760 0 0 0 0
3237 2765 3283 3237 2766 5
3237 2763 3283 3237 2762 5
3238 2763 0 0 0 0
3238 2760 3277 3239 2759 5
3240 2762 0 0 0 0
3244 2762 3277 3245 2762 10
3244 2768 0 0 0 0
3245 2769 3280 3245 2770 10
3245 2769 3299 3246 2770 10
3247 2769 0 0 0 0
...
3232 2760 0 0 0 0
Сам скрипт:
Code: Select all
program LambIsengard101;
// В папке D:\Games\Railes есть файл имя_чара.txt и файл res.txt
// Первый - это маршрут перемещения чара по лесу от сундука и обратно к
// сундуку. При килле чар идет дальше по маршруту вплоть до сундука.
// Второй файл - маршрут от сундука до креста для реса.
// Вырубленные логи скидывать в сундук. Топоры брать из мешка оттуда же.
// В общем, как в мининге.
//
// v.1.01 (c) Edred
{$Include 'all.inc'}
const
MyMaxWeight = 350;
Msg1 = 'You put the';
Msg2 = 'не смогли вырубить ничего';
Msg3 = 'fail to';
Msg4 = 'You decide not to chop wood';
Msg5 = 'There is nothing';
Hatchet1 = $0F43;
Hatchet2 = $0F44;
AnkhID = $40002DFE;
Sunduk = $400549E1;
BagHatchets = $4003FF49;
DeadLife = 40;
Logs = $1BDD;
WoodType = $0F90;
type LumbRecord = Record
x,y,tt,tx,ty,tz : integer;
end;
var
LumberDim : array [0..5000] of LumbRecord;
ResDim : array [0..5000] of LumbRecord;
Regs : array [1..3] of Cardinal;
MaxPosL, MaxPosR, k : integer; // длины соответствующих массивов
CharRail, ResRail : String;
LumberFlag : Boolean; // true - работаем, false - нет (разгрузка или смерть)
ctime : TDateTime;
procedure GetLumberRail(s : String; WPos : Integer; flag : Boolean);
// flag - true - маршрут для ламбера, false - маршрут для реса
begin
s := s + ' ';
if flag then
begin
LumberDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
LumberDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
LumberDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
LumberDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
LumberDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
LumberDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
end
else
begin
ResDim[WPos].x := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
ResDim[WPos].y := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
ResDim[WPos].tt := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
ResDim[WPos].tx := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
ResDim[WPos].ty := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
ResDim[WPos].tz := StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s));
end;
end;
procedure GetRail(FileNam : String; Flagoffile : boolean);
var
List : TStringList;
i : integer;
begin
List := TStringList.Create;
List.LoadFromFile(FileNam);
for i := 0 to List.Count-1 do GetLumberRail(List.strings[i],i,FlagOfFile);
if Flagoffile then MaxPosL := i
else MaxPosR := i;
end;
procedure CheckDead;
begin
if Dead then exit;
if HP < 40 then
begin
Disconnect;
wait(5000);
Connect;
repeat
wait(100);
until Connected;
end;
end;
procedure RestoreStamina;
// если стамины мало, восстанавливаем ее чару до полной
begin
if Stam < 20 then
begin
repeat
waitconnection(3000);
wait(1000);
until Stam = MaxStam;
end;
end;
function CheckHatchet : Boolean;
// проверяем, есть ли топор у чара в паке или на нужном слое.
// если ее нет - открываем сундук и мешок, берем топор. Если топора нет
// в мешке - выход.
var tmpser : Cardinal;
begin
Result := true;
waitconnection(3000);
if (ObjAtLayerEx(RhandLayer,self) <> 0) or (count(Hatchet1)<>0) or (count(Hatchet2)<>0) then exit;
// нет у чара топора
repeat
UseObject(Sunduk);
wait(1000);
checksave;
UseObject(BagHatchets);
wait(1000);
checksave;
tmpser := findtype(Hatchet1,BagHatchets);
if tmpser = 0 then tmpser := findtype(Hatchet2,BagHatchets);
if tmpser <> 0 then
begin
Grab(tmpser,1);
wait(1000);
checksave;
end;
until (count(Hatchet1)<>0) or (count(Hatchet2)<>0);
end;
procedure ResChar;
// идем по маршруту на рес, ресаем чара, восстанавливаем здоровье, возвращаемся
// по тому же маршруту в обратную сторону
var
n : integer;
tmptime : TDateTime;
begin
AddToSystemJournal('TEST: нужен рес чара');
For n := 0 to MaxPosR-1 do
begin
repeat
NewMoveXY(ResDim[n].x,ResDim[n].y,False,0,true);
wait(300);
until (GetX(self)=ResDim[n].x) and (GetY(self)=ResDim[n].y);
end;
// чар у креста
AddToSystemJournal('TEST: чар у креста');
WaitConnection(5000);
if WarMode = true then SetWarMode(false);
repeat
UseObject(AnkhID);
wait(2000);
checksave;
until not Dead;
// лечим чара
AddToSystemJournal('TEST: лечим чара');
while (HP<MaxHP) do
begin
waitconnection(3000);
tmptime := Now;
n := 0
UseSkill('Spirit Speak');
repeat
wait(100);
n := n + 1;
until (InJournalBetweenTimes('You fail|You channel|You lack|You establish', tmptime, Now)<>-1) or (Mana < (MaxMana - 50)) or (n > 300);
wait(500);
if Mana < 30 then
begin
tmptime := Now;
n := 0;
repeat
waitconnection(3000);
useskill('meditation');
wait(2000);
n := n + 1;
checksave;
until (InJournalBetweenTimes('reached full mana', tmptime, Now)<>-1) or (n = 100);
end;
end;
// пойдем обратно
AddToSystemJournal('TEST: идем обратно к сундуку');
For n := 0 to MaxPosR-1 do
begin
repeat
NewMoveXY(ResDim[MaxPosR-1-n].x,ResDim[MaxPosR-1-n].y,False,0,true);
wait(300);
until (GetX(self)=ResDim[MaxPosR-1-n].x) and (GetY(self)=ResDim[MaxPosR-1-n].y);
end;
end;
procedure Discharge;
// разгружаем нарубленное в сундук
// нарубленное - реги в массиве Regs[1..3]
// логи - константа Logs
var m, tmpcnt : integer;
tmpid, tmpstack, tmpcolor : Cardinal;
tmpname : String;
begin
AddToSystemJournal('TEST: разгрузка');
waitconnection(3000);
CheckDead;
if Dead then exit;
UseObject(Sunduk);
wait(1000);
checksave;
// выложим реги
for m := 1 to 3 do
begin
tmpcnt := 0;
Repeat
tmpid := Findtype(Regs[m],backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' regs');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить regs!');
wait(15000);
end;
tmpstack := Findtype(Regs[m],Sunduk);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
end;
// выложим дид вуды
tmpcnt := 0;
Repeat
tmpid := Findtype(WoodType,backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' dead woods');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить dead woods!');
wait(15000);
end;
tmpstack := Findtype(WoodType,Sunduk);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
// выложим логи
tmpcnt := 0;
Repeat
tmpid := Findtype(Logs,backpack);
if tmpid = 0 then break;
tmpcolor := GetColor(tmpid);
tmpname := ' unknown logs';
case tmpcolor of
$0000 : tmpname := ' logs';
$037F : tmpname := ' Grave logs';
$0039 : tmpname := ' Willow logs';
$0026 : tmpname := ' Maple logs';
$0405 : tmpname := ' Oak logs';
$0994 : tmpname := ' Bloody logs';
$048A : tmpname := ' Nature logs';
$0898 : tmpname := ' Spirits logs';
end;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + tmpname);
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить логи');
wait(15000);
end;
repeat
tmpstack := FindtypeEx(Logs,tmpcolor,Sunduk,False);
if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack);
until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000);
// Если не найден в сундуке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
IgnoreReset;
AddToSystemJournal('TEST: разгрузка закончена');
end;
function LumbCurTree(tile,x,y,z : Integer) : Boolean;
// рубим указанный тайл. Возвращаем false если перевес или чар мертв.
var q, m1, m2, m3, m4, m5, CountFizzle : integer;
begin
Result := true;
CountFizzle := 0;
repeat
if WarMode = true then SetWarMode(false);
if TargetPresent then CancelTarget;
ctime := Now;
if Dead then begin Result := false; exit; end;
if UseType(Hatchet1,$FFFF) = 0 then
begin
if UseType(Hatchet2,$FFFF) = 0 then
begin
Result := false;
exit;
end;
end;
WaitForTarget(5000);
If TargetPresent then TargetToTile(tile, x, y, z);
q := 0;
repeat
wait(100);
q := q + 1;
checksave;
m1 := InJournalBetweenTimes(Msg1, ctime, Now);
m2 := InJournalBetweenTimes(Msg2, ctime, Now);
m3 := InJournalBetweenTimes(Msg3, ctime, Now);
m4 := InJournalBetweenTimes(Msg4, ctime, Now);
m5 := InJournalBetweenTimes(Msg5, ctime, Now);
until (m1<>-1) or (m2<>-1) or (m3<>-1) or (m4<>-1) or (m5<>-1) or Dead or (q > 300);
if (m2<>-1) or (m3<>-1) or (m4<>-1) then CountFizzle := CountFizzle + 1;
if Dead or (Weight > MyMaxWeight) then begin Result := false; exit; end;
until (m5<>-1) OR (CountFizzle = 10);
end;
Begin
Regs[1] := $0F85; // ginseng
Regs[2] := $0F88; // Nightshade
Regs[3] := $0F86; // Mandrake Roots
CharRail := 'D:\Games\Railes\' + GetName(self) + '.txt';
ResRail := 'D:\Games\Railes\res.txt';
GetRail(CharRail,true);
AddToSystemJournal('Маршрут ' + CharRail + ' загружен');
GetRail(ResRail,false);
AddToSystemJournal('Маршрут ' + ResRail + ' загружен');
// Стартуем от сундука
repeat
CheckDead;
if Dead then LumberFlag := false else LumberFlag := true;
if LumberFlag then
begin
if not CheckHatchet then exit;
For k := 0 to MaxPosL-1 do
begin
// идем по маршруту
repeat
RestoreStamina;
NewMoveXY(LumberDim[k].x,LumberDim[k].y,False,0,true);
wait(300);
until (GetX(self)=LumberDim[k].x) and (GetY(self)=LumberDim[k].y);
AddToSystemJournal('TEST (' + inttostr(k) + ' of ' + inttostr(MaxPosL-1) + '): пришел в координаты ' + inttostr(LumberDim[k].x) + ',' + inttostr(LumberDim[k].y));
if LumberFlag and (LumberDim[k].tt <> 0) then
// Будем рубить
LumberFlag := LumbCurTree(LumberDim[k].tt,LumberDim[k].tx,LumberDim[k].ty,LumberDim[k].tz);
end;
end;
// мы снова у сундука
if not Dead then Discharge else ResChar;
if ((GetX(self) = 3231) AND (GetY(self) = 2759)) then NewMoveXY(3232,2759,False,0,true);
until False;
End.