CBattleCallback.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * CBattleCallback.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CBattleCallback.h"
  12. #include "CGameInterface.h"
  13. #include "IClient.h"
  14. #include "../UnlockGuard.h"
  15. #include "../battle/CPlayerBattleCallback.h"
  16. #include "../battle/IBattleState.h"
  17. #include "../gameState/CGameState.h"
  18. #include "../networkPacks/PacksForServer.h"
  19. VCMI_LIB_NAMESPACE_BEGIN
  20. CBattleCallback::CBattleCallback(std::optional<PlayerColor> player, IClient * C):
  21. cl(C),
  22. player(player)
  23. {
  24. }
  25. void CBattleCallback::battleMakeUnitAction(const BattleID & battleID, const BattleAction & action)
  26. {
  27. MakeAction ma;
  28. ma.ba = action;
  29. ma.battleID = battleID;
  30. sendRequest(ma);
  31. }
  32. void CBattleCallback::battleMakeTacticAction(const BattleID & battleID, const BattleAction & action )
  33. {
  34. MakeAction ma;
  35. ma.ba = action;
  36. ma.battleID = battleID;
  37. sendRequest(ma);
  38. }
  39. std::optional<BattleAction> CBattleCallback::makeSurrenderRetreatDecision(const BattleID & battleID, const BattleStateInfoForRetreat & battleState)
  40. {
  41. return cl->makeSurrenderRetreatDecision(*getPlayerID(), battleID, battleState);
  42. }
  43. std::shared_ptr<CPlayerBattleCallback> CBattleCallback::getBattle(const BattleID & battleID)
  44. {
  45. if (activeBattles.count(battleID))
  46. return activeBattles.at(battleID);
  47. throw std::runtime_error("Failed to find battle " + std::to_string(battleID.getNum()) + " of player " + player->toString() + ". Number of ongoing battles: " + std::to_string(activeBattles.size()));
  48. }
  49. std::optional<PlayerColor> CBattleCallback::getPlayerID() const
  50. {
  51. return player;
  52. }
  53. void CBattleCallback::onBattleStarted(const IBattleInfo * info)
  54. {
  55. if (activeBattles.count(info->getBattleID()) > 0)
  56. throw std::runtime_error("Player " + player->toString() + " is already engaged in battle " + std::to_string(info->getBattleID().getNum()));
  57. logGlobal->debug("Battle %d started for player %s", info->getBattleID(), player->toString());
  58. activeBattles[info->getBattleID()] = std::make_shared<CPlayerBattleCallback>(info, *getPlayerID());
  59. }
  60. void CBattleCallback::onBattleEnded(const BattleID & battleID)
  61. {
  62. if (activeBattles.count(battleID) == 0)
  63. throw std::runtime_error("Player " + player->toString() + " is not engaged in battle " + std::to_string(battleID.getNum()));
  64. logGlobal->debug("Battle %d ended for player %s", battleID, player->toString());
  65. activeBattles.erase(battleID);
  66. }
  67. void CBattleCallback::battleMakeSpellAction(const BattleID & battleID, const BattleAction & action)
  68. {
  69. assert(action.actionType == EActionType::HERO_SPELL);
  70. MakeAction mca(action);
  71. mca.battleID = battleID;
  72. sendRequest(mca);
  73. }
  74. int CBattleCallback::sendRequest(const CPackForServer & request)
  75. {
  76. return cl->sendRequest(request, *getPlayerID(), waitTillRealize);
  77. }
  78. VCMI_LIB_NAMESPACE_END