/**
   * Implements Speed special movement/attack model.
   *
   * @param board
   * @param mtkn
   * @return
   */
  public List<Vector2D> powerMovementSystemSpeed(Board board, MovablePlayerToken mtkn) {
    List<Vector2D> movements = new ArrayList<Vector2D>();
    List<Vector2D> extraMovements = new ArrayList<Vector2D>();
    // Make consecutive movements:
    int x = mtkn.getCol();
    int y = mtkn.getRow();

    movements.add(new Vector2D(y - 1, x));
    movements.add(new Vector2D(y + 1, x));
    movements.add(new Vector2D(y, x - 1));
    movements.add(new Vector2D(y, x + 1));

    movements = validInBoard(movements);
    movements = validInPlayer(board, movements);

    for (int k = 0; k < movements.size(); k++) {
      if (board.getToken(movements.get(k).y, movements.get(k).x).getOwn()
          != this.getTurn().otherSide()) {
        extraMovements.add(new Vector2D(movements.get(k).y - 1, movements.get(k).x));
        extraMovements.add(new Vector2D(movements.get(k).y + 1, movements.get(k).x));
        extraMovements.add(new Vector2D(movements.get(k).y, movements.get(k).x - 1));
        extraMovements.add(new Vector2D(movements.get(k).y, movements.get(k).x + 1));
      }
    }

    extraMovements = validInBoard(extraMovements);
    extraMovements = validInPlayer(board, extraMovements);

    movements.addAll(extraMovements);

    return movements;
  }
  public void moveToken(Board board, MovablePlayerToken src, Vector2D trgloc) {
    // A move happens only between a movablePlayerToken and Grass token:

    // Swap tokens:
    int tmpc = src.getCol();
    int tmpr = src.getRow();
    // Update position of source token:
    this.insertToken2Board(board, src, trgloc.y, trgloc.x);
    // fill the space with grass:
    this.insertToken2Board(board, StrategoBoard.grassToken, tmpr, tmpc);
  }
  /**
   * Implements Range special attack model.
   *
   * @param board
   * @param mtkn
   * @return
   */
  public List<Vector2D> powerMovementSystemRange(Board board, MovablePlayerToken mtkn) {
    List<Vector2D> movements = new ArrayList<Vector2D>();

    int x = mtkn.getCol();
    int y = mtkn.getRow();

    for (int i = -2; i <= 2; i++) {
      for (int j = -2; j <= 2; j++) {
        movements.add(new Vector2D(y + i, x + j));
      }
    }

    movements = validInBoard(movements);
    movements = validInPlayer(board, movements);

    // Because this system implements ranged attack,
    // valid targets are only enemy tokens:
    movements = validForAttack(board, movements);

    return movements;
  }