Adicione um Comentário

Data
De
Assunto

Re:Paly

const
RampsID = [1950, 1952, 1954, 1956, 385, 1947, 434, 414, 604, 7020]
Wanted='Dragon';//
Wanted2='Dragon';//
AttackAt = 16;//
//
function GetCreatureByID(ID: integer): TCreature;
var
x: integer;
Finished: boolean;
begin
Result := nil;
for x := 0 to Creatures.Count - 1 do
begin
if x >= Creatures.Count then Break;
if Creatures.Creature[x].ID = ID then
begin
Result := Creatures.Creature[x];
Exit;
end;
end;
end;
function GetTileFromXYZ(X, Y, Z: integer): TTile;
begin
Result := nil;
if abs((Self.X - 7) - X) > 14 then Exit;
if abs((Self.Y - 5) - Y) > 11 then Exit;
if Self.Z <> Z then Exit;
Result := Screen.Tile[abs((Self.X - 7) - X), abs((Self.Y - 5) - Y)];
end;
function TileIsWalkable(X, Y, Z: integer): boolean;
var Tile: TTile;
begin
Result := True;
Tile := GetTileFromXYZ(X, Y, Z);
If (Tile <> nil) and (Tile.Count <> 0) then
for Z := 0 to Tile.Count - 1 do
begin
if Tile.Item[Z].Properties.Hole then Result := False;
else if Tile.Item[Z].Properties.Stairs then Result := False;
else if not Tile.Item[Z].Properties.Walkable then Result := False;
else
begin
for x := low(RampsID) to high(RampsID) do
begin
if Tile.Item[Z].ID = RampsID[x] then Result := False;
end;
end;
end;
end;
Function MoveFromRange: boolean;
begin
Result := True;
Creature := GetCreatureByID(Self.Attacking);
if Creature <> nil then
//northwest
if ((Creature.X-self.X = 2) and (Creature.Y-self.Y = 2)) or
((Creature.X-self.X = 2) and (Creature.Y-self.Y = 3)) or
((Creature.X-self.X = 3) and (Creature.Y-self.Y = 2)) or
((Creature.X-self.X = 3) and (Creature.Y-self.Y = 3)) or
//southwest
((Creature.X-self.X = 2) and (Creature.Y-self.Y = -2)) or
((Creature.X-self.X = 2) and (Creature.Y-self.Y = -3)) or
((Creature.X-self.X = 3) and (Creature.Y-self.Y = -2)) or
((Creature.X-self.X = 3) and (Creature.Y-self.Y = -3)) or
//northeast
((Creature.X-self.X = -2) and (Creature.Y-self.Y = 2)) or
((Creature.X-self.X = -2) and (Creature.Y-self.Y = 3)) or
((Creature.X-self.X = -3) and (Creature.Y-self.Y = 2)) or
((Creature.X-self.X = -3) and (Creature.Y-self.Y = 3)) or
//southeast
((Creature.X-self.X = -2) and (Creature.Y-self.Y = -2)) or
((Creature.X-self.X = -2) and (Creature.Y-self.Y = -3)) or
((Creature.X-self.X = -3) and (Creature.Y-self.Y = -2)) or
((Creature.X-self.X = -3) and (Creature.Y-self.Y = -3)) then
Result := False;
end;
begin
while not Terminated do
begin
UpdateWorld;
if Self.Attacking <> 0 then
begin
Creature := GetCreatureByID(Self.Attacking);
if Terminated=True then exit;
if (Creature <> nil) and (MoveFromRange) then
if (Creature.Health<=AttackAt) then
if (Creature.Name=Wanted) or (Creature.Name=Wanted2) then
//// Add more monsters here in the same format if you want to run from them
//// make sure to add them also to the constant list at the top
begin
//Northwest of Creature
if (Creature.X > Self.X) and (Creature.Y > Self.Y) then
begin
Tile:=GetTileFromXYZ(Self.X, Creature.Y + 1, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Self.X, Creature.Y + 1, Creature.Z)) then
begin
Self.MoveTo(Self.X, Creature.Y + 1, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 1, Self.Y, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 1, Self.Y, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 1, Self.Y, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y - 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y - 2, Creature.Z)=true) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y - 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y - 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y - 3, Creature.Z)=true) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y - 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y - 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y - 2, Creature.Z)=true) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y - 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y - 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y - 3, Creature.Z)=true) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y - 3, Creature.Z);
end;
end;
//Southwest of Creature
if (Creature.X > Self.X) and (Creature.Y < Self.Y) then
begin
Tile:=GetTileFromXYZ(Self.X, Creature.Y - 1, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Self.X, Creature.Y - 1, Creature.Z)) then
begin
Self.MoveTo(Self.X, Creature.Y - 1, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 1, Self.Y, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 1, Self.Y, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 1, Self.Y, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y - 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y - 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y - 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y - 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y - 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y - 3, Creature.Z);
end;
end;
//Southeast of Creature
if (Creature.X < Self.X) and (Creature.Y < Self.Y) then
begin
Tile:=GetTileFromXYZ(Self.X, Creature.Y - 1, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Self.X, Creature.Y - 1, Creature.Z)) then
begin
Self.MoveTo(Self.X, Creature.Y - 1, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 1, Self.Y, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 1, Self.Y, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 1, Self.Y, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 2, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 2, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 2, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 2, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 2, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 2, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y + 3, Creature.Z);
end;
end;
//North of Creature
if (Creature.X = Self.X) and (Creature.Y > Self.Y) then
begin
Tile:=GetTileFromXYZ(Creature.X - 1, Self.Y, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 1, Self.Y, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 1, Self.Y, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 1, Self.Y, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 1, Self.Y, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 1, Self.Y, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 2, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 2, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 2, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 2, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 2, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 2, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X + 3, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X + 3, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X + 3, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y + 3, Creature.Z);
end;
end;
//West of Creature
if (Creature.X > Self.X) and (Creature.Y = Self.Y) then
begin
Tile:=GetTileFromXYZ(Self.X, Creature.Y - 1, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Self.X, Creature.Y - 1, Creature.Z)) then
begin
Self.MoveTo(Self.X, Creature.Y - 1, Creature.Z);
end;
Tile:=GetTileFromXYZ(Self.X, Creature.Y + 1, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Self.X, Creature.Y + 1, Creature.Z)) then
begin
Self.MoveTo(Self.X, Creature.Y + 1, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y - 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y - 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y - 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y + 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y + 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y + 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y + 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y + 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y + 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 2, Creature.Y - 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 2, Creature.Y - 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 2, Creature.Y - 3, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y - 2, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y - 2, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y - 2, Creature.Z);
end;
Tile:=GetTileFromXYZ(Creature.X - 3, Creature.Y - 3, Creature.Z);
if (Tile<>nil) and (TileIsWalkable(Creature.X - 3, Creature.Y - 3, Creature.Z)) then
begin
Self.MoveTo(Creature.X - 3, Creature.Y - 3, Creature.Z);
end;
end;
end;
//Diagonal if higher than Attackat health and 1sqm away
Creature := GetCreatureByID(Self.Attacking);
if Terminated=True then exit;
if (Creature <> nil) and (MoveFromRange) then
if (Creature.Health>AttackAt) then
if (Creature.Name=Wanted) or (Creature.Name=Wanted2) then
//// Add more monsters here in the same format if you want to be diagonal from them
//// make sure to add them also to the constant list at the top.
if (abs(Creature.X-self.X) <= 1) and (abs(Creature.Y-self.Y) <= 1) then
begin
if (Self.X<>Creature.X) and (Self.Y=Creature.Y) then
begin
Tile:=GetTileFromXYZ(Self.x,Self.y-1,self.z);
if Tile<>nil then
if TileIsWalkable(Self.x,Self.y-1,self.z) then
begin
Self.MoveUp;
Moved:=true;
end;
If (Moved=False) then
begin
Tile:=GetTileFromXYZ(Self.x,Self.y+1,self.z);
if Tile<>nil then
if TileIsWalkable(Self.x,Self.y+1,self.z) then
Self.MoveDown;
end;
end;
Moved:=false;
if (Self.X=Creature.X) and (Self.Y<>Creature.Y) then
begin
Tile:=GetTileFromXYZ(Self.x-1,Self.y,self.z);
if Tile<>nil then
if TileIsWalkable(Self.x-1,Self.y,self.z) then
begin
Self.MoveLeft;
Moved:=true;
end;
If (Moved=False) then
begin
Tile:=GetTileFromXYZ(Self.x+1,Self.y,self.z);
if Tile<>nil then
if TileIsWalkable(Self.x+1,Self.y,self.z) then
Self.MoveRight;
end;
end;
end;
end;
sleep(500);
end;
end;

Voltar

Pesquisar no site

By Chuck Norriz © 2009 Todos os direitos reservados.