{name: 'Circular', desc: 'Run forward'},
   {name: 'Clorange', desc: 'A Clockwork Orange', disp: 'Clockwork Orange'},
   {name: 'Convert', desc: 'Convert enemy pieces'},
-//  {name: 'Copycat', desc: 'Borrow powers'},
+  {name: 'Copycat', desc: 'Borrow powers'},
 //  {name: 'Coregal', desc: 'Two royal pieces'},
 //  {name: 'Coronation', desc: 'Long live the Queen'},
   {name: 'Crazyhouse', desc: 'Captures reborn'},
 
--- /dev/null
+import ChessRules from "/base_rules.js";
+
+export default class CopycatRules extends ChessRules {
+
+  static get Options() {
+    return {
+      select: C.Options.select,
+      input: C.Options.input,
+      styles: ["atomic", "capture", "crazyhouse", "cylinder", "dark", "zen"]
+    };
+  }
+
+  getPotentialMovesFrom([x, y], color) {
+    let moves = super.getPotentialMovesFrom([x, y], color);
+    // Expand potential moves if attacking friendly pieces.
+    const piece = this.getPiece(x,y);
+    if (['p', 'k'].includes(piece))
+      return moves;
+    let movements = {};
+    const steps = this.pieces()[piece].both[0].steps;
+    steps.forEach(s => {
+      let [i, j] = [x + s[0], y + s[1]];
+      while (
+        this.onBoard(i, j) &&
+        this.board[i][j] == "" &&
+        piece != 'n'
+      ) {
+        i += s[0];
+        j += s[1];
+      }
+      if (this.onBoard(i, j) && this.getColor(i, j) == this.turn) {
+        const attacked = this.getPiece(i, j);
+        if (['r', 'b', 'n'].includes(attacked)) {
+          if (!movements[attacked])
+            movements[attacked] = true;
+        }
+        else if (attacked == 'q') {
+          if (!movements['r'])
+            movements['r'] = true;
+          if (!movements['b'])
+            movements['b'] = true;
+        }
+      }
+    });
+    Object.keys(movements).forEach(type => {
+      if (
+        (piece != 'q' && type != piece) ||
+        (piece == 'q' && type == 'n')
+      ) {
+        Array.prototype.push.apply(moves,
+          super.getPotentialMovesOf(type, [x, y]));
+      }
+    });
+    return moves;
+  }
+
+  underAttack([x, y], oppCols) {
+    if (super.underAttack([x, y], oppCols)
+      return true;
+    //TODO
+  }
+
+};