15 * Contains classes for a game of Stratego
20 * Class for a game piece
25 typedef enum {ERROR=14,BOMB=13,MARSHAL=12, GENERAL=11, COLONEL=10, MAJOR=9, CAPTAIN=8, LIEUTENANT=7, SERGEANT=6, MINER=5, SCOUT=4, SPY=3, FLAG=2,BOULDER=1, NOTHING=0} Type; //Type basically defines how strong the piece is
29 typedef enum {RED=0, BLUE=1, NONE=2, BOTH=3} Colour; //Used for the allegiance of the pieces - terrain counts as NONE.
31 static Colour OppositeColour(const Colour & compare);
34 Piece(const Type & newType, const Colour & newColour) : type(newType), colour(newColour), beenRevealed(false) {}
38 //Operators compare the strength of two pieces
39 bool operator==(const Piece & equ) const {return type == equ.type;}
40 bool operator<(const Piece & equ) const {return type < equ.type;}
41 bool operator>(const Piece & equ) const {return type > equ.type;}
43 bool operator!=(const Piece & equ) const {return !operator==(equ);}
44 bool operator<=(const Piece & equ) const {return (operator<(equ) || operator==(equ));}
45 bool operator>=(const Piece & equ) const {return (operator>(equ) || operator==(equ));}
47 //Contains the characters used to identify piece types when the board is printed to a stream
49 static int maxUnits[];
51 static Type GetType(char fromToken);
53 int PieceValue() const {if (type == BOMB || type == FLAG) {return 0;} return (int)(type) - (int)(SPY) + 1;}
55 //Attributes of the piece
64 class TextureManager : public Graphics::TextureManager<LUint>, private Array<Texture*>
67 TextureManager() : Graphics::TextureManager<LUint>(), Array<Texture*>() {}
68 virtual ~TextureManager();
70 virtual Texture & operator[](const LUint & at);
72 static TextureManager textures;
74 static Graphics::Colour GetGraphicsColour(const Piece::Colour & colour)
79 return Graphics::Colour(1.0,0,0);
82 #ifdef __MACOSX__ //Horrible HACK to make pieces green on Mac OSX, because Blue doesn't exist on this operating system.
83 return Graphics::Colour(0,1.0,0);
85 return Graphics::Colour(0,0,1.0);
89 return Graphics::Colour(0.5,0.5,0.5);
92 return Graphics::Colour(1,0,1);
96 #endif //BUILD_GRAPHICS
103 #include "movementresult.h"
111 Board(int newWidth, int newHeight); //Constructor
113 virtual ~Board(); //Destructor
115 void Print(FILE * stream, const Piece::Colour & reveal=Piece::BOTH); //Print board
116 void PrintPretty(FILE * stream, const Piece::Colour & reveal=Piece::BOTH, bool showRevealed=true); //Print board using colour
118 #ifdef BUILD_GRAPHICS
119 void Draw(const Piece::Colour & reveal=Piece::BOTH, bool showRevealed = true); //Draw board
120 #endif //BUILD_GRAPHICS
122 bool AddPiece(int x, int y, const Piece::Type & newType, const Piece::Colour & newColour); //Add piece to board
125 Piece * GetPiece(int x, int y); //Retrieve piece from a location on the board
128 typedef enum {UP, DOWN, LEFT, RIGHT} Direction;
132 static bool LegalResult(const MovementResult & result)
134 return (result == MovementResult::OK || result == MovementResult::DIES || result == MovementResult::KILLS || result == MovementResult::BOTH_DIE || result == MovementResult::VICTORY_FLAG || result == MovementResult::VICTORY_ATTRITION || result == MovementResult::DRAW || result == MovementResult::DRAW_DEFAULT || result == MovementResult::SURRENDER);
137 static bool HaltResult(const MovementResult & result)
139 return (result == MovementResult::VICTORY_FLAG || result == MovementResult::VICTORY_ATTRITION || result == MovementResult::DRAW || result == MovementResult::DRAW_DEFAULT || result == MovementResult::SURRENDER || !LegalResult(result));
142 MovementResult MovePiece(int x, int y, const Direction & direction, int multiplier=1,const Piece::Colour & colour=Piece::NONE); //Move piece from position in direction
145 Piece::Colour winner;
147 int Width() const {return width;}
148 int Height() const {return height;}
150 int MobilePieces(const Piece::Colour & colour) const;
151 int TotalPieceValue(const Piece::Colour & colour) const;
152 bool RemovePiece(Piece * piece);
157 std::vector<Piece*> pieces;