questwidget.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * questwidget.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 "questwidget.h"
  12. #include "ui_questwidget.h"
  13. #include "../lib/VCMI_Lib.h"
  14. #include "../lib/CSkillHandler.h"
  15. #include "../lib/CArtHandler.h"
  16. #include "../lib/CCreatureHandler.h"
  17. #include "../lib/CHeroHandler.h"
  18. #include "../lib/StringConstants.h"
  19. #include "../lib/mapping/CMap.h"
  20. QuestWidget::QuestWidget(const CMap & _map, CGSeerHut & _sh, QWidget *parent) :
  21. QDialog(parent),
  22. map(_map),
  23. seerhut(_sh),
  24. ui(new Ui::QuestWidget)
  25. {
  26. ui->setupUi(this);
  27. }
  28. QuestWidget::~QuestWidget()
  29. {
  30. delete ui;
  31. }
  32. void QuestWidget::obtainData()
  33. {
  34. assert(seerhut.quest);
  35. bool activeId = false;
  36. bool activeAmount = false;
  37. switch(seerhut.quest->missionType) {
  38. case CQuest::Emission::MISSION_LEVEL:
  39. activeAmount = true;
  40. ui->targetId->addItem("Reach level");
  41. ui->targetAmount->setText(QString::number(seerhut.quest->m13489val));
  42. break;
  43. case CQuest::Emission::MISSION_PRIMARY_STAT:
  44. activeId = true;
  45. activeAmount = true;
  46. for(auto s : PrimarySkill::names)
  47. ui->targetId->addItem(QString::fromStdString(s));
  48. for(int i = 0; i < seerhut.quest->m2stats.size(); ++i)
  49. {
  50. if(seerhut.quest->m2stats[i] > 0)
  51. {
  52. ui->targetId->setCurrentIndex(i);
  53. ui->targetAmount->setText(QString::number(seerhut.quest->m2stats[i]));
  54. break; //TODO: support multiple stats
  55. }
  56. }
  57. break;
  58. case CQuest::Emission::MISSION_KILL_HERO:
  59. activeId = true;
  60. //TODO: implement
  61. break;
  62. case CQuest::Emission::MISSION_KILL_CREATURE:
  63. activeId = true;
  64. //TODO: implement
  65. break;
  66. case CQuest::Emission::MISSION_ART:
  67. activeId = true;
  68. for(int i = 0; i < map.allowedArtifact.size(); ++i)
  69. ui->targetId->addItem(QString::fromStdString(VLC->arth->objects.at(i)->getNameTranslated()));
  70. if(!seerhut.quest->m5arts.empty())
  71. ui->targetId->setCurrentIndex(seerhut.quest->m5arts.front());
  72. //TODO: support multiple artifacts
  73. break;
  74. case CQuest::Emission::MISSION_ARMY:
  75. activeId = true;
  76. activeAmount = true;
  77. break;
  78. case CQuest::Emission::MISSION_RESOURCES:
  79. activeId = true;
  80. activeAmount = true;
  81. for(auto s : GameConstants::RESOURCE_NAMES)
  82. ui->targetId->addItem(QString::fromStdString(s));
  83. for(int i = 0; i < seerhut.quest->m7resources.size(); ++i)
  84. {
  85. if(seerhut.quest->m7resources[i] > 0)
  86. {
  87. ui->targetId->setCurrentIndex(i);
  88. ui->targetAmount->setText(QString::number(seerhut.quest->m7resources[i]));
  89. break; //TODO: support multiple resources
  90. }
  91. }
  92. break;
  93. case CQuest::Emission::MISSION_HERO:
  94. activeId = true;
  95. for(int i = 0; i < map.allowedHeroes.size(); ++i)
  96. ui->targetId->addItem(QString::fromStdString(VLC->heroh->objects.at(i)->getNameTranslated()));
  97. ui->targetId->setCurrentIndex(seerhut.quest->m13489val);
  98. break;
  99. case CQuest::Emission::MISSION_PLAYER:
  100. activeId = true;
  101. for(auto s : GameConstants::PLAYER_COLOR_NAMES)
  102. ui->targetId->addItem(QString::fromStdString(s));
  103. ui->targetId->setCurrentIndex(seerhut.quest->m13489val);
  104. break;
  105. case CQuest::Emission::MISSION_KEYMASTER:
  106. break;
  107. default:
  108. break;
  109. }
  110. ui->targetId->setEnabled(activeId);
  111. ui->targetAmount->setEnabled(activeAmount);
  112. }
  113. QString QuestWidget::commitChanges()
  114. {
  115. assert(seerhut.quest);
  116. switch(seerhut.quest->missionType) {
  117. case CQuest::Emission::MISSION_LEVEL:
  118. seerhut.quest->m13489val = ui->targetAmount->text().toInt();
  119. return QString("Reach lvl ").append(ui->targetAmount->text());
  120. case CQuest::Emission::MISSION_PRIMARY_STAT:
  121. seerhut.quest->m2stats.resize(sizeof(PrimarySkill::names), 0);
  122. seerhut.quest->m2stats[ui->targetId->currentIndex()] = ui->targetAmount->text().toInt();
  123. //TODO: support multiple stats
  124. return ui->targetId->currentText().append(ui->targetAmount->text());
  125. case CQuest::Emission::MISSION_KILL_HERO:
  126. //TODO: implement
  127. return QString("N/A");
  128. case CQuest::Emission::MISSION_KILL_CREATURE:
  129. //TODO: implement
  130. return QString("N/A");
  131. case CQuest::Emission::MISSION_ART:
  132. seerhut.quest->m5arts.clear();
  133. seerhut.quest->m5arts.push_back(ArtifactID(ui->targetId->currentIndex()));
  134. //TODO: support multiple artifacts
  135. return ui->targetId->currentText();
  136. case CQuest::Emission::MISSION_ARMY:
  137. //TODO: implement
  138. return QString("N/A");
  139. case CQuest::Emission::MISSION_RESOURCES:
  140. seerhut.quest->m7resources[ui->targetId->currentIndex()] = ui->targetAmount->text().toInt();
  141. //TODO: support resources
  142. return ui->targetId->currentText().append(ui->targetAmount->text());
  143. case CQuest::Emission::MISSION_HERO:
  144. seerhut.quest->m13489val = ui->targetId->currentIndex();
  145. return ui->targetId->currentText();
  146. case CQuest::Emission::MISSION_PLAYER:
  147. seerhut.quest->m13489val = ui->targetId->currentIndex();
  148. return ui->targetId->currentText();
  149. case CQuest::Emission::MISSION_KEYMASTER:
  150. return QString("N/A");
  151. default:
  152. return QString("N/A");
  153. }
  154. }
  155. QuestDelegate::QuestDelegate(const CMap & m, CGSeerHut & t): map(m), seerhut(t), QStyledItemDelegate()
  156. {
  157. }
  158. QWidget * QuestDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
  159. {
  160. return new QuestWidget(map, seerhut, parent);
  161. }
  162. void QuestDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const
  163. {
  164. if(auto *ed = qobject_cast<QuestWidget *>(editor))
  165. {
  166. ed->obtainData();
  167. }
  168. else
  169. {
  170. QStyledItemDelegate::setEditorData(editor, index);
  171. }
  172. }
  173. void QuestDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
  174. {
  175. if(auto *ed = qobject_cast<QuestWidget *>(editor))
  176. {
  177. auto quest = ed->commitChanges();
  178. model->setData(index, quest);
  179. }
  180. else
  181. {
  182. QStyledItemDelegate::setModelData(editor, model, index);
  183. }
  184. }