Help!!! (Type mismatch)
Posted: 08.11.2009 21:13
Code: Select all
22:07:06 [Flash]: Compiling
22:07:06 [Flash]: Compiler: [Error] (move.inc at 126:34): Type mismatch
22:07:06 [Flash]: Compiling failed
22:07:06 [Flash]: Script move.inc stopped successfuly
Code: Select all
// íàïèñàë Somebody. ICQ: 475728522 e-mail: [email protected]
// Ðåàëèçàöèÿ àëãîðèòìà "íà䏿íîé òðàññèðîâêè"
// http://pmg.org.ru/ai/stout.htm#robust_trace
const
GateType=$0F6C;
FMoveArrMax = 300; // ñòàâü çäåñü áîëüøå, åñëè òâîé ÷àð õîäèò íà äèñòàíöèè áîëüøå 13 òàéëîâ èëè âîêðóã ÷àðà î÷åíü ìíîãî ïðåïÿòñòâèé. Åñëè ïðåïÿòñòâèé íà ïóòè ìàëî, òî ìîæíî îñòàâèòü êàê åñòü.
var
PrognosisX, PrognosisY, FMoveArrCount : integer;
FMoveArr : array [1..FMoveArrMax] of array [1..2] of smallint;
sTimerHide: cardinal;
aMoveResult: byte;
procedure InitCheckHide;
Begin
sTimerHide:=timer;
wait(5100);
End;
procedure CheckLag_;
var starttime : TDateTime;
begin
repeat
starttime := Now;
ClickOnObject(backpack);
wait(100);
WaitJournalLine(starttime,'backpack',10000);
until (InJournalBetweenTimes('backpack', starttime, Now)<>-1);
end;
Function Abs(A: integer): integer;
Begin
If A>=0 then result:=A
Else result:=0-A;
End;
function SetDirection(x, y : integer) : integer;
var
MyX,MyY,DiffX,DiffY,GoDir: integer;
Begin
MyX:=GetX(self);
MyY:=GetY(self);
DiffX:=Abs(MyX-x);
DiffY:=Abs(MyY-y);
if (DiffX/(DiffY+0.1))>=2 then
begin
if (MyX>X) then
GoDir:=6
else
GoDir:=2;
end
else
if (DiffY/(DiffX+0.1))>=2 then
begin
if (MyY>Y) then
GoDir:=0
else
GoDir:=4;
end
else
if (MyX>X) and (MyY>Y) then GoDir:=7
else
if (MyX>X) and (MyY<Y) then GoDir:=5
else
if (MyX<X) and (MyY>Y) then GoDir:=1
else
if (MyX<X) and (MyY<Y) then GoDir:=3;
result:=GoDir;
end;
procedure CalcPrognosis(Dir : integer);
begin
if (Dir = 1) or (Dir = 2) or (Dir = 3) then PrognosisX := GetX(self) + 1;
if (Dir = 5) or (Dir = 6) or (Dir = 7) then PrognosisX := GetX(self) - 1;
if (Dir = 0) or (Dir = 4) then PrognosisX := GetX(self);
if (Dir = 3) or (Dir = 4) or (Dir = 5) then PrognosisY := GetY(self) + 1;
if (Dir = 7) or (Dir = 0) or (Dir = 1) then PrognosisY := GetY(self) - 1;
if (Dir = 2) or (Dir = 6) then PrognosisY := GetY(self);
end;
procedure TryToMove(Direction : byte; RunFlag : boolean);
var
xSelf,ySelf,zSelf: word;
selfDir: byte;
begin
wait(100);
xSelf:=getX(self);
ySelf:=getY(self);
zSelf:=GetSurfaceZ(xSelf,ySelf,WorldNum);
selfDir:=GetDirection(self);
if selfDir <> Direction then Step(Direction, RunFlag);
if Direction=1 then
if (Not IsWorldCellPassable(xSelf,ySelf,xSelf,ySelf-1,zSelf,WorldNum)) OR (Not IsWorldCellPassable(xSelf,ySelf,xSelf+1,ySelf,zSelf,WorldNum)) then begin aMoveResult:=3; exit; end;
if Direction=3 then
if (Not IsWorldCellPassable(xSelf,ySelf,xSelf,ySelf+1,zSelf,WorldNum)) OR (Not IsWorldCellPassable(xSelf,ySelf,xSelf+1,ySelf,zSelf,WorldNum)) then begin aMoveResult:=3; exit; end;
if Direction=5 then
if (Not IsWorldCellPassable(xSelf,ySelf,xSelf,ySelf+1,zSelf,WorldNum)) OR (Not IsWorldCellPassable(xSelf,ySelf,xSelf-1,ySelf,zSelf,WorldNum)) then begin aMoveResult:=3; exit; end;
if Direction=7 then
if (Not IsWorldCellPassable(xSelf,ySelf,xSelf-1,ySelf,zSelf,WorldNum)) OR (Not IsWorldCellPassable(xSelf,ySelf,xSelf,ySelf-1,zSelf,WorldNum)) then begin aMoveResult:=3; exit; end;
if IsWorldCellPassable(xSelf,ySelf,PrognosisX,PrognosisY,zSelf,WorldNum) then
begin
if (Not RunFlag) AND (Not Dead) AND (Not Hidden) then
begin
If (Timer-sTimerHide)>5000 then
begin
If WarMode then SetWarMode(false);
UseSkill('Hiding');
sTimerHide:=Timer;
end;
end;
if step(Direction,RunFlag) then
begin
aMoveResult:=1;
end
else
begin
wait(5050);
aMoveResult:=2;
end;
end
else
begin
aMoveResult:=2;
end;
end;
function WrongMove(x, y : integer) : boolean;
var
i : integer;
begin
result := false;
if FMoveArrCount = 0 then exit;
for i := 1 to FMoveArrCount do
begin
if (x = FMoveArr[i][1]) and (y = FMoveArr[i][2]) then
begin
result := true;
exit;
end;
end;
end;
function Min(x,y: integer): integer;
begin
if x>y then Result:=y else Result:=x;
end;
function HEst(x,y: integer): integer;
var dx,dy,Ddx : integer;
begin
dx:= GetX(self)-x;
dy:= GetY(self)-y;
Ddx:= dx-dy;
If dx<0 then dx:=0-dx;
If dy<0 then dy:=0-dy;
If Ddx<0 then Ddx:=0-Ddx;
Result:= min(dx,dy)+Ddx;
end;
procedure SetWrongMove(x, y : integer);
begin
FMoveArrCount := FMoveArrCount + 1;
FMoveArr[FMoveArrCount][1] := x;
FMoveArr[FMoveArrCount][2] := y;
end;
function RewindDir(Dir, c : integer) : integer;
begin
result := Dir + c;
if result < 0 then result := result + 8;
if result > 7 then result := result - 8;
end;
function Move(x, y, tolerance : integer; RunFlag : boolean) : boolean;
var
Dir, Dist, lastX, lastY, t, i, timeout : integer;
begin
FMoveArrCount := 0;
Dist := HEst(x, y);
timeout := Dist * 15000; // 5 ñåêóíä âðåìåíè íà øàã
t := timer;
while true do
begin
Dist := HEst(x, y);
if Dist <= tolerance then // ïðèø¸ë
begin
result := true;
exit;
end;
if timer - t > timeout then // ïðîâàë ïî òàéìàóòó
begin
AddToSystemJournal('Move: Time moved out!');
result := false;
exit;
end;
if aMoveResult<>3 then
begin
Dir := SetDirection(x, y);
CalcPrognosis(Dir);
if WrongMove(PrognosisX, PrognosisY) then
begin
for i := 1 to 7 do
begin
Dir := RewindDir(Dir,1);
CalcPrognosis(Dir);
if not WrongMove(PrognosisX, PrognosisY) then break;
end;
if i = 8 then
begin
AddToSystemJournal('Move: Cannot move');
result := false;
exit;
end;
end;
end
else
begin
for i:=1 to 7 do
begin
Dir:=RewindDir(Dir,1);
CalcPrognosis(Dir);
TryToMove(Dir, RunFlag);
If aMoveResult=1 then break;
end;
if i = 8 then
begin
AddToSystemJournal('Moveeee: Cannot move');
result := false;
exit;
end;
end;
timeout := timeout + CheckFlow;
lastX := GetX(self); lastY := GetY(self);
TryToMove(Dir, RunFlag);
if aMoveResult=1 then SetWrongMove(lastX, lastY); // îòñþäà ÷àð ïðèø¸ë
if aMoveResult=2 then SetWrongMove(PrognosisX, PrognosisY);
end;
end;
procedure _move(x, y, tolerance : integer; runFlag : boolean);
begin
while not Move(x, y, tolerance,runFlag) do wait(100);
end;
//
// ...
// begin
// InitCheckFlow;
// ...
// move(1234, 1234, 0); // èëè _move(1234, 1234, 0);
// ...
Code: Select all
if step(Direction,RunFlag) then
посоветуйте что делать?