8 часть.Едем дальше, мы создадим некоторых базовых врагов для нашей игры, и ИИ который будет управлять ими, чтобы убить нас. Если вы не читали %ссылка на седьмой урок% то советуем вам это сделать. Или %ссылка на первый урок%, если вы совсем новичок.
Создаем врагов!Сейчас мы действительно сделаем врагов! Наконец-то...
Шаг 4.1 Создаем новый код-файл под названием Enemies.dmШаг 4.2 Создадим /Enemies тип и немного вражеских мобов используя следующий код:http://pastebin.com/2bL0EZkQ
Тут мы создали два врага типа /mob/Enemies, Red Guy и Green Guy, нижние подчеркивания будут преобразованы в пробелы внутри игры(в названии, по всей видимости).
Мы установим иконки для этих двух типов, далее настраиваем их базовые характеристики.
Это те же переменные характеристик, что мы создавали для нашего игрока раньше в %ссылка на третью и четвертую часть%.
Как мы говорили ранее, мы используем переменную Exp здесь лишь для того, чтобы показать как много мы его(опыта) получим, убивая их(врагов).
Шаг 4.3 Сейчас, сделаем кое-что для врагов и их ИИ.http://pastebin.com/4x5PMG2ZNew() - процедура которая автоматически вызывается всякий раз, когда что-то создается.
Если объект расположен на карте, это сработает при запуске игры. В противном случае, это случится когда мы создадим объект через код, или загрузим объект из файла.
Вы можете заметить, что мы не выставили HP ля наших врагов, только MaxHP. Вместо того, чтобы писать две строки с одними и теми же значениями для бесчисленных врагов, мы просто установим это значение через процедуру New() для каждого их них.
spawn() - другая встроенная процедура. Она позволяет вам обработать сразу несколько вещей(процедур, и прочего) без ожидания их окончания.
Ставя -1 в качестве аргумента мы заставляем выполнять код в нужном порядке. Это поможет предотвратить рантаймы и проблемы синхронизации.
spawning() нашего ИИ предотвратит остановку всего остального, когда новый врга будет создан, потому как их ИИ будет работать пока они существуют.
Последнее здесь, мы возвращаем ..(), ..() обозначает родительскую процедуру, мы вызываем это, чтобы выполянть какие-либо стандартные действия, такие как установка метсоположения.
Шаг 4.4 Мы почти закончили! Нам просто нужно написать некоторый простой боевой ИИ. Этот код также должен быть в Enemies.dmhttp://pastebin.com/SYkgdpUkПервая строка создает процедуру, эта процедура предназначена только для /mob/Enemies, и называется CombatAI(). Это значит, что Игроки или другие не вражеские NPC не могут этим пользоваться.
while(src) заставляет все, что ниже по табуляции повторяться до тех пор пока src существует.
Первое, что мы делаем в этом цикле, это идем с помощью цикла по каждому мобу типа /Player в oview()(радиусе видимости) врага.
Если мы находим любого /Player, то мы выполянем некоторые действия:
Мы проверяем расстояние до цели используя встроенную процедуру get_dist().
Если цель в одном тайле, то идем далее:
Враг повернется к цели с помощью get_dir()
Ну а Attack verb() мы создали на прошлом уроке.
Если они не оказались рядом игроком: Враг идет к целям используя встроенную процедуру step_to().
step_to() использует встроенный механизм нахождения пути, таким образом враг создает путь преодолевая стены и прочее.
После того как сделали два этих действия, мы используем break, чтобы выйти из цикла for(). Это предотвратит наших врагов от того, чтобы пытаться охотиться сразу на нескольких игроков.
Далее, в самом конце, мы вызываем sleep() используя случайное число от 4 до 8 (тиков).
Заметьте, что sleep() находится под while() по табуляции. Если мы не сделали бы задержку в конце цикла while(), то это просто выполнялось нонстопом(без остановки) и вызывало серьезные лаги/падение игры.
Таким образом вы должны получить базовую систему боя, и вашего игра стала по-настоящему игрой. Враги могут бы помещены на карту тем же путем что и турфы, который мы расставляли в первом уроке.