Когда мы писали функцию idle, у нас еще не было состояний, в которые мы могли перевести хоккеиста. Теперь ситуация изменилась, и, поскольку idle является отправной точкой почти для всех состояний, давайте обновим ее.
На изображении ниже вы можете наблюдать переходные состояния, в которые будут попадать игроки из idle:
Если команда спортсмена имеет при себе шайбу, то нужно переходить к атаке. Если же шайба у противников, то нужно переходить к состоянию stealPuck. В случае, когда шайба бесхозная и игрок находиться достаточно близко к ней, он переходит к состоянию pursuePuck. Вот и вся логика. А теперь приведем код:
class Athlete {.
private function idle () :void {.
var aPuck: Puck = getPuck ();
stopAndlookAt (aPuck);
// это простой хак, нужен для тестирования ИИ.
if (mStandStill) return;
// есть ли у шайбы владелец?
if (getPuckOwner () ≠ null) {.
// да, есть!
mBrain.popState ();
if (doesMyTeamHaveThePuck ()) {.
// шайба у моей команды, время атаковать!
mBrain.pushState (attack);
} else {.
// шайба у соперников, надо ее отобрать.
mBrain.pushState (stealPuck); }.
} else if (distance (this, aPuck) < 150) {.
// шайба попросту катится по катку, надо подобрать ее.
mBrain.popState ();
mBrain.pushState (pursuePuck); } }.
private function attack () :void { }.
private function stealPuck () :void { }.
private function pursuePuck () :void { } }.
Как вы могли заметить, методы attack (), stealPuck () и pursuePuck () объявлены, но не реализованы. Давайте реализуем их!