1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-17 01:32:21 +02:00

Add seerhut rewards

This commit is contained in:
nordsoft
2022-10-16 03:20:24 +04:00
parent 36b87689f9
commit dd463ca95a
4 changed files with 224 additions and 19 deletions

View File

@ -39,6 +39,8 @@ Initializer::Initializer(CGObjectInstance * o, const PlayerColor & pl) : default
INIT_OBJ_TYPE(CGSignBottle); INIT_OBJ_TYPE(CGSignBottle);
INIT_OBJ_TYPE(CGLighthouse); INIT_OBJ_TYPE(CGLighthouse);
//INIT_OBJ_TYPE(CGPandoraBox); //INIT_OBJ_TYPE(CGPandoraBox);
//INIT_OBJ_TYPE(CGEvent);
//INIT_OBJ_TYPE(CGSeerHut);
} }
bool stringToBool(const QString & s) bool stringToBool(const QString & s)
@ -235,7 +237,7 @@ void Inspector::updateProperties(CGHeroInstance * o)
addProperty<int>("Experience", o->exp, false); addProperty<int>("Experience", o->exp, false);
addProperty("Hero class", o->type->heroClass->getName(), true); addProperty("Hero class", o->type->heroClass->getName(), true);
{ { //Sex
auto * delegate = new InspectorDelegate; auto * delegate = new InspectorDelegate;
delegate->options << "MALE" << "FEMALE"; delegate->options << "MALE" << "FEMALE";
addProperty<std::string>("Sex", (o->sex ? "FEMALE" : "MALE"), delegate , false); addProperty<std::string>("Sex", (o->sex ? "FEMALE" : "MALE"), delegate , false);
@ -244,7 +246,7 @@ void Inspector::updateProperties(CGHeroInstance * o)
addProperty("Biography", o->biography, new MessageDelegate, false); addProperty("Biography", o->biography, new MessageDelegate, false);
addProperty("Portrait", o->portrait, false); addProperty("Portrait", o->portrait, false);
{ { //Hero type
auto * delegate = new InspectorDelegate; auto * delegate = new InspectorDelegate;
for(int i = 0; i < VLC->heroh->objects.size(); ++i) for(int i = 0; i < VLC->heroh->objects.size(); ++i)
{ {
@ -320,7 +322,7 @@ void Inspector::updateProperties(CGCreature * o)
if(!o) return; if(!o) return;
addProperty("Message", o->message, false); addProperty("Message", o->message, false);
{ { //Character
auto * delegate = new InspectorDelegate; auto * delegate = new InspectorDelegate;
delegate->options << "COMPLIANT" << "FRIENDLY" << "AGRESSIVE" << "HOSTILE" << "SAVAGE"; delegate->options << "COMPLIANT" << "FRIENDLY" << "AGRESSIVE" << "HOSTILE" << "SAVAGE";
addProperty<CGCreature::Character>("Character", (CGCreature::Character)o->character, delegate, false); addProperty<CGCreature::Character>("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 //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<CQuest::Emission>("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() void Inspector::updateProperties()
{ {
@ -394,6 +413,7 @@ void Inspector::updateProperties()
UPDATE_OBJ_PROPERTIES(CGLighthouse); UPDATE_OBJ_PROPERTIES(CGLighthouse);
UPDATE_OBJ_PROPERTIES(CGPandoraBox); UPDATE_OBJ_PROPERTIES(CGPandoraBox);
UPDATE_OBJ_PROPERTIES(CGEvent); UPDATE_OBJ_PROPERTIES(CGEvent);
UPDATE_OBJ_PROPERTIES(CGSeerHut);
table->show(); table->show();
} }
@ -428,6 +448,7 @@ void Inspector::setProperty(const QString & key, const QVariant & value)
SET_PROPERTIES(CGLighthouse); SET_PROPERTIES(CGLighthouse);
SET_PROPERTIES(CGPandoraBox); SET_PROPERTIES(CGPandoraBox);
SET_PROPERTIES(CGEvent); SET_PROPERTIES(CGEvent);
SET_PROPERTIES(CGSeerHut);
} }
void Inspector::setProperty(CArmedInstance * o, const QString & key, const QVariant & value) 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(); 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============================ //===============IMPLEMENT PROPERTY VALUE TYPE============================
QTableWidgetItem * Inspector::addProperty(CGObjectInstance * value) QTableWidgetItem * Inspector::addProperty(CGObjectInstance * value)
@ -693,6 +748,46 @@ QTableWidgetItem * Inspector::addProperty(CGCreature::Character value)
return new QTableWidgetItem(str); 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) Inspector::Inspector(CMap * m, CGObjectInstance * o, QTableWidget * t): obj(o), table(t), map(m)

View File

@ -45,7 +45,7 @@ public:
DECLARE_OBJ_TYPE(CGLighthouse); DECLARE_OBJ_TYPE(CGLighthouse);
//DECLARE_OBJ_TYPE(CGEvent); //DECLARE_OBJ_TYPE(CGEvent);
//DECLARE_OBJ_TYPE(CGPandoraBox); //DECLARE_OBJ_TYPE(CGPandoraBox);
//DECLARE_OBJ_TYPE(CGSeerHut);
Initializer(CGObjectInstance *, const PlayerColor &); Initializer(CGObjectInstance *, const PlayerColor &);
@ -73,6 +73,7 @@ protected:
DECLARE_OBJ_PROPERTY_METHODS(CGLighthouse); DECLARE_OBJ_PROPERTY_METHODS(CGLighthouse);
DECLARE_OBJ_PROPERTY_METHODS(CGPandoraBox); DECLARE_OBJ_PROPERTY_METHODS(CGPandoraBox);
DECLARE_OBJ_PROPERTY_METHODS(CGEvent); DECLARE_OBJ_PROPERTY_METHODS(CGEvent);
DECLARE_OBJ_PROPERTY_METHODS(CGSeerHut);
//===============DECLARE PROPERTY VALUE TYPE============================== //===============DECLARE PROPERTY VALUE TYPE==============================
QTableWidgetItem * addProperty(unsigned int value); QTableWidgetItem * addProperty(unsigned int value);
@ -85,6 +86,7 @@ protected:
QTableWidgetItem * addProperty(bool value); QTableWidgetItem * addProperty(bool value);
QTableWidgetItem * addProperty(CGObjectInstance * value); QTableWidgetItem * addProperty(CGObjectInstance * value);
QTableWidgetItem * addProperty(CGCreature::Character value); QTableWidgetItem * addProperty(CGCreature::Character value);
QTableWidgetItem * addProperty(CQuest::Emission value);
QTableWidgetItem * addProperty(PropertyEditorPlaceholder value); QTableWidgetItem * addProperty(PropertyEditorPlaceholder value);
//===============END OF DECLARATION======================================= //===============END OF DECLARATION=======================================

View File

@ -28,6 +28,18 @@ RewardsWidget::RewardsWidget(const CMap & m, CGPandoraBox & p, QWidget *parent)
ui->rewardType->addItem(QString::fromStdString(type)); 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() RewardsWidget::~RewardsWidget()
{ {
delete ui; delete ui;
@ -144,6 +156,55 @@ void RewardsWidget::obtainData()
addReward(RewardType::CREATURE, c->getId(), pandora->creatures.getStackCount(SlotID(i))); 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() 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; return haveRewards;
} }
@ -222,6 +296,10 @@ void RewardsWidget::on_rewardList_activated(int index)
void RewardsWidget::addReward(RewardsWidget::RewardType typeId, int listId, int amount) 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); ui->rewardsTable->setRowCount(++rewards);
auto itemType = new QTableWidgetItem(QString::fromStdString(rewardTypes[typeId])); 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()));*/ ui->rewardAmount->setText(QString::number(type->data(Qt::UserRole).toInt()));*/
} }
void RewardsDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
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
{ {
if(auto * ed = qobject_cast<RewardsWidget *>(editor)) if(auto * ed = qobject_cast<RewardsWidget *>(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<RewardsWidget *>(editor)) if(auto * ed = qobject_cast<RewardsWidget *>(editor))
{ {
@ -332,3 +400,21 @@ void RewardsPandoraDelegate::setModelData(QWidget *editor, QAbstractItemModel *m
QStyledItemDelegate::setModelData(editor, model, index); 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);
}

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include <QDialog> #include <QDialog>
#include "../lib/mapObjects/CGPandoraBox.h" #include "../lib/mapObjects/CGPandoraBox.h"
#include "../lib/mapObjects/CQuest.h"
#include "../lib/mapping/CMap.h" #include "../lib/mapping/CMap.h"
namespace Ui { namespace Ui {
@ -29,6 +30,7 @@ public:
}; };
explicit RewardsWidget(const CMap &, CGPandoraBox &, QWidget *parent = nullptr); explicit RewardsWidget(const CMap &, CGPandoraBox &, QWidget *parent = nullptr);
explicit RewardsWidget(const CMap &, CGSeerHut &, QWidget *parent = nullptr);
~RewardsWidget(); ~RewardsWidget();
void obtainData(); void obtainData();
@ -53,23 +55,43 @@ private:
Ui::RewardsWidget *ui; Ui::RewardsWidget *ui;
CGPandoraBox * pandora; CGPandoraBox * pandora;
CGSeerHut * seerhut;
const CMap & map; const CMap & map;
int rewards = 0; int rewards = 0;
}; };
class RewardsPandoraDelegate : public QStyledItemDelegate class RewardsDelegate : public QStyledItemDelegate
{ {
Q_OBJECT Q_OBJECT
public: public:
using QStyledItemDelegate::QStyledItemDelegate; 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 &); RewardsPandoraDelegate(const CMap &, CGPandoraBox &);
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 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: private:
CGPandoraBox & pandora; CGPandoraBox & pandora;
const CMap & map; 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;
};