Тоже скриптик выложу.
Автоматическое движение Ver 1.0
Для программы UoPilot v2.12 WK
* Скрипт на данный момент предусмотрен ТОЛЬКО для обхода касательных препятствий. Если чар упрется скрипт остановиться. Маршрут выбирать таким образом что бы не было упоров.
*Параметр для индивидуальных настроек
Set #ActionTimeOut 50
50 это задержка в милисекундах на проверку выполнено действие или нет. Его подобрать индивидуально в зависимости от того как лагает у вас инет.
*После указания этого параметра идет запись данных о точках в которые необходимо дойти. В виде
Set #X 1
Set #Y 1
GoSub GoToPoint
Set #X 2
Set #Y 2
GoSub GoToPoint
и тд.
*Вместо указанных #X и #Y указать свои.
Точек добавлять столько сколько вам нужно
*При необходимости после GoSub GoToPoint можно вставлять требуемые вам действия соответсвенно.
*Остальные параметры являются служебными и редактированию не подлежат.
Необходимые данные:
1) Правильное отображение всех данных в пилоте
2) стрелка вниз - Движение на SouthEast
3) стрелка вверх - движение на NorthWes
4) стрелка вправо - движение на NorthEast
5) стрелка влево - движение на South West
6) клавиша Home - движение на West
7) клавиша PageUp - движение на North
клавиша PageDown - движение на East
9) клавиша End - движение на South
* Если у вас вручную чар или не двигает или двигается не в те стороны - скрипт работать не будет.
10) Задержку на выполнение строчек скрипта установить 1
// Begin Script Options ================
//Время ожидания действия, МСек.
Set #ActionTimeOut 50
// End Script Options ================
Set #X 1
Set #Y 1
GoSub GoToPoint
Set #X 2
Set #Y 2
GoSub GoToPoint
End_Script
//#Action
//0 - Действие не выполнено
//1 - Действие выполнено
//#BeginCharDir
//Содержит куда надо повернуть чара
//#Blocked
//0 - Препятствие отсутсвует
//1 - Препятствие
//#XBlocked #YBlocked
//Координаты X и Y препятствия
//#CountTurn
//Количество шагов до цели
//или движения по диаганали
//до пересчета направления
//#Barrier
//Содержит результат функции
//0 - Нет препятствия
//1 - Есть препятсвие
//Константы =======================
Set #StrToInt 0
// ================================
//=================================
// BEGIN ==========================
// Подпрограмма для записи карты
//=================================
:SaveMap
If #Blocked <> 0
Set %arr [#XBlocked #YBlocked] 1
Set #Blocked 0
Set #XBlocked 0
Set #YBlocked 0
Else
Set %arr [CharPosX CharPosY] 0
End_If
Return
//=================================
// END ============================
//=================================
//=================================
// BEGIN ==========================
//Подпрограмма для определения
//дистанции до требуемой точки
//=================================
:GetDistance
Set #DistanceNorth 0
Set #DistanceNorthEast 0
Set #DistanceEast 0
Set #DistanceSouthEast 0
Set #DistanceSouth 0
Set #DistanceSouthWest 0
Set #DistanceWest 0
Set #DistanceNorthWest 0
//Дистанция на North и South
If #Y < CharPosY
Set #DistanceNorth CharPosY - #Y
Set #BeginCharDir 0
Set #CountTurn #DistanceNorth
End_If
If #Y > CharPosY
Set #DistanceSouth #Y - CharPosY
Set #BeginCharDir 4
Set #CountTurn #DistanceSouth
End_If
//Дистанция на West и East
If #X < CharPosX
Set #DistanceWest CharPosX - #X
Set #BeginCharDir 6
Set #CountTurn #DistanceWest
End_If
If #X > CharPosX
Set #DistanceEast #X - CharPosX
Set #BeginCharDir 2
Set #CountTurn #DistanceEast
End_If
//Дистанция на NorthEast
If (#DistanceNorth <> 0) And (#DistanceEast <> 0)
If #DistanceNorth > #DistanceEast
Set #DistanceNorthEast #DistanceEast
Set #CountTurn #DistanceNorthEast
Else
Set #DistanceNorthEast #DistanceNorth
Set #CountTurn #DistanceNorthEast
End_If
Set #BeginCharDir 1
End_If
//Дистанция на SoutWest
If (#DistanceSouth <> 0) And (#DistanceWest <> 0)
If #DistanceSouth > #DistanceWest
Set #DistanceSouthWest #DistanceWest
Set #CountTurn #DistanceSouthWest
Else
Set #DistanceSouthWest #DistanceSouth
Set #CountTurn #DistanceSouthWest
End_If
Set #BeginCharDir 5
End_If
//Дистанция на NorthWest
If (#DistanceNorth <> 0) And (#DistanceWest <> 0)
If #DistanceNorth > #DistanceWest
Set #DistanceNorthWest #DistanceWest
Set #CountTurn #DistanceNorthWest
Else
Set #DistanceNorthWest #DistanceNorth
Set #CountTurn #DistanceNorthWest
End_If
Set #BeginCharDir 7
End_If
//Дистанция на SouthEast
If (#DistanceSouth <> 0) And (#DistanceEast <> 0)
If #DistanceSouth > #DistanceEast
Set #DistanceSouthEast #DistanceEast
Set #CountTurn #DistanceSouthEast
Else
Set #DistanceSouthEast #DistanceSouth
Set #CountTurn #DistanceSouthEast
End_If
Set #BeginCharDir 3
End_If
Set #Blocked 0
GoSub SaveMap
Return
//=================================
// END ============================
//=================================
//=================================
// BEGIN ==========================
//Подпрограмма поворота в сторону.
//движения
// ! #BeginCharDir должна содержать
//направление куда поворачивать
//При успехе возвращает #Action=1
//При ошибке возвращает #Action=0
//и записывает координаты
//препятствия в массив
//=================================
:TurnToStep
If CharDir = #BeginCharDir
Set #Action 1
Return
End_If
If #BeginCharDir = 0
Send PageUp
End_If
If #BeginCharDir = 1
Send Right
End_If
If #BeginCharDir = 2
Send PageDown
End_If
If #BeginCharDir = 3
Send Down
End_If
If #BeginCharDir = 4
Send End
End_If
If #BeginCharDir = 5
Send Left
End_If
If #BeginCharDir = 6
Send Home
End_If
If #BeginCharDir = 7
Send Up
End_If
Set #S 0
While (#S <= #ActionTimeOut) And (CharDir <> #BeginCharDir)
Wait 10
Set #S #S + 10
End_While
If CharDir <> #BeginCharDir
Set #Action 0
//Запись данных о препятствии
Set #Blocked 1
If ((#BeginCharDir = 7) And (CharDir = 0)) Or ((#BeginCharDir = 7) And (CharDir = 6))
Set #XBlocked CharPosX - 1
Set #YBlocked CharPosY - 1
End_If
If ((#BeginCharDir = 5) And (CharDir = 6)) Or ((#BeginCharDir = 5) And (CharDir = 4))
Set #XBlocked CharPosX - 1
Set #YBlocked CharPosY + 1
End_If
If (#BeginCharDir = 3) And (CharDir = 4) Or ((#BeginCharDir = 3) And (CharDir = 2))
Set #XBlocked CharPosX + 1
Set #YBlocked CharPosY + 1
End_If
If ((#BeginCharDir = 1) And (CharDir = 2)) Or ((#BeginCharDir = 1) And (CharDir = 0))
Set #XBlocked CharPosX + 1
Set #YBlocked CharPosY - 1
End_If
GoSub SaveMap
//END Запись данных о препятствии
Else
Set #Action 1
End_If
Return
//=================================
// END ============================
//=================================
//=================================
// BEGIN ==========================
//Подпрограмма движения до первого
//Упора
//=================================
:RunStep
Set #XBegin CharPosX
Set #YBegin CharPosY
Set #OldCharDir CharDir
//==========================
If #DistanceNorthEast > 0
Send Right
End_If
If #DistanceNorthWest > 0
Send Up
End_If
If #DistanceSouthEast > 0
Send Down
End_If
If #DistanceSouthWest > 0
Send Left
End_If
If (#DistanceNorth > 0) And ((#DistanceNorthWest = 0) And (#DistanceNorthEast = 0) )
Send PageUp
End_If
If (#DistanceSouth > 0) And ((#DistanceSouthWest = 0) And (#DistanceSouthEast = 0) )
Send End
End_If
If (#DistanceWest > 0) And ((#DistanceSouthWest = 0) And (#DistanceNorthWest = 0) )
Send Home
End_If
If (#DistanceEast > 0) And ((#DistanceNorthEast = 0) And (#DistanceSouthEast = 0) )
Send PageDown
End_If
//Пауза на выполнение действия
Wait #ActionTimeOut
Set #S 0
While (#S <= #ActionTimeOut) And (#XBegin = CharPosX) And (#YBegin = CharPosY) And (#OldCharDir = CharDir)
Wait 10
Set #S #S + 10
End_While
//Если изменилось направление чара
//Запись координат блокрующего
//Предмета
If (#BeginCharDir <> CharDir)
Set #Blocked 1
If ((#BeginCharDir = 7) And (CharDir = 0)) Or ((#BeginCharDir = 7) And (CharDir = 6))
Set #XBlocked CharPosX - 1
Set #YBlocked CharPosY - 1
End_If
If ((#BeginCharDir = 5) And (CharDir = 6)) Or ((#BeginCharDir = 5) And (CharDir = 4))
Set #XBlocked CharPosX - 1
Set #YBlocked CharPosY + 1
End_If
If (#BeginCharDir = 3) And (CharDir = 4) Or ((#BeginCharDir = 3) And (CharDir = 2))
Set #XBlocked CharPosX + 1
Set #YBlocked CharPosY + 1
End_If
If ((#BeginCharDir = 1) And (CharDir = 2)) Or ((#BeginCharDir = 1) And (CharDir = 0))
Set #XBlocked CharPosX + 1
Set #YBlocked CharPosY - 1
End_If
GoSub SaveMap
End_If
If ((#XBegin = CharPosX) And (#YBegin = CharPosY)) And (CharDir = #OldCharDir)
Set #Action 0
Else
Set #Action 1
If ((#XBegin <> CharPosX) Or (#YBegin <> CharPosY))
Set #CountTurn #CountTurn - 1
End_If
End_If
Return
//=================================
// END ============================
//=================================
//=================================
// BEGIN ==========================
//Подпрограмма для движения.
//Если время шага < #StepTimeOut
//=================================
:Walk
//1. Движение пока не будет упора
While (#Action = 1) And ((#X <> CharPosX) Or (#Y <> CharPosY))
GoSub RunStep
If #CountTurn = 0
GoSub GetDistance
End_If
End_While
//1. END
Return
//=================================
// END ============================
//=================================
:GoToPoint
GoSub GetDistance
While #Action <> 1
GoSub TurnToStep
End_While
GoSub Walk
Return