/**
   * 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);
  }
 /**
  * Saves the lost (input) Token and places it back to the board in the first empty position. If no
  * empty position Token is not saved.
  *
  * @param board
  * @param tkn
  * @return
  */
 public boolean saveToken(Board board, MovablePlayerToken tkn) {
   // Check if input Token is indeed killed;
   if (tkn.getCol() >= 0) {
     return false;
   }
   // Move the selected Token into the board (if possible!):
   if (getTurn().side().pname.equals("Fire")) {
     // find the first empty spot:
     for (int k = 0; k < 30; k++) {
       int r = k / 10 + 5;
       int c = k % 10;
       if (board.getToken(r, c) instanceof Grass) {
         this.insertToken2Board(board, tkn, r, c);
         return true;
       }
     }
   }
   return false;
 }
  /**
   * 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;
  }