Урок 1. Основы скриптования.
В данном кратком руководстве мы попытаемся изучить основные возможности Stealth клиента, а также в деталях рассмотрим процесс написания скриптов, их отладки и тестирования. Я постарался составить данное руководсво так, чтобы в нем мог разобраться даже человек до этого не слышавший о программировании. Получилось это или нет, судить вам.
Stealth представляет собой текстовой клиент для Ультимы Онлайн с поистине уникальными возможностями реализации действий игрока практически любой степени сложности. Для этих задач он использует написанные на языке Object Pascal различные подпрограммы. Итак, для начала попробуем разобраться, что же такое скриптовая программа или проще говоря скрипт. Скрипт – это некая последовательность действий реализована в коде, которые мы хотим выполнить.
Строго говоря процесс разработки скрипта делится на следующие этапы:
1. Определение цели
Здесь нам необходимо понять, что же мы хотим сделать. Например, написать скрипт на ламбер или на прокачку магии. С этим все более-менее понятно.
2. Разработка алгоритма.
На этом этапе необходимо определить последовательность наших действий, которые надо выполнить для получения результата. Если наша задача может быть решена несколькими способами, то мы используем какой-либо критерий, например, скорость выполнения, в соответствии с чем выбираем наиболее подходящее решение. Результатом этого этапа является подробное словесное описание алгоритма, либо его блок-схема.
Например, мы хотим сковать даггер. Наши действия будут примерно такими:
1) Подойти к сундуку.
2) Взять 10 ингов
3) Подойти к плавильне
4) Взять молоток в руки
5) Даблклик на молотке
6) Как только появился прицел, даблклик на ингах
6) Ждем выполнения работы
7) Переходим к пункту 5.
В этом алгоритме сразу заметно несколько слабых мест. К примеру, что произойдет если мы сковали очередной даггер и у наз перегруз, т.е. следующий за ним даггер просто окажется под ногами? Или что если у нас закончились все инги?
Все эти моменты желательно определить и описать еще на этапе составления алгоритма. Даже если вы его не записываете, то в уме все равно составляете подобный план и чем он будет подробнее, тем легче вам будет закодировать его действия в Стелсе.
3. Кодирование
После того как определены требования к скрипту и составлен план его работы, мы просто записываем его на языке программирования. В результате получается так называемый исходный код. Если вы подумали, что на этом написание скрипта заканчивается, то вы глубоко ошибаетесь. Далее следует не менее важный этап, а именно
4. Отладка и Тестирование.
Отладка – это процесс поиска и устранения ошибок. Ошибки в скриптах могут разделяться на 2 категории – это синтаксические (ошибки в тексте) и алгоритмические. Синтаксические – это наиболее легко устранимые типы ошибок. Алгоритмические обнаружить труднее.
Успешно запущенный скрипт может говорить лишь об отсутствии в тектсте программы синтаксических ошибок. Убедиться в правильности его работы можно только во время тестирования – пробных запусках и изучении процесса выполнения действий вашим чаром. Позже мы рассмотрим более детально этот процесс.
Итак, на данном уроке мы познакомились с основой программирования, которая применима практически к любым языкам. В дальнейших уроках мы подробнее остановимся на языке программирования Стелса – Object Pascal`e и составим нашу первую скриптовую программу.
Урок 2. Первый скрипт – ‘Привет, Ультима!’
Теперь попробуем написать простейший скрипт. Предположим, нам нужно, чтобы чар сказал слова приветствия. Для этого мы используем программу Say. Откройте свой любимый текстовой редактор и скопируйте туда следующий код:
Code: Select all
program Say;
const
Hello = 'Привет,';
var
World : String;
Begin
World := 'Ультима!';
UOSay(Hello + ' ' + World);
End.
После запуска скрипта ваш чар произнесет фразу ‘Привет, Ультима!’. Поздравляем! Вы только что создали и запустили ваш первый скрипт. Теперь давайте подробнее рассмотрим его в деталях.
Каждый скрипт начинается с ключевого слова program, за которым идет название скрипта. (В нашем случае – это Say) После чего следует знак ;, пропуск его является синтаксической ошибкой.
Заметка. Регистр букв.
В каком регистре написаны ключевые слова особого значения не имеет, Object Pascal позволяет использовать и такую запись:
pRoGraM Say;
Но злоупотреблять этим определенно не стоит, из-за этого программу становится гораздо труднее понять.
После program Say; в нашем примере идет ключевое слово const, после которого идут константы. Более подробно мы обратимся к ним на следующих уроках, а пока скажем, что мы используем так называемую именованную константу, т.е. идентификатор (в нашем случае Hello) который в программе заменяется самой константой (в нашем случае строкой 'Привет,'). В конце ставится ;.
Далее идет ключевое слово var. Которое предваряет область определения так называемых переменных. Переменная – это облась памяти, в которой находятся данные, с которыми соответственно оперирует наш скрипт. В Object Pascal каждая переменная перед использованием должна быть объявлена. С помощью объявления устанавливается не только факт существования переменной, но и задается ее тип. В нашем случае объявление переменной выглядит следующим образом: World : String;. World – это название переменной, по которому мы ее идентифицируем, а String – это строковой тип, который позволяет помещать в переменную текстовые данные.
Заметка. Отличие констант от переменных.
Константы отличаются от переменных тем, что их значение четко определено еще в самом начале программы. Т.е. в нашем случае мы не можем далее в программе присвоить идентификатору Hello другую текстовую строчку. Переменные же мы можем менять на протяжении всего выполнения программы, единственное ограничение – значение которое мы им присваиваем должно четко соответствовать типу переменной определенному в начале программы.
Далее следует ключевое слово Begin. И вплоть до End идет код тела программы. Обратите внимание, что за словом Begin не ставится знак ;.
Чтобы программа могла обратиться к переменной, например для того чтобы получить текстовую строку (в нашем случае, 'Ультима!'), мы должны сделать следующее - World := 'Ультима!';.
Последовательность символов := является так называемой инструкцией присваивания. Она сообщает компилятору, что мы хотим присвоить переменной World строку 'Ультима!'.
Для выполнения часто встречающихся действий в Ультиме Stealth предоставляет ряд процедур. Одна из них UOSay, которую мы используем, позволяет нам общаться в мире Ультимы. В скобках ( ) находится строка, которую мы хотим произнести. В качестве этой строки может выступать как константа, так и переменная соответствующего типа. В нашем случае мы объединяем два слова Привет и Ультима в одну строку оператором +.
Попробуйте поменять в нашей программе строку UOSay(Hello + ' ' + World); на UOSay(World + ' ' + Hello); и запустить скрипт. На этот раз чар произнесет слова «Ультима! Привет,». Таким образом комбинируя разные строковые переменные мы добиваемся того чтобы чар произносил разные предложения. Также в процедуре UOSay можно задавать строку открытым текстом, например UOSay('Привет, Ультима!');. В нашем случае мы задали открытым тестом только пробел ' '.
Попробуйте поэкспериментировать с тем, чтобы чар произносил разные фразы. Главное, не забывайте в конце строки ставить знак ;, это самая распространенная ошибка.
Итак, на этом уроке мы написали с вами первый простейший скрипт и подробно рассмотрели каждую его строчку. В дальнейшем мы узнаем более подробнее о процедурах и даже напишем одну из них самостоятельно. Также вы узнаете, что кроме процедур существуют и функции. Оставайтесь с нами =)
Урок 3. Язык программирования Object Pascal
В данном уроке будет сделана попытка вкратце рассказать о языке Pascal, охватив несколько его важных аспектов. Конечно, он не заменит полностью большие руководства по языку программирования, но сможет познакомить вас с базовыми понятиями необходимыми для успешного понимания механизма действия скриптов для Stealth.
Скрипт, записанный на языке Object Pascal, представляет собой последовательность инструкций, которые довольно часто называют операторами. Одна инструкция от другой отделяется точкой с запятой. Каждая инструкция состоит из слов (идентификаторов). Идентификатор может обозначать:
• инструкцию языка (:=, if, while, procedure)
• переменную (ячейку памяти)
• подпрограмму (процедуру или функцию)
• арифметическую (+,-,*,/) или логическую (and, or, not) операцию
• отмечать начало или конец программы
• константу и т.д.
Программы на Object Pascal могут оперировать с различными типами данных: целыми и дробными числами, символами, строками символов, логическими величинами. Подробнее узнать о различных типах и их представлении вы можете в любом справочнике по программированию. Мы же остановимся на основных, которые наиболее часто используются при написании скриптов в Стелсе.
1) Целые типы: Integer и Cardinal
2) Вещественные: Single и Double
3) Строковой String
4) Логический Boolean
Переменные
Теперь расскажем немного подробнее о переменных. Как уже упоминалось на прошлых уроках - Переменная – это область памяти, в которой находятся данные, с которыми оперирует программа. Чтобы программа могла обратиться к переменной, она должна иметь имя. Имя переменной придумывает сам программист.
В качестве имени переменной можно использовать последовательность из букв латинского алфавита, цифр и некоторых специальных символов. Первым символом в имени переменной должна быть буква. Желательно, чтобы имя переменной было логически связано с ее названием. Например, переменной в которой хранится кол-во ингов в Ультиме, можно назначить имя ingots, логам – logs и т.п.
Заметка. Учтите, что в имени переменной нельзя использовать пробел. Вместо него обычно используют знак подчеркивания _ .
Каждая переменная перед использованием должна быть объявлена. С помощью объявления также задается тип переменной, тем самым указывается диапазон допустимых значений.
Приведем пример:
Code: Select all
Player : String;
Объявление каждой переменной, как правило, помещается на отдельной строке, но если в скрипте имеются несколько переменных принадлежащих к одному типу, то имена этих переменных можно перечислить в одной строке через запятую, а тип указать после последней строки через двоеточие, например:
Code: Select all
Log, ingot, enemy : Integer;
В Object Pascal существует 2 типа констант – обычные и именованные. Обычные – это целое или дробное число, строка символов, отдельный символ или логическое значение.
Примеры числовых констант:
2
-34
34.5
Примеры строковых (символьных) констант:
‘Stealth делает Inject’
‘Минер атакован’
‘Попытка №5’
Логических констант всего две - true (истина) и false (ложь).
Именованная константа – это имя, которое используется в скрипте вместо самой константы. Мы уже встречались с ней на 2м уроке.
Приведем еще несколько примеров:
Code: Select all
User = 'Шахтер';
Popitok = 5;
Number = $4DFFD;
Инструкция присваивания является основной вычислительной инструкцией. Ее нужно использовать в том случае, когда в скрипте необходимо произвести некоторые вычисления. В результате ее выполнения значение переменной меняется, ей присваивается значение.
Допустим, нам нужно вычислить количество регов найтшейда, которые мы хотим купить:
Code: Select all
Kolichestvo := summa / cena;
:= - это символ инструкции присваивания.
summa / cena – это выражение, которое мы хотим вычислить. В данном случае мы делим (оператор /) сумму нашего капитала, которая находится в переменной summa, на цену 1 реагента, которая в свою очередь записана в переменной cena.
Заметка. В данном примере подразумевается, что переменные Kolichestvо, summa и cena – имеют одинаковый тип
Выражения.
Выражение состоит из операторов и операндов. Операторы находятся между операндами и обозначают действия, которые выполняются над операндами. В качестве операндов выражения можно использовать переменную, константу, функцию или другое выражение. Основные операторы - *, /, +, -. Соответственно это умножение, деление, сложение, вычитание. Также в написании скриптов вам могут пригодиться операторы – DIV и MOD. Первый используется для деления нацело, а второй для вычисления остатка от деления.
Чтобы в яснее поняли их суть, приведем примеры:
Code: Select all
A := 5 MOD 2;
B := 5 DIV 2;
Заметка. Приоритет операций.
При математических вычислениях в Object Pascal используется следующий приоритет: Вначале вычисляются выражения с операторами * и /, потом + и -. Также для увеличения приоритета операции можно использовать скобки. Допустим, у нас есть выражение c := (7+b)+(a/b)*(a-1);. Паскаль вначале вычислит значение a/b, потом 7+b, далее a-1. После вычисления значения скобок будут выполнены действия * и + вне скобок.
Тип выражения определяется типом операндов, входящих в выражение, и зависит от операций, выполняемых над ними. Например, если оба операнда, над которыми выполняется операция сложения, целые, то очевидно, что результат тоже является целым. А если хотя бы один дробный, то все выражение становится дробным, даже если дробная часть равна 0.
При определении типа выражения следует иметь в виду, что тип константы определяется ее видом, а тип переменной задается в инструкции объявления. Например, константы 5, 7, 9, -60 – целого (integer) типа, а константы 1, 0, 3.5E-05 – вещественного типа (real).
Приведем еще один пример. Переменные I и n имеют тип integer, а переменная d – тип real, тогда инструкции:
Code: Select all
I:=n/10;
I:=1.0;
Code: Select all
D := i+1;
Во время запуска скрипта всегда выполняется проверка типа выражения и переменной. Если они не соответствуют, то Stealth выводит сообщение об ошибке:
Incompatibles types …
В случае ее возникновения необходимо еще раз просмотреть код скрипта на несоотвествие типов.
В случае, когда вам действительно необходимо использовать переменные с разными типами в одном выражении, в Object Pascal существуют встроенные функции преобразования, например, StrToInt(n) – преобразование строкового типа в целое число. Где n – строковая переменная либо константа.