@Override
  protected Message updateStateDelegate(
      final ActorFactionData factionData, final DungeonLevel currentLevel) {
    if (opponent == null) {
      return new Message(Command.REST, null, null, null, null);
    }

    // We have reached an exit
    if (currentLevel.getTileRelative(self.getPosition()).getExit() != null) {
      final Direction exit = currentLevel.getTileRelative(self.getPosition()).getExit();
      final DungeonLevel neighbor = currentLevel.getNeighbor(exit);

      // Make sure there is actually room for another NPC
      if (neighbor.getRandomCoordinate() != null) {
        currentLevel.getNonPlayerCharacters().remove(self);
        neighbor.getNonPlayerCharacters().add(self);
      }

      return new Message(exit.toCommand(), null, null, null, null);
    }

    // Run away from the opponent
    final Coordinate destination = getDestination(currentLevel, opponent);
    final Command direction = getDirection(destination, currentLevel);
    return self.processCommand(currentLevel, direction);
  }