001 package rules;
002 import core.*;
003
004 /**
005 * Go from a piece name to a piece instance.
006 */
007 public class PieceFactory {
008
009 /**
010 * Copy a piece, with a new lastMove.
011 * @requires p != null
012 */
013 public static Piece newPiece(Piece p, int num) {
014 return pieceFromChar(p.toString().charAt(0), num);
015 }
016
017 private static final Piece[] king = {new King(Color.WHITE, 1),
018 new King(Color.BLACK, 1)};
019 private static final Piece[] queen = {new Queen(Color.WHITE, 1),
020 new Queen(Color.BLACK, 1)};
021 private static final Piece[] rook = {new Rook(Color.WHITE, 1),
022 new Rook(Color.BLACK, 1)};
023 private static final Piece[] bishop = {new Bishop(Color.WHITE, 1),
024 new Bishop(Color.BLACK, 1)};
025 private static final Piece[] pawn = {new Pawn(Color.WHITE, 1),
026 new Pawn(Color.BLACK, 1)};
027 private static final Piece[] knight = {new Knight(Color.WHITE, 1),
028 new Knight(Color.BLACK, 1)};
029 private static final Piece[] empty = {new Empty()};
030 private static final Piece[] destroy = {new Destroy()};
031 private static final Piece[] spawn = {new Spawn()};
032 private static final Piece[] upgrade = {new Upgrade()};
033
034 public static Piece newPiece(Piece p) {
035 int index = p.getColor() == Color.BLACK ? 1 : 0; //NONE = 0
036 if (p instanceof King)
037 return king[index];
038 else if (p instanceof Queen)
039 return queen[index];
040 else if (p instanceof Rook)
041 return rook[index];
042 else if (p instanceof Pawn)
043 return pawn[index];
044 else if (p instanceof Knight)
045 return knight[index];
046 else if (p instanceof Bishop)
047 return bishop[index];
048 else if (p instanceof Empty)
049 return empty[index];
050 else if (p instanceof Destroy)
051 return destroy[index];
052 else if (p instanceof Spawn)
053 return spawn[index];
054 else if (p instanceof Upgrade)
055 return upgrade[index];
056 else
057 throw new RuntimeException("Unknown piece " + p);
058 }
059
060
061 /**
062 * Go from a short name to a piece, lowercase = black. Lastmove
063 * is set to 0.
064 */
065 public static Piece pieceFromChar(char s) {
066 return pieceFromChar(s, 0);
067 }
068
069 /**
070 * Go from a short name to a piece, lowercase = black. Lastmove
071 * is specified.
072 */
073 public static Piece pieceFromChar(char s, int num)
074 {
075 Color p;
076 if (Character.isLowerCase(s))
077 p = Color.BLACK;
078 else
079 p = Color.WHITE;
080 switch (Character.toLowerCase(s)) {
081 case ' ':
082 return new Empty();
083 case 'p':
084 return new Pawn(p, num);
085 case 'r':
086 return new Rook(p, num);
087 case 'n':
088 return new Knight(p, num);
089 case 'b':
090 return new Bishop(p, num);
091 case 'k':
092 return new King(p, num);
093 case 'q':
094 return new Queen(p, num);
095 case 'd':
096 return new Destroy();
097 case 's':
098 return new Spawn();
099 case 'u':
100 return new Upgrade();
101 default:
102 throw new RuntimeException("Unknown character: '" + s + "'");
103 }
104 }
105
106
107 /**
108 * Go from a long name to a piece. Lastmove is set to 0.
109 * @requires piece != null && p != null
110 */
111 public static Piece pieceFromString(String piece, Color p) {
112 return pieceFromString(piece, p, 0);
113 }
114
115 /**
116 * Go from a long name to a piece. Lastmove is specified.
117 * @requires piece != null && p != null
118 */
119 public static Piece pieceFromString(String piece, Color p, int num)
120 {
121 if (piece.equals("pawn"))
122 return new Pawn(p, num);
123 if (piece.equals("rook"))
124 return new Rook(p, num);
125 if (piece.equals("knight"))
126 return new Knight(p, num);
127 if (piece.equals("bishop"))
128 return new Bishop(p, num);
129 if (piece.equals("king"))
130 return new King(p, num);
131 if (piece.equals("queen"))
132 return new Queen(p, num);
133 if (piece.equals("powerup_destroy"))
134 return new Destroy();
135 if (piece.equals("powerup_spawn"))
136 return new Spawn();
137 if (piece.equals("powerup_upgrade"))
138 return new Upgrade();
139 throw new RuntimeException("Unknown string: '" + piece + "'");
140 }
141 }