mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-19 21:10:12 +02:00
139 lines
3.3 KiB
C++
139 lines
3.3 KiB
C++
/*
|
|
* MiscObjects.cpp, part of VCMI engine
|
|
*
|
|
* Authors: listed in file AUTHORS in main folder
|
|
*
|
|
* License: GNU General Public License v2.0 or later
|
|
* Full text of license available in license.txt file, in main folder
|
|
*
|
|
*/
|
|
|
|
#include "StdInc.h"
|
|
#include "CGResource.h"
|
|
|
|
#include "../mapObjectConstructors/CommonConstructors.h"
|
|
#include "../texts/CGeneralTextHandler.h"
|
|
#include "../networkPacks/PacksForClient.h"
|
|
#include "../networkPacks/PacksForClientBattle.h"
|
|
#include "../IGameCallback.h"
|
|
#include "../gameState/CGameState.h"
|
|
#include "../serializer/JsonSerializeFormat.h"
|
|
#include "../CSoundBase.h"
|
|
|
|
#include <vstd/RNG.h>
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
std::shared_ptr<ResourceInstanceConstructor> CGResource::getResourceHandler() const
|
|
{
|
|
const auto & baseHandler = getObjectHandler();
|
|
const auto & ourHandler = std::dynamic_pointer_cast<ResourceInstanceConstructor>(baseHandler);
|
|
return ourHandler;
|
|
}
|
|
|
|
int CGResource::getAmountMultiplier() const
|
|
{
|
|
return getResourceHandler()->getAmountMultiplier();
|
|
}
|
|
|
|
uint32_t CGResource::getAmount() const
|
|
{
|
|
return amount;
|
|
}
|
|
|
|
GameResID CGResource::resourceID() const
|
|
{
|
|
return getResourceHandler()->getResourceType();
|
|
}
|
|
|
|
std::string CGResource::getHoverText(PlayerColor player) const
|
|
{
|
|
return VLC->generaltexth->restypes[resourceID().getNum()];
|
|
}
|
|
|
|
void CGResource::pickRandomObject(vstd::RNG & rand)
|
|
{
|
|
assert(ID == Obj::RESOURCE || ID == Obj::RANDOM_RESOURCE);
|
|
|
|
if (ID == Obj::RANDOM_RESOURCE)
|
|
{
|
|
ID = Obj::RESOURCE;
|
|
subID = rand.nextInt(EGameResID::WOOD, EGameResID::GOLD);
|
|
setType(ID, subID);
|
|
|
|
amount *= getAmountMultiplier();
|
|
}
|
|
}
|
|
|
|
void CGResource::initObj(vstd::RNG & rand)
|
|
{
|
|
blockVisit = true;
|
|
getResourceHandler()->randomizeObject(this, rand);
|
|
}
|
|
|
|
void CGResource::onHeroVisit( const CGHeroInstance * h ) const
|
|
{
|
|
if(stacksCount())
|
|
{
|
|
if(!message.empty())
|
|
{
|
|
BlockingDialog ynd(true,false);
|
|
ynd.player = h->getOwner();
|
|
ynd.text = message;
|
|
cb->showBlockingDialog(this, &ynd);
|
|
}
|
|
else
|
|
{
|
|
blockingDialogAnswered(h, true); //behave as if player accepted battle
|
|
}
|
|
}
|
|
else
|
|
collectRes(h->getOwner());
|
|
}
|
|
|
|
void CGResource::collectRes(const PlayerColor & player) const
|
|
{
|
|
cb->giveResource(player, resourceID(), amount);
|
|
InfoWindow sii;
|
|
sii.player = player;
|
|
if(!message.empty())
|
|
{
|
|
sii.type = EInfoWindowMode::AUTO;
|
|
sii.text = message;
|
|
}
|
|
else
|
|
{
|
|
sii.type = EInfoWindowMode::INFO;
|
|
sii.text.appendLocalString(EMetaText::ADVOB_TXT,113);
|
|
sii.text.replaceName(resourceID());
|
|
}
|
|
sii.components.emplace_back(ComponentType::RESOURCE, resourceID(), amount);
|
|
sii.soundID = soundBase::pickup01 + cb->gameState()->getRandomGenerator().nextInt(6);
|
|
cb->showInfoDialog(&sii);
|
|
cb->removeObject(this, player);
|
|
}
|
|
|
|
void CGResource::battleFinished(const CGHeroInstance *hero, const BattleResult &result) const
|
|
{
|
|
if(result.winner == BattleSide::ATTACKER) //attacker won
|
|
collectRes(hero->getOwner());
|
|
}
|
|
|
|
void CGResource::blockingDialogAnswered(const CGHeroInstance *hero, int32_t answer) const
|
|
{
|
|
if(answer)
|
|
cb->startBattle(hero, this);
|
|
}
|
|
|
|
void CGResource::serializeJsonOptions(JsonSerializeFormat & handler)
|
|
{
|
|
CArmedInstance::serializeJsonOptions(handler);
|
|
if(!handler.saving && !handler.getCurrent()["guards"].Vector().empty())
|
|
CCreatureSet::serializeJson(handler, "guards", 7);
|
|
handler.serializeInt("amount", amount, 0);
|
|
handler.serializeStruct("guardMessage", message);
|
|
}
|
|
|
|
|
|
VCMI_LIB_NAMESPACE_END
|