1 #include "controller.h"
9 * Queries the player to setup their pieces
13 MovementResult Controller::Setup(const char * opponentName)
15 string setup[4] = {"","","",""};
16 MovementResult query = this->QuerySetup(opponentName, setup);
17 if (query != MovementResult::OK)
22 int usedUnits[(int)(Piece::BOMB)];
23 for (int ii = 0; ii <= (int)(Piece::BOMB); ++ii)
33 yStart = Game::theGame->theBoard.Height()-4;
36 return MovementResult::COLOUR_ERROR;
41 for (int y = 0; y < 4; ++y)
43 if ((int)setup[y].length() != Game::theGame->theBoard.Width())
44 return MovementResult::BAD_RESPONSE;
46 for (int x = 0; x < Game::theGame->theBoard.Width(); ++x)
48 Piece::Type type = Piece::GetType(setup[y][x]);
49 if (type != Piece::NOTHING)
51 usedUnits[(int)(type)]++;
52 if (usedUnits[type] > Piece::maxUnits[(int)type])
54 //fprintf(stderr, "Too many units of type %c\n", Piece::tokens[(int)(type)]);
55 return MovementResult::BAD_RESPONSE;
57 Game::theGame->theBoard.AddPiece(x, yStart+y, type, colour);
61 if (usedUnits[(int)Piece::FLAG] <= 0)
63 return MovementResult::BAD_RESPONSE; //You need to include a flag!
66 //Added 9/04/12 - Check all pieces that can be placed are placed
67 for (int ii = 0; ii <= (int)(Piece::BOMB); ++ii)
69 if (usedUnits[ii] != Piece::maxUnits[ii])
70 return MovementResult::BAD_RESPONSE; //You must place ALL possible pieces
74 return MovementResult::OK;
80 * Queries the player to respond to a state of Game::theGame->theBoard
81 * @param buffer String which is used to store the player's responses
82 * @returns The result of the response and/or move if made
84 MovementResult Controller::MakeMove(string & buffer)
87 MovementResult query = this->QueryMove(buffer);
88 if (query != MovementResult::OK)
92 //Removed 3/01/12 NO_MOVE now not allowed, SURRENDER is undocumented and not necessary
93 if (buffer == "NO_MOVE")
96 return MovementResult::OK;
99 //Restored SURRENDER 9/04/12, because... it kind of seems necessary?
100 if (buffer == "SURRENDER")
103 return MovementResult::SURRENDER;
108 int x; int y; string direction="";
109 stringstream s(buffer);
118 Board::Direction dir;
119 if (direction == "UP")
123 else if (direction == "DOWN")
127 else if (direction == "LEFT")
131 else if (direction == "RIGHT")
138 if (Game::theGame->allowIllegalMoves)
139 return MovementResult::OK;
141 return MovementResult::BAD_RESPONSE; //Player gave bogus direction - it will lose by default.
147 MovementResult moveResult = Game::theGame->theBoard.MovePiece(x, y, dir, multiplier, colour);
149 s.clear(); s.str("");
151 //I stored the ranks in the wrong order; rank 1 is the marshal, 2 is the general etc...
152 //So I am reversing them in the output... great work
153 s << Piece::tokens[(int)(moveResult.attackerRank)] << " " << Piece::tokens[(int)(moveResult.defenderRank)];
154 switch (moveResult.type)
156 case MovementResult::OK:
159 case MovementResult::VICTORY_FLAG:
160 buffer += " VICTORY_FLAG";
162 case MovementResult::VICTORY_ATTRITION:
163 buffer += " VICTORY_ATTRITION";
165 case MovementResult::KILLS:
170 case MovementResult::DIES:
174 case MovementResult::BOTH_DIE:
175 buffer += " BOTHDIE ";
179 buffer += " ILLEGAL";
185 if (!Board::LegalResult(moveResult))
188 if (Game::theGame->allowIllegalMoves)
191 return MovementResult::OK; //HACK - Illegal results returned as legal! (Move not made)
193 else if (this->HumanController()) //Cut human controllers some slack and let them try again...
195 //Yes, checking type of object is "not the C++ way"
196 // But sometimes its bloody useful to know!!!
197 Message("Bad move: \'" + buffer + "\' <- Please try again!");
199 return this->MakeMove(buffer);
208 * Fixes the name of the controller
209 * Should be called AFTER the constructor, since it modifies the name string, which might be used in the constructor
211 void Controller::FixName()
213 for (unsigned int ii=0; ii < name.size(); ++ii)
217 name.erase(ii); //Just erase everything after the first whitespace
221 //This is kind of hacky; I added it so that I could pass arguments to the AIs
222 //Because simulate.py doesn't like extra arguments showing up in the AI name at the end of the game (its fine until then)
223 //So I'll just remove them, after they have been passed! What could possibly go wrong?
224 // - Last entry in Sam Moore's diary, 2012