playerparams.cpp 6.1 KB

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