From dd463ca95a3474926304a2cfa89dc4e08f26e837 Mon Sep 17 00:00:00 2001 From: nordsoft Date: Sun, 16 Oct 2022 03:20:24 +0400 Subject: [PATCH] Add seerhut rewards --- mapeditor/inspector/inspector.cpp | 101 ++++++++++++++++++++++- mapeditor/inspector/inspector.h | 4 +- mapeditor/inspector/rewardswidget.cpp | 110 +++++++++++++++++++++++--- mapeditor/inspector/rewardswidget.h | 28 ++++++- 4 files changed, 224 insertions(+), 19 deletions(-) diff --git a/mapeditor/inspector/inspector.cpp b/mapeditor/inspector/inspector.cpp index 3b13948b4..91bc7cde8 100644 --- a/mapeditor/inspector/inspector.cpp +++ b/mapeditor/inspector/inspector.cpp @@ -39,6 +39,8 @@ Initializer::Initializer(CGObjectInstance * o, const PlayerColor & pl) : default INIT_OBJ_TYPE(CGSignBottle); INIT_OBJ_TYPE(CGLighthouse); //INIT_OBJ_TYPE(CGPandoraBox); + //INIT_OBJ_TYPE(CGEvent); + //INIT_OBJ_TYPE(CGSeerHut); } bool stringToBool(const QString & s) @@ -235,7 +237,7 @@ void Inspector::updateProperties(CGHeroInstance * o) addProperty("Experience", o->exp, false); addProperty("Hero class", o->type->heroClass->getName(), true); - { + { //Sex auto * delegate = new InspectorDelegate; delegate->options << "MALE" << "FEMALE"; addProperty("Sex", (o->sex ? "FEMALE" : "MALE"), delegate , false); @@ -244,7 +246,7 @@ void Inspector::updateProperties(CGHeroInstance * o) addProperty("Biography", o->biography, new MessageDelegate, false); addProperty("Portrait", o->portrait, false); - { + { //Hero type auto * delegate = new InspectorDelegate; for(int i = 0; i < VLC->heroh->objects.size(); ++i) { @@ -320,7 +322,7 @@ void Inspector::updateProperties(CGCreature * o) if(!o) return; addProperty("Message", o->message, false); - { + { //Character auto * delegate = new InspectorDelegate; delegate->options << "COMPLIANT" << "FRIENDLY" << "AGRESSIVE" << "HOSTILE" << "SAVAGE"; addProperty("Character", (CGCreature::Character)o->character, delegate, false); @@ -353,6 +355,23 @@ void Inspector::updateProperties(CGEvent * o) //ui8 availableFor; //players whom this event is available for } +void Inspector::updateProperties(CGSeerHut * o) +{ + if(!o) return; + + { //Mission type + auto * delegate = new InspectorDelegate; + delegate->options << "Reach level" << "Stats" << "Kill hero" << "Kill creature" << "Artifact" << "Army" << "Resources" << "Hero" << "Player"; + addProperty("Mission type", o->quest->missionType, delegate, false); + } + + addProperty("First visit text", o->quest->firstVisitText, new MessageDelegate, false); + addProperty("Next visit text", o->quest->nextVisitText, new MessageDelegate, false); + addProperty("Completed text", o->quest->completedText, new MessageDelegate, false); + + auto * delegate = new RewardsSeerhutDelegate(*map, *o); + addProperty("Reward", PropertyEditorPlaceholder(), delegate, false); +} void Inspector::updateProperties() { @@ -394,6 +413,7 @@ void Inspector::updateProperties() UPDATE_OBJ_PROPERTIES(CGLighthouse); UPDATE_OBJ_PROPERTIES(CGPandoraBox); UPDATE_OBJ_PROPERTIES(CGEvent); + UPDATE_OBJ_PROPERTIES(CGSeerHut); table->show(); } @@ -428,6 +448,7 @@ void Inspector::setProperty(const QString & key, const QVariant & value) SET_PROPERTIES(CGLighthouse); SET_PROPERTIES(CGPandoraBox); SET_PROPERTIES(CGEvent); + SET_PROPERTIES(CGSeerHut); } void Inspector::setProperty(CArmedInstance * o, const QString & key, const QVariant & value) @@ -583,6 +604,40 @@ void Inspector::setProperty(CGCreature * o, const QString & key, const QVariant o->stacks[SlotID(0)]->count = value.toString().toInt(); } +void Inspector::setProperty(CGSeerHut * o, const QString & key, const QVariant & value) +{ + if(!o) return; + + if(key == "Mission type") + { + if(value == "Reach level") + o->quest->missionType = CQuest::Emission::MISSION_LEVEL; + if(value == "Stats") + o->quest->missionType = CQuest::Emission::MISSION_PRIMARY_STAT; + if(value == "Kill hero") + o->quest->missionType = CQuest::Emission::MISSION_KILL_HERO; + if(value == "Kill creature") + o->quest->missionType = CQuest::Emission::MISSION_KILL_CREATURE; + if(value == "Artifact") + o->quest->missionType = CQuest::Emission::MISSION_ART; + if(value == "Army") + o->quest->missionType = CQuest::Emission::MISSION_ARMY; + if(value == "Resources") + o->quest->missionType = CQuest::Emission::MISSION_RESOURCES; + if(value == "Hero") + o->quest->missionType = CQuest::Emission::MISSION_HERO; + if(value == "Player") + o->quest->missionType = CQuest::Emission::MISSION_PLAYER; + } + + if(key == "First visit text") + o->quest->firstVisitText = value.toString().toStdString(); + if(key == "Next visit text") + o->quest->nextVisitText = value.toString().toStdString(); + if(key == "Completed text") + o->quest->completedText = value.toString().toStdString(); +} + //===============IMPLEMENT PROPERTY VALUE TYPE============================ QTableWidgetItem * Inspector::addProperty(CGObjectInstance * value) @@ -693,6 +748,46 @@ QTableWidgetItem * Inspector::addProperty(CGCreature::Character value) return new QTableWidgetItem(str); } +QTableWidgetItem * Inspector::addProperty(CQuest::Emission value) +{ + QString str; + switch (value) { + case CQuest::Emission::MISSION_LEVEL: + str = "Reach level"; + break; + case CQuest::Emission::MISSION_PRIMARY_STAT: + str = "Stats"; + break; + case CQuest::Emission::MISSION_KILL_HERO: + str = "Kill hero"; + break; + case CQuest::Emission::MISSION_KILL_CREATURE: + str = "Kill creature"; + break; + case CQuest::Emission::MISSION_ART: + str = "Artifact"; + break; + case CQuest::Emission::MISSION_ARMY: + str = "Army"; + break; + case CQuest::Emission::MISSION_RESOURCES: + str = "Resources"; + break; + case CQuest::Emission::MISSION_HERO: + str = "Hero"; + break; + case CQuest::Emission::MISSION_PLAYER: + str = "Player"; + break; + case CQuest::Emission::MISSION_KEYMASTER: + str = "Key master"; + break; + default: + break; + } + return new QTableWidgetItem(str); +} + //======================================================================== Inspector::Inspector(CMap * m, CGObjectInstance * o, QTableWidget * t): obj(o), table(t), map(m) diff --git a/mapeditor/inspector/inspector.h b/mapeditor/inspector/inspector.h index b8bce345d..c0f91eca2 100644 --- a/mapeditor/inspector/inspector.h +++ b/mapeditor/inspector/inspector.h @@ -45,7 +45,7 @@ public: DECLARE_OBJ_TYPE(CGLighthouse); //DECLARE_OBJ_TYPE(CGEvent); //DECLARE_OBJ_TYPE(CGPandoraBox); - + //DECLARE_OBJ_TYPE(CGSeerHut); Initializer(CGObjectInstance *, const PlayerColor &); @@ -73,6 +73,7 @@ protected: DECLARE_OBJ_PROPERTY_METHODS(CGLighthouse); DECLARE_OBJ_PROPERTY_METHODS(CGPandoraBox); DECLARE_OBJ_PROPERTY_METHODS(CGEvent); + DECLARE_OBJ_PROPERTY_METHODS(CGSeerHut); //===============DECLARE PROPERTY VALUE TYPE============================== QTableWidgetItem * addProperty(unsigned int value); @@ -85,6 +86,7 @@ protected: QTableWidgetItem * addProperty(bool value); QTableWidgetItem * addProperty(CGObjectInstance * value); QTableWidgetItem * addProperty(CGCreature::Character value); + QTableWidgetItem * addProperty(CQuest::Emission value); QTableWidgetItem * addProperty(PropertyEditorPlaceholder value); //===============END OF DECLARATION======================================= diff --git a/mapeditor/inspector/rewardswidget.cpp b/mapeditor/inspector/rewardswidget.cpp index 5fd0892e9..025251f15 100644 --- a/mapeditor/inspector/rewardswidget.cpp +++ b/mapeditor/inspector/rewardswidget.cpp @@ -28,6 +28,18 @@ RewardsWidget::RewardsWidget(const CMap & m, CGPandoraBox & p, QWidget *parent) ui->rewardType->addItem(QString::fromStdString(type)); } +RewardsWidget::RewardsWidget(const CMap & m, CGSeerHut & p, QWidget *parent) : + QDialog(parent), + map(m), + seerhut(&p), + ui(new Ui::RewardsWidget) +{ + ui->setupUi(this); + + for(auto & type : rewardTypes) + ui->rewardType->addItem(QString::fromStdString(type)); +} + RewardsWidget::~RewardsWidget() { delete ui; @@ -144,6 +156,55 @@ void RewardsWidget::obtainData() addReward(RewardType::CREATURE, c->getId(), pandora->creatures.getStackCount(SlotID(i))); } } + + if(seerhut) + { + switch(seerhut->rewardType) + { + case CGSeerHut::ERewardType::EXPERIENCE: + addReward(RewardType::EXPERIENCE, 0, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::MANA_POINTS: + addReward(RewardType::MANA, 0, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::MORALE_BONUS: + addReward(RewardType::MORALE, 0, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::LUCK_BONUS: + addReward(RewardType::LUCK, 0, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::RESOURCES: + addReward(RewardType::RESOURCE, seerhut->rID, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::PRIMARY_SKILL: + addReward(RewardType::PRIMARY_SKILL, seerhut->rID, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::SECONDARY_SKILL: + addReward(RewardType::SECONDARY_SKILL, seerhut->rID, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::ARTIFACT: + addReward(RewardType::ARTIFACT, seerhut->rID, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::SPELL: + addReward(RewardType::SPELL, seerhut->rID, seerhut->rVal); + break; + + case CGSeerHut::ERewardType::CREATURE: + addReward(RewardType::CREATURE, seerhut->rID, seerhut->rVal); + break; + + default: + break; + } + } } bool RewardsWidget::commitChanges() @@ -212,6 +273,19 @@ bool RewardsWidget::commitChanges() } } } + if(seerhut) + { + for(int row = 0; row < rewards; ++row) + { + haveRewards = true; + int typeId = ui->rewardsTable->item(row, 0)->data(Qt::UserRole).toInt(); + int listId = ui->rewardsTable->item(row, 1) ? ui->rewardsTable->item(row, 1)->data(Qt::UserRole).toInt() : 0; + int amount = ui->rewardsTable->item(row, 2)->data(Qt::UserRole).toInt(); + seerhut->rewardType = CGSeerHut::ERewardType(typeId + 1); + seerhut->rID = listId; + seerhut->rVal = amount; + } + } return haveRewards; } @@ -222,6 +296,10 @@ void RewardsWidget::on_rewardList_activated(int index) void RewardsWidget::addReward(RewardsWidget::RewardType typeId, int listId, int amount) { + //for seerhut there could be the only one reward + if(!pandora && seerhut && rewards) + return; + ui->rewardsTable->setRowCount(++rewards); auto itemType = new QTableWidgetItem(QString::fromStdString(rewardTypes[typeId])); @@ -294,17 +372,7 @@ void RewardsWidget::on_rewardsTable_itemSelectionChanged() ui->rewardAmount->setText(QString::number(type->data(Qt::UserRole).toInt()));*/ } - -RewardsPandoraDelegate::RewardsPandoraDelegate(const CMap & m, CGPandoraBox & t): map(m), pandora(t), QStyledItemDelegate() -{ -} - -QWidget * RewardsPandoraDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - return new RewardsWidget(map, pandora, parent); -} - -void RewardsPandoraDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +void RewardsDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { if(auto * ed = qobject_cast(editor)) { @@ -316,7 +384,7 @@ void RewardsPandoraDelegate::setEditorData(QWidget *editor, const QModelIndex &i } } -void RewardsPandoraDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +void RewardsDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { if(auto * ed = qobject_cast(editor)) { @@ -332,3 +400,21 @@ void RewardsPandoraDelegate::setModelData(QWidget *editor, QAbstractItemModel *m QStyledItemDelegate::setModelData(editor, model, index); } } + +RewardsPandoraDelegate::RewardsPandoraDelegate(const CMap & m, CGPandoraBox & t): map(m), pandora(t), RewardsDelegate() +{ +} + +QWidget * RewardsPandoraDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + return new RewardsWidget(map, pandora, parent); +} + +RewardsSeerhutDelegate::RewardsSeerhutDelegate(const CMap & m, CGSeerHut & t): map(m), seerhut(t), RewardsDelegate() +{ +} + +QWidget * RewardsSeerhutDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + return new RewardsWidget(map, seerhut, parent); +} diff --git a/mapeditor/inspector/rewardswidget.h b/mapeditor/inspector/rewardswidget.h index 522b28a3e..639345c8d 100644 --- a/mapeditor/inspector/rewardswidget.h +++ b/mapeditor/inspector/rewardswidget.h @@ -10,6 +10,7 @@ #pragma once #include #include "../lib/mapObjects/CGPandoraBox.h" +#include "../lib/mapObjects/CQuest.h" #include "../lib/mapping/CMap.h" namespace Ui { @@ -29,6 +30,7 @@ public: }; explicit RewardsWidget(const CMap &, CGPandoraBox &, QWidget *parent = nullptr); + explicit RewardsWidget(const CMap &, CGSeerHut &, QWidget *parent = nullptr); ~RewardsWidget(); void obtainData(); @@ -53,23 +55,43 @@ private: Ui::RewardsWidget *ui; CGPandoraBox * pandora; + CGSeerHut * seerhut; const CMap & map; int rewards = 0; }; -class RewardsPandoraDelegate : public QStyledItemDelegate +class RewardsDelegate : public QStyledItemDelegate { Q_OBJECT public: using QStyledItemDelegate::QStyledItemDelegate; + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; +}; + +class RewardsPandoraDelegate : public RewardsDelegate +{ + Q_OBJECT +public: RewardsPandoraDelegate(const CMap &, CGPandoraBox &); QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - void setEditorData(QWidget *editor, const QModelIndex &index) const override; - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; private: CGPandoraBox & pandora; const CMap & map; }; + +class RewardsSeerhutDelegate : public RewardsDelegate +{ + Q_OBJECT +public: + RewardsSeerhutDelegate(const CMap &, CGSeerHut &); + + QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + +private: + CGSeerHut & seerhut; + const CMap & map; +};