BattleLayout.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * BattleLayout.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 "BattleLayout.h"
  12. #include "../GameSettings.h"
  13. #include "../GameLibrary.h"
  14. #include "../callback/IGameInfoCallback.h"
  15. #include "../mapObjects/army/CArmedInstance.h"
  16. #include "../json/JsonNode.h"
  17. VCMI_LIB_NAMESPACE_BEGIN
  18. BattleLayout BattleLayout::createDefaultLayout(const IGameInfoCallback & gameInfo, const CArmedInstance * attacker, const CArmedInstance * defender)
  19. {
  20. return createLayout(gameInfo, "default", attacker, defender);
  21. }
  22. BattleLayout BattleLayout::createLayout(const IGameInfoCallback & gameInfo, const std::string & layoutName, const CArmedInstance * attacker, const CArmedInstance * defender)
  23. {
  24. const auto & loadHex = [](const JsonNode & node)
  25. {
  26. if (node.isNull())
  27. return BattleHex();
  28. else
  29. return BattleHex(node.Integer());
  30. };
  31. const auto & loadUnits = [](const JsonNode & node)
  32. {
  33. UnitsArrayType::value_type result;
  34. for (size_t i = 0; i < GameConstants::ARMY_SIZE; ++i)
  35. {
  36. if (!node[i].isNull())
  37. result[i] = BattleHex(node[i].Integer());
  38. }
  39. return result;
  40. };
  41. const JsonNode & configRoot = gameInfo.getSettings().getValue(EGameSettings::COMBAT_LAYOUTS);
  42. const JsonNode & config = configRoot[layoutName];
  43. BattleLayout result;
  44. result.commanders[BattleSide::ATTACKER] = loadHex(config["attackerCommander"]);
  45. result.commanders[BattleSide::DEFENDER] = loadHex(config["defenderCommander"]);
  46. for (size_t i = 0; i < 4; ++i)
  47. result.warMachines[BattleSide::ATTACKER][i] = loadHex(config["attackerWarMachines"][i]);
  48. for (size_t i = 0; i < 4; ++i)
  49. result.warMachines[BattleSide::DEFENDER][i] = loadHex(config["defenderWarMachines"][i]);
  50. if (attacker->formation == EArmyFormation::LOOSE && !config["attackerUnitsLoose"].isNull())
  51. result.units[BattleSide::ATTACKER] = loadUnits(config["attackerUnitsLoose"][attacker->stacksCount() - 1]);
  52. else if (attacker->formation == EArmyFormation::TIGHT && !config["attackerUnitsTight"].isNull())
  53. result.units[BattleSide::ATTACKER] = loadUnits(config["attackerUnitsTight"][attacker->stacksCount() - 1]);
  54. else
  55. result.units[BattleSide::ATTACKER] = loadUnits(config["attackerUnits"]);
  56. if (defender->formation == EArmyFormation::LOOSE && !config["defenderUnitsLoose"].isNull())
  57. result.units[BattleSide::DEFENDER] = loadUnits(config["defenderUnitsLoose"][defender->stacksCount() - 1]);
  58. else if (defender->formation == EArmyFormation::TIGHT && !config["defenderUnitsTight"].isNull())
  59. result.units[BattleSide::DEFENDER] = loadUnits(config["defenderUnitsTight"][defender->stacksCount() - 1]);
  60. else
  61. result.units[BattleSide::DEFENDER] = loadUnits(config["defenderUnits"]);
  62. result.obstaclesAllowed = config["obstaclesAllowed"].Bool();
  63. result.tacticsAllowed = config["tacticsAllowed"].Bool();
  64. return result;
  65. }
  66. VCMI_LIB_NAMESPACE_END