mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Bugfixes
This commit is contained in:
parent
bb238f9b72
commit
d2d64dbddd
@ -127,7 +127,7 @@ bool CQuest::checkQuest(const CGHeroInstance * h) const
|
|||||||
|
|
||||||
if(killTarget >= 0)
|
if(killTarget >= 0)
|
||||||
{
|
{
|
||||||
if(!CGHeroInstance::cb->getObjByQuestIdentifier(killTarget))
|
if(CGHeroInstance::cb->getObjByQuestIdentifier(killTarget))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ void CQuest::completeQuest(IGameCallback * cb, const CGHeroInstance *h) const
|
|||||||
cb->giveResources(h->getOwner(), resources);
|
cb->giveResources(h->getOwner(), resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CQuest::addTextReplacements(MetaString & text) const
|
void CQuest::addTextReplacements(MetaString & text, std::vector<Component> & components) const
|
||||||
{
|
{
|
||||||
if(heroLevel > 0)
|
if(heroLevel > 0)
|
||||||
text.replaceNumber(heroLevel);
|
text.replaceNumber(heroLevel);
|
||||||
@ -186,13 +186,13 @@ void CQuest::addTextReplacements(MetaString & text) const
|
|||||||
|
|
||||||
if(killTarget >= 0 && !heroName.empty())
|
if(killTarget >= 0 && !heroName.empty())
|
||||||
{
|
{
|
||||||
//components.emplace_back(Component::EComponentType::HERO_PORTRAIT, heroPortrait, 0, 0);
|
components.emplace_back(Component::EComponentType::HERO_PORTRAIT, heroPortrait, 0, 0);
|
||||||
addKillTargetReplacements(text);
|
addKillTargetReplacements(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(killTarget >= 0 && stackToKill.type)
|
if(killTarget >= 0 && stackToKill.type)
|
||||||
{
|
{
|
||||||
//components.emplace_back(stackToKill);
|
components.emplace_back(stackToKill);
|
||||||
addKillTargetReplacements(text);
|
addKillTargetReplacements(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +250,7 @@ void CQuest::getVisitText(MetaString &iwText, std::vector<Component> &components
|
|||||||
else if(failRequirements)
|
else if(failRequirements)
|
||||||
iwText.appendRawString(nextVisitText.toString());
|
iwText.appendRawString(nextVisitText.toString());
|
||||||
|
|
||||||
addTextReplacements(iwText);
|
addTextReplacements(iwText, components);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CQuest::getRolloverText(MetaString &ms, bool onHover) const
|
void CQuest::getRolloverText(MetaString &ms, bool onHover) const
|
||||||
@ -262,14 +262,16 @@ void CQuest::getRolloverText(MetaString &ms, bool onHover) const
|
|||||||
|
|
||||||
ms.appendRawString(VLC->generaltexth->translate("core.seerhut.quest", questName, questState, textOption));
|
ms.appendRawString(VLC->generaltexth->translate("core.seerhut.quest", questName, questState, textOption));
|
||||||
|
|
||||||
addTextReplacements(ms);
|
std::vector<Component> components;
|
||||||
|
addTextReplacements(ms, components);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CQuest::getCompletionText(MetaString &iwText) const
|
void CQuest::getCompletionText(MetaString &iwText) const
|
||||||
{
|
{
|
||||||
iwText.appendRawString(completedText.toString());
|
iwText.appendRawString(completedText.toString());
|
||||||
|
|
||||||
addTextReplacements(iwText);
|
std::vector<Component> components;
|
||||||
|
addTextReplacements(iwText, components);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CQuest::defineQuestName()
|
void CQuest::defineQuestName()
|
||||||
@ -379,7 +381,7 @@ bool IQuestObject::checkQuest(const CGHeroInstance* h) const
|
|||||||
|
|
||||||
void IQuestObject::getVisitText(MetaString &text, std::vector<Component> &components, bool FirstVisit, const CGHeroInstance * h) const
|
void IQuestObject::getVisitText(MetaString &text, std::vector<Component> &components, bool FirstVisit, const CGHeroInstance * h) const
|
||||||
{
|
{
|
||||||
quest->getVisitText(text,components, FirstVisit, h);
|
quest->getVisitText(text, components, FirstVisit, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IQuestObject::afterAddToMapCommon(CMap * map) const
|
void IQuestObject::afterAddToMapCommon(CMap * map) const
|
||||||
@ -431,9 +433,11 @@ void CGSeerHut::initObj(CRandomGenerator & rand)
|
|||||||
|
|
||||||
quest->defineQuestName();
|
quest->defineQuestName();
|
||||||
|
|
||||||
|
if(quest->empty() && quest->killTarget == -1)
|
||||||
|
quest->progress = CQuest::COMPLETE;
|
||||||
|
|
||||||
if(quest->questName == quest->missionName(0))
|
if(quest->questName == quest->missionName(0))
|
||||||
{
|
{
|
||||||
quest->progress = CQuest::COMPLETE;
|
|
||||||
quest->firstVisitText.appendTextID(TextIdentifier("core", "seehut", "empty", quest->completedOption).get());
|
quest->firstVisitText.appendTextID(TextIdentifier("core", "seehut", "empty", quest->completedOption).get());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -568,7 +572,6 @@ const CGHeroInstance * CGSeerHut::getHeroToKill(bool allowNull) const
|
|||||||
const CGObjectInstance *o = cb->getObjByQuestIdentifier(quest->killTarget);
|
const CGObjectInstance *o = cb->getObjByQuestIdentifier(quest->killTarget);
|
||||||
if(allowNull && !o)
|
if(allowNull && !o)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
assert(o && (o->ID == Obj::HERO || o->ID == Obj::PRISON));
|
|
||||||
return dynamic_cast<const CGHeroInstance *>(o);
|
return dynamic_cast<const CGHeroInstance *>(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -577,7 +580,6 @@ const CGCreature * CGSeerHut::getCreatureToKill(bool allowNull) const
|
|||||||
const CGObjectInstance *o = cb->getObjByQuestIdentifier(quest->killTarget);
|
const CGObjectInstance *o = cb->getObjByQuestIdentifier(quest->killTarget);
|
||||||
if(allowNull && !o)
|
if(allowNull && !o)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
assert(o && o->ID == Obj::MONSTER);
|
|
||||||
return dynamic_cast<const CGCreature *>(o);
|
return dynamic_cast<const CGCreature *>(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,12 +57,12 @@ public:
|
|||||||
CQuest(); //TODO: Remove constructor
|
CQuest(); //TODO: Remove constructor
|
||||||
|
|
||||||
static bool checkMissionArmy(const CQuest * q, const CCreatureSet * army);
|
static bool checkMissionArmy(const CQuest * q, const CCreatureSet * army);
|
||||||
virtual bool checkQuest (const CGHeroInstance * h) const; //determines whether the quest is complete or not
|
virtual bool checkQuest(const CGHeroInstance * h) const; //determines whether the quest is complete or not
|
||||||
virtual void getVisitText (MetaString &text, std::vector<Component> &components, bool FirstVisit, const CGHeroInstance * h = nullptr) const;
|
virtual void getVisitText(MetaString &text, std::vector<Component> & components, bool FirstVisit, const CGHeroInstance * h = nullptr) const;
|
||||||
virtual void getCompletionText(MetaString &text) const;
|
virtual void getCompletionText(MetaString &text) const;
|
||||||
virtual void getRolloverText (MetaString &text, bool onHover) const; //hover or quest log entry
|
virtual void getRolloverText (MetaString &text, bool onHover) const; //hover or quest log entry
|
||||||
virtual void completeQuest(IGameCallback *, const CGHeroInstance * h) const;
|
virtual void completeQuest(IGameCallback *, const CGHeroInstance * h) const;
|
||||||
virtual void addTextReplacements(MetaString &out) const;
|
virtual void addTextReplacements(MetaString &out, std::vector<Component> & components) const;
|
||||||
virtual void addKillTargetReplacements(MetaString &out) const;
|
virtual void addKillTargetReplacements(MetaString &out) const;
|
||||||
void defineQuestName();
|
void defineQuestName();
|
||||||
|
|
||||||
|
@ -35,6 +35,37 @@ Rewardable::Limiter::Limiter()
|
|||||||
|
|
||||||
Rewardable::Limiter::~Limiter() = default;
|
Rewardable::Limiter::~Limiter() = default;
|
||||||
|
|
||||||
|
bool Rewardable::Limiter::empty() const
|
||||||
|
{
|
||||||
|
if(dayOfWeek != 0
|
||||||
|
|| daysPassed != 0
|
||||||
|
|| heroLevel > 0
|
||||||
|
|| heroExperience > 0
|
||||||
|
|| manaPoints > 0
|
||||||
|
|| manaPercentage > 0
|
||||||
|
|| !secondary.empty()
|
||||||
|
|| !creatures.empty()
|
||||||
|
|| !spells.empty()
|
||||||
|
|| !artifacts.empty()
|
||||||
|
|| !players.empty()
|
||||||
|
|| !heroes.empty()
|
||||||
|
|| !heroClasses.empty()
|
||||||
|
|| resources.nonZero()
|
||||||
|
|| std::find_if(primary.begin(), primary.end(), [](si32 i){return i != 0;}) != primary.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for(const auto & sub : {noneOf, allOf, anyOf})
|
||||||
|
{
|
||||||
|
for(const auto & sublimiter : sub)
|
||||||
|
{
|
||||||
|
if(!sublimiter->empty())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Rewardable::Limiter::heroAllowed(const CGHeroInstance * hero) const
|
bool Rewardable::Limiter::heroAllowed(const CGHeroInstance * hero) const
|
||||||
{
|
{
|
||||||
if(dayOfWeek != 0)
|
if(dayOfWeek != 0)
|
||||||
@ -150,14 +181,16 @@ void Rewardable::Limiter::loadComponents(std::vector<Component> & comps,
|
|||||||
const CGHeroInstance * h) const
|
const CGHeroInstance * h) const
|
||||||
{
|
{
|
||||||
if (heroExperience)
|
if (heroExperience)
|
||||||
{
|
|
||||||
comps.emplace_back(Component::EComponentType::EXPERIENCE, 0, static_cast<si32>(h->calculateXp(heroExperience)), 0);
|
comps.emplace_back(Component::EComponentType::EXPERIENCE, 0, static_cast<si32>(h->calculateXp(heroExperience)), 0);
|
||||||
}
|
|
||||||
if (heroLevel)
|
if (heroLevel)
|
||||||
comps.emplace_back(Component::EComponentType::EXPERIENCE, 1, heroLevel, 0);
|
comps.emplace_back(Component::EComponentType::EXPERIENCE, 1, heroLevel, 0);
|
||||||
|
|
||||||
if (manaPoints || manaPercentage > 0)
|
if (manaPoints || manaPercentage > 0)
|
||||||
comps.emplace_back(Component::EComponentType::PRIM_SKILL, 5, 0, 0);
|
{
|
||||||
|
int absoluteMana = h->manaLimit() ? (manaPercentage * h->mana / h->manaLimit() / 100) : 0;
|
||||||
|
comps.emplace_back(Component::EComponentType::PRIM_SKILL, 5, absoluteMana + manaPoints, 0);
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i=0; i<primary.size(); i++)
|
for (size_t i=0; i<primary.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -26,7 +26,6 @@ using LimitersList = std::vector<std::shared_ptr<Rewardable::Limiter>>;
|
|||||||
|
|
||||||
/// Limiters of rewards. Rewards will be granted to hero only if he satisfies requirements
|
/// Limiters of rewards. Rewards will be granted to hero only if he satisfies requirements
|
||||||
/// Note: for this is only a test - it won't remove anything from hero (e.g. artifacts or creatures)
|
/// Note: for this is only a test - it won't remove anything from hero (e.g. artifacts or creatures)
|
||||||
/// NOTE: in future should (partially) replace seer hut/quest guard quests checks
|
|
||||||
struct DLL_LINKAGE Limiter
|
struct DLL_LINKAGE Limiter
|
||||||
{
|
{
|
||||||
/// day of week, unused if 0, 1-7 will test for current day of week
|
/// day of week, unused if 0, 1-7 will test for current day of week
|
||||||
@ -82,6 +81,7 @@ struct DLL_LINKAGE Limiter
|
|||||||
virtual ~Limiter();
|
virtual ~Limiter();
|
||||||
|
|
||||||
bool heroAllowed(const CGHeroInstance * hero) const;
|
bool heroAllowed(const CGHeroInstance * hero) const;
|
||||||
|
bool empty() const;
|
||||||
|
|
||||||
/// Generates list of components that describes reward for a specific hero
|
/// Generates list of components that describes reward for a specific hero
|
||||||
virtual void loadComponents(std::vector<Component> & comps,
|
virtual void loadComponents(std::vector<Component> & comps,
|
||||||
|
@ -519,7 +519,8 @@ void Inspector::setProperty(CGPandoraBox * o, const QString & key, const QVarian
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "Message")
|
if(key == "Message")
|
||||||
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
|
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inspector::setProperty(CGEvent * o, const QString & key, const QVariant & value)
|
void Inspector::setProperty(CGEvent * o, const QString & key, const QVariant & value)
|
||||||
@ -541,7 +542,8 @@ void Inspector::setProperty(CGTownInstance * o, const QString & key, const QVari
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "Town name")
|
if(key == "Town name")
|
||||||
o->setNameTextId(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("town", o->instanceName, "name"), value.toString().toStdString()));
|
o->setNameTextId(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("town", o->instanceName, "name"), value.toString().toStdString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inspector::setProperty(CGSignBottle * o, const QString & key, const QVariant & value)
|
void Inspector::setProperty(CGSignBottle * o, const QString & key, const QVariant & value)
|
||||||
@ -549,7 +551,8 @@ void Inspector::setProperty(CGSignBottle * o, const QString & key, const QVarian
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "Message")
|
if(key == "Message")
|
||||||
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("sign", o->instanceName, "message"), value.toString().toStdString()));
|
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("sign", o->instanceName, "message"), value.toString().toStdString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Inspector::setProperty(CGMine * o, const QString & key, const QVariant & value)
|
void Inspector::setProperty(CGMine * o, const QString & key, const QVariant & value)
|
||||||
@ -565,7 +568,8 @@ void Inspector::setProperty(CGArtifact * o, const QString & key, const QVariant
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "Message")
|
if(key == "Message")
|
||||||
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
|
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("guards", o->instanceName, "message"), value.toString().toStdString()));
|
||||||
|
|
||||||
if(o->storedArtifact && key == "Spell")
|
if(o->storedArtifact && key == "Spell")
|
||||||
{
|
{
|
||||||
@ -604,10 +608,12 @@ void Inspector::setProperty(CGHeroInstance * o, const QString & key, const QVari
|
|||||||
o->gender = EHeroGender(value.toInt());
|
o->gender = EHeroGender(value.toInt());
|
||||||
|
|
||||||
if(key == "Name")
|
if(key == "Name")
|
||||||
o->nameCustomTextId = mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("hero", o->instanceName, "name"), value.toString().toStdString());
|
o->nameCustomTextId = mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("hero", o->instanceName, "name"), value.toString().toStdString());
|
||||||
|
|
||||||
if(key == "Biography")
|
if(key == "Biography")
|
||||||
o->biographyCustomTextId = mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("hero", o->instanceName, "biography"), value.toString().toStdString());
|
o->biographyCustomTextId = mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("hero", o->instanceName, "biography"), value.toString().toStdString());
|
||||||
|
|
||||||
if(key == "Experience")
|
if(key == "Experience")
|
||||||
o->exp = value.toString().toInt();
|
o->exp = value.toString().toInt();
|
||||||
@ -643,7 +649,8 @@ void Inspector::setProperty(CGCreature * o, const QString & key, const QVariant
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "Message")
|
if(key == "Message")
|
||||||
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("monster", o->instanceName, "message"), value.toString().toStdString()));
|
o->message = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("monster", o->instanceName, "message"), value.toString().toStdString()));
|
||||||
if(key == "Character")
|
if(key == "Character")
|
||||||
o->character = CGCreature::Character(value.toInt());
|
o->character = CGCreature::Character(value.toInt());
|
||||||
if(key == "Never flees")
|
if(key == "Never flees")
|
||||||
@ -659,11 +666,16 @@ void Inspector::setProperty(CGSeerHut * o, const QString & key, const QVariant &
|
|||||||
if(!o) return;
|
if(!o) return;
|
||||||
|
|
||||||
if(key == "First visit text")
|
if(key == "First visit text")
|
||||||
o->quest->firstVisitText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("quest", o->instanceName, "firstVisit"), value.toString().toStdString()));
|
o->quest->firstVisitText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("quest", o->instanceName, "firstVisit"), value.toString().toStdString()));
|
||||||
if(key == "Next visit text")
|
if(key == "Next visit text")
|
||||||
o->quest->nextVisitText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("quest", o->instanceName, "nextVisit"), value.toString().toStdString()));
|
o->quest->nextVisitText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("quest", o->instanceName, "nextVisit"), value.toString().toStdString()));
|
||||||
if(key == "Completed text")
|
if(key == "Completed text")
|
||||||
o->quest->completedText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(), TextIdentifier("quest", o->instanceName, "completed"), value.toString().toStdString()));
|
o->quest->completedText = MetaString::createFromTextID(mapRegisterLocalizedString("map", *controller.map(),
|
||||||
|
TextIdentifier("quest", o->instanceName, "completed"), value.toString().toStdString()));
|
||||||
|
if(key == "Repeat quest")
|
||||||
|
o->quest->repeatedQuest = value.toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,9 @@ QuestWidget::QuestWidget(MapController & _controller, CQuest & _sh, QWidget *par
|
|||||||
auto * item = new QTableWidgetItem(QString::fromStdString(GameConstants::RESOURCE_NAMES[i]));
|
auto * item = new QTableWidgetItem(QString::fromStdString(GameConstants::RESOURCE_NAMES[i]));
|
||||||
item->setData(Qt::UserRole, QVariant::fromValue(i));
|
item->setData(Qt::UserRole, QVariant::fromValue(i));
|
||||||
ui->lResources->setItem(i, 0, item);
|
ui->lResources->setItem(i, 0, item);
|
||||||
ui->lResources->setCellWidget(i, 1, new QSpinBox);
|
auto * spinBox = new QSpinBox;
|
||||||
|
spinBox->setMaximum(i == GameResID::GOLD ? 999999 : 999);
|
||||||
|
ui->lResources->setCellWidget(i, 1, spinBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
//fill artifacts
|
//fill artifacts
|
||||||
|
@ -56,7 +56,11 @@ RewardsWidget::RewardsWidget(CMap & m, CRewardableObject & p, QWidget *parent) :
|
|||||||
auto * item = new QTableWidgetItem(QString::fromStdString(GameConstants::RESOURCE_NAMES[i]));
|
auto * item = new QTableWidgetItem(QString::fromStdString(GameConstants::RESOURCE_NAMES[i]));
|
||||||
item->setData(Qt::UserRole, QVariant::fromValue(i));
|
item->setData(Qt::UserRole, QVariant::fromValue(i));
|
||||||
w->setItem(i, 0, item);
|
w->setItem(i, 0, item);
|
||||||
w->setCellWidget(i, 1, new QSpinBox);
|
auto * spinBox = new QSpinBox;
|
||||||
|
spinBox->setMaximum(i == GameResID::GOLD ? 999999 : 999);
|
||||||
|
if(w == ui->rResources)
|
||||||
|
spinBox->setMinimum(i == GameResID::GOLD ? -999999 : -999);
|
||||||
|
w->setCellWidget(i, 1, spinBox);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user