Обработчики действий

Самое простое действие – рост, его используют растения. Когда возвращается объект action типа {type: "grow"}, будет вызван следующий метод-обработчик:

actionTypes.grow = function(critter) {

  critter.energy += 0.5;

  return true;

};

Рост всегда успешен и добавляет половину единицы к энергетическому уровню растения.

Движение получается более сложным.

actionTypes.move = function(critter, vector, action) {

  var dest = this.checkDestination(action, vector);

  if (dest == null ||

      critter.energy <= 1 ||

      this.grid.get(dest) != null)

    return false;

  critter.energy -= 1;

  this.grid.set(vector, null);

  this.grid.set(dest, critter);

  return true;

};

Это действие вначале проверяет, используя метод checkDestination, объявленный ранее, предоставляет ли действие допустимое направление. Если нет, или же в том направлении не пустой участок, или же у существа недостаёт энергии – move возвращает false, показывая, что действие не состоялось. В ином случае он двигает существо и вычитает энергию.

Кроме движения, существа могут есть.

actionTypes.eat = function(critter, vector, action) {

  var dest = this.checkDestination(action, vector);

  var atDest = dest != null && this.grid.get(dest);

  if (!atDest || atDest.energy == null)

    return false;

  critter.energy += atDest.energy;

  this.grid.set(dest, null);

  return true;

};

Поедание другого существа также требует предоставления допустимой клетки направления. В этом случае клетка должна содержать что-либо с энергией, например существо (но не стену, их есть нельзя). Если это подтверждается, энергия съеденного переходит к едоку, а жертва удаляется с сетки.

И наконец, мы позволяем существам размножаться.

actionTypes.reproduce = function(critter, vector, action) {

  var baby = elementFromChar(this.legend,

                             critter.originChar);

  var dest = this.checkDestination(action, vector);

  if (dest == null ||

      critter.energy <= 2 * baby.energy ||

      this.grid.get(dest) != null)

    return false;

  critter.energy -= 2 * baby.energy;

  this.grid.set(dest, baby);

  return true;

};

Размножение отнимает в два раза больше энергии, чем есть у новорожденного. Поэтому мы создаём гипотетического отпрыска, используя elementFromChar на оригинальном существе. Как только у нас есть отпрыск, мы можем выяснить его энергетический уровень и проверить, есть ли у родителя достаточно энергии, чтобы родить его. Также нам потребуется допустимая клетка направления.

Если всё в порядке, отпрыск помещается на сетку (и перестаёт быть гипотетическим), а энергия тратится.

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК