playerparams.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*
  2. * playerparams.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 "playerparams.h"
  12. #include "ui_playerparams.h"
  13. #include "../lib/CTownHandler.h"
  14. #include "../lib/StringConstants.h"
  15. #include "../lib/mapping/CMap.h"
  16. PlayerParams::PlayerParams(MapController & ctrl, int playerId, QWidget *parent) :
  17. QWidget(parent),
  18. ui(new Ui::PlayerParams),
  19. controller(ctrl)
  20. {
  21. ui->setupUi(this);
  22. //set colors and teams
  23. ui->teamId->addItem("No team", QVariant(TeamID::NO_TEAM));
  24. for(int i = 0, index = 0; i < PlayerColor::PLAYER_LIMIT_I; ++i)
  25. {
  26. if(i == playerId || !controller.map()->players[i].canAnyonePlay())
  27. {
  28. ui->playerColorCombo->addItem(QString::fromStdString(GameConstants::PLAYER_COLOR_NAMES[i]), QVariant(i));
  29. if(i == playerId)
  30. ui->playerColorCombo->setCurrentIndex(index);
  31. ++index;
  32. }
  33. //add teams
  34. ui->teamId->addItem(QString::number(i + 1), QVariant(i));
  35. }
  36. playerColor = playerId;
  37. assert(controller.map()->players.size() > playerColor);
  38. playerInfo = controller.map()->players[playerColor];
  39. ui->teamId->setCurrentIndex(playerInfo.team == TeamID::NO_TEAM ? 0 : playerInfo.team.getNum() + 1);
  40. //load factions
  41. for(auto idx : VLC->townh->getAllowedFactions())
  42. {
  43. CFaction * faction = VLC->townh->objects.at(idx);
  44. auto * item = new QListWidgetItem(QString::fromStdString(faction->getNameTranslated()));
  45. item->setData(Qt::UserRole, QVariant::fromValue(idx.getNum()));
  46. item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
  47. ui->allowedFactions->addItem(item);
  48. if(playerInfo.allowedFactions.count(idx))
  49. item->setCheckState(Qt::Checked);
  50. else
  51. item->setCheckState(Qt::Unchecked);
  52. }
  53. QObject::connect(ui->allowedFactions, SIGNAL(itemChanged(QListWidgetItem*)),
  54. this, SLOT(allowedFactionsCheck(QListWidgetItem*)));
  55. //load checks
  56. bool canHumanPlay = playerInfo.canHumanPlay; //need variable to restore after signal received
  57. playerInfo.canComputerPlay = true; //computer always can play
  58. ui->radioCpu->setChecked(true);
  59. if(canHumanPlay)
  60. ui->radioHuman->setChecked(true);
  61. if(playerInfo.isFactionRandom)
  62. ui->randomFaction->setChecked(true);
  63. if(playerInfo.generateHeroAtMainTown)
  64. ui->generateHero->setChecked(true);
  65. //load towns
  66. int foundMainTown = -1;
  67. for(int i = 0, townIndex = 0; i < controller.map()->objects.size(); ++i)
  68. {
  69. if(auto town = dynamic_cast<CGTownInstance*>(controller.map()->objects[i].get()))
  70. {
  71. auto * ctown = town->town;
  72. if(!ctown)
  73. {
  74. ctown = VLC->townh->randomTown;
  75. town->town = ctown;
  76. }
  77. if(ctown && town->getOwner().getNum() == playerColor)
  78. {
  79. if(playerInfo.hasMainTown && playerInfo.posOfMainTown == town->pos)
  80. foundMainTown = townIndex;
  81. const auto name = ctown->faction ? town->getObjectName() : town->getNameTranslated() + ", (random)";
  82. ui->mainTown->addItem(tr(name.c_str()), QVariant::fromValue(i));
  83. ++townIndex;
  84. }
  85. }
  86. }
  87. if(foundMainTown > -1)
  88. {
  89. ui->mainTown->setCurrentIndex(foundMainTown + 1);
  90. }
  91. else
  92. {
  93. ui->generateHero->setEnabled(false);
  94. playerInfo.hasMainTown = false;
  95. playerInfo.generateHeroAtMainTown = false;
  96. playerInfo.posOfMainTown = int3(-1, -1, -1);
  97. }
  98. ui->playerColor->setTitle(tr("Player ID: %1").arg(playerId));
  99. show();
  100. }
  101. PlayerParams::~PlayerParams()
  102. {
  103. delete ui;
  104. }
  105. void PlayerParams::on_radioHuman_toggled(bool checked)
  106. {
  107. if(checked)
  108. playerInfo.canHumanPlay = true;
  109. }
  110. void PlayerParams::on_radioCpu_toggled(bool checked)
  111. {
  112. if(checked)
  113. playerInfo.canHumanPlay = false;
  114. }
  115. void PlayerParams::on_generateHero_stateChanged(int arg1)
  116. {
  117. playerInfo.generateHeroAtMainTown = ui->generateHero->isChecked();
  118. }
  119. void PlayerParams::on_randomFaction_stateChanged(int arg1)
  120. {
  121. playerInfo.isFactionRandom = ui->randomFaction->isChecked();
  122. }
  123. void PlayerParams::allowedFactionsCheck(QListWidgetItem * item)
  124. {
  125. if(item->checkState() == Qt::Checked)
  126. playerInfo.allowedFactions.insert(FactionID(item->data(Qt::UserRole).toInt()));
  127. else
  128. playerInfo.allowedFactions.erase(FactionID(item->data(Qt::UserRole).toInt()));
  129. }
  130. void PlayerParams::on_mainTown_activated(int index)
  131. {
  132. if(index == 0) //default
  133. {
  134. ui->generateHero->setEnabled(false);
  135. ui->generateHero->setChecked(false);
  136. playerInfo.hasMainTown = false;
  137. playerInfo.posOfMainTown = int3(-1, -1, -1);
  138. }
  139. else
  140. {
  141. ui->generateHero->setEnabled(true);
  142. auto town = controller.map()->objects.at(ui->mainTown->currentData().toInt());
  143. playerInfo.hasMainTown = true;
  144. playerInfo.posOfMainTown = town->pos;
  145. }
  146. }
  147. void PlayerParams::on_teamId_activated(int index)
  148. {
  149. playerInfo.team = ui->teamId->currentData().toInt();
  150. }
  151. void PlayerParams::on_playerColorCombo_activated(int index)
  152. {
  153. int data = ui->playerColorCombo->currentData().toInt();
  154. if(data != playerColor)
  155. {
  156. controller.map()->players[playerColor].canHumanPlay = false;
  157. controller.map()->players[playerColor].canComputerPlay = false;
  158. playerColor = data;
  159. }
  160. }