1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

- Fixed mantis #1576 (doesn't hang game)

- Implemented output stream operator<< for various classes(BattleAction, BattleHex,...) to improve debugging and logging
This commit is contained in:
beegee1 2013-11-09 16:25:20 +00:00
parent 55577d0ac4
commit e01ef8e36a
8 changed files with 66 additions and 5 deletions

View File

@ -118,6 +118,7 @@ void CClient::waitForMoveAndSend(PlayerColor color)
setThreadName("CClient::waitForMoveAndSend");
assert(vstd::contains(battleints, color));
BattleAction ba = battleints[color]->activeStack(gs->curB->battleGetStackByID(gs->curB->activeStack, false));
logNetwork->traceStream() << "Send battle action to server: " << ba;
MakeAction temp_action(ba);
sendRequest(&temp_action, color);
return;

View File

@ -118,12 +118,14 @@ CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSe
strongInterest = true;
givenCommand = new CondSh<BattleAction *>(nullptr);
if(attackerInt && attackerInt->cb->battleGetTacticDist()) //hot-seat -> check tactics for both players (defender may be local human)
//hot-seat -> check tactics for both players (defender may be local human)
if(attackerInt && attackerInt->cb->battleGetTacticDist())
tacticianInterface = attackerInt;
else if(defenderInt && defenderInt->cb->battleGetTacticDist())
tacticianInterface = defenderInt;
tacticsMode = static_cast<bool>(tacticianInterface); //if we found interface of player with tactics, then enter tactics mode
//if we found interface of player with tactics, then enter tactics mode
tacticsMode = static_cast<bool>(tacticianInterface);
//create stack queue
bool embedQueue = screen->h < 700;
@ -2848,11 +2850,24 @@ void CBattleInterface::requestAutofightingAIToTakeAction()
boost::thread aiThread([&]
{
auto ba = new BattleAction(curInt->autofightingAI->activeStack(activeStack));
auto ba = new BattleAction(curInt->autofightingAI->activeStack(activeStack));
if(curInt->isAutoFightOn)
{
givenCommand->setn(ba);
if(tacticsMode)
{
// Always end tactics mode. Player interface is blocked currently, so it's not possible that
// the AI can take any action except end tactics phase (AI actions won't be triggered)
//TODO implement the possibility that the AI will be triggered for further actions
//TODO any solution to merge tactics phase & normal phase in the way it is handled by the player and battle interface?
setActiveStack(nullptr);
blockUI(true);
tacticsMode = false;
}
else
{
givenCommand->setn(ba);
}
}
else
{

View File

@ -92,3 +92,12 @@ BattleAction BattleAction::makeEndOFTacticPhase(ui8 side)
ba.actionType = END_TACTIC_PHASE;
return ba;
}
std::ostream & operator<<(std::ostream & os, const BattleAction & ba)
{
std::stringstream actionTypeStream;
actionTypeStream << ba.actionType;
return os << boost::str(boost::format("[BattleAction: side '%d', stackNumber '%d', actionType '%s', destinationTile '%s', additionalInfo '%d', selectedStack '%d']")
% static_cast<int>(ba.side) % ba.stackNumber % actionTypeStream.str() % ba.destinationTile % ba.additionalInfo % ba.selectedStack);
}

View File

@ -40,3 +40,5 @@ struct DLL_LINKAGE BattleAction
static BattleAction makeMove(const CStack *stack, BattleHex dest);
static BattleAction makeEndOFTacticPhase(ui8 side);
};
std::ostream & operator<<(std::ostream & os, const BattleAction & ba);

View File

@ -158,3 +158,8 @@ BattleHex BattleHex::getClosestTile(bool attackerOwned, BattleHex initialPos, st
return sortedTiles.front();
}
std::ostream & operator<<(std::ostream & os, const BattleHex & hex)
{
return os << boost::str(boost::format("[BattleHex: x '%d', y '%d', hex '%d']") % hex.getX() % hex.getY() % hex.hex);
}

View File

@ -112,4 +112,6 @@ struct DLL_LINKAGE BattleHex
bool isAvailable() const; //valid position not in first or last column
static BattleHex getClosestTile(bool attackerOwned, BattleHex initialPos, std::set<BattleHex> & possibilities); //TODO: vector or set? copying one to another is bad
};
};
std::ostream & operator<<(std::ostream & os, const BattleHex & hex);

View File

@ -103,3 +103,28 @@ bool PlayerColor::isValidPlayer() const
{
return num < PLAYER_LIMIT_I;
}
std::ostream & operator<<(std::ostream & os, const Battle::ActionType actionType)
{
static const std::map<Battle::ActionType, std::string> actionTypeToString = boost::assign::map_list_of
(Battle::END_TACTIC_PHASE, "End tactic phase")
(Battle::INVALID, "Invalid")
(Battle::NO_ACTION, "No action")
(Battle::HERO_SPELL, "Hero spell")
(Battle::WALK, "Walk")
(Battle::DEFEND, "Defend")
(Battle::RETREAT, "Retreat")
(Battle::SURRENDER, "Surrender")
(Battle::WALK_AND_ATTACK, "Walk and attack")
(Battle::SHOOT, "Shoot")
(Battle::WAIT, "Wait")
(Battle::CATAPULT, "Catapult")
(Battle::MONSTER_SPELL, "Monster spell")
(Battle::BAD_MORALE, "Bad morale")
(Battle::STACK_HEAL, "Stack heal")
(Battle::DAEMON_SUMMONING, "Daemon summoning");
auto it = actionTypeToString.find(actionType);
if (it == actionTypeToString.end()) return os << "<Unknown type>";
else return os << it->second;
}

View File

@ -682,6 +682,8 @@ namespace Battle
};
}
std::ostream & operator<<(std::ostream & os, const Battle::ActionType actionType);
class ETerrainType
{
public: