mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Refactoring InfoAboutHero + GetHeroInfo
This commit is contained in:
@@ -216,7 +216,7 @@ void CBattleHero::clickRight(tribool down, bool previousState)
|
||||
if (down && myOwner->myTurn)
|
||||
{
|
||||
if (myHero != nullptr)
|
||||
targetHero.initFromHero(myHero, true);
|
||||
targetHero.initFromHero(myHero, InfoAboutHero::EInfoLevel::INBATTLE);
|
||||
else
|
||||
targetHero = myOwner->enemyHero();
|
||||
|
||||
|
@@ -294,9 +294,9 @@ CHeroTooltip::CHeroTooltip(Point pos, const InfoAboutHero &hero):
|
||||
}
|
||||
|
||||
CHeroTooltip::CHeroTooltip(Point pos, const CGHeroInstance * hero):
|
||||
CArmyTooltip(pos, InfoAboutHero(hero, true))
|
||||
CArmyTooltip(pos, InfoAboutHero(hero, InfoAboutHero::EInfoLevel::DETAILED))
|
||||
{
|
||||
init(InfoAboutHero(hero, true));
|
||||
init(InfoAboutHero(hero, InfoAboutHero::EInfoLevel::DETAILED));
|
||||
}
|
||||
|
||||
void CTownTooltip::init(const InfoAboutTown &town)
|
||||
|
@@ -332,7 +332,8 @@ InfoAboutHero CBattleInfoEssentials::battleGetHeroInfo( ui8 side ) const
|
||||
return InfoAboutHero();
|
||||
}
|
||||
|
||||
return InfoAboutHero(hero, battleDoWeKnowAbout(side));
|
||||
InfoAboutHero::EInfoLevel infoLevel = battleDoWeKnowAbout(side) ? InfoAboutHero::EInfoLevel::DETAILED : InfoAboutHero::EInfoLevel::BASIC;
|
||||
return InfoAboutHero(hero, infoLevel);
|
||||
}
|
||||
|
||||
int CBattleInfoEssentials::battleCastSpells(ui8 side) const
|
||||
@@ -424,6 +425,18 @@ ui8 CBattleInfoEssentials::playerToSide(PlayerColor player) const
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool CBattleInfoEssentials::playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(false);
|
||||
ui8 playerSide = playerToSide(player);
|
||||
if (playerSide >= 0)
|
||||
{
|
||||
if (getBattle()->sides[!playerSide].hero == h)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
ui8 CBattleInfoEssentials::battleGetSiegeLevel() const
|
||||
{
|
||||
RETURN_IF_NOT_BATTLE(0);
|
||||
|
@@ -190,6 +190,7 @@ public:
|
||||
bool battleCanFlee(PlayerColor player) const;
|
||||
bool battleCanSurrender(PlayerColor player) const;
|
||||
ui8 playerToSide(PlayerColor player) const;
|
||||
bool playerHasAccessToHeroInfo(PlayerColor player, const CGHeroInstance * h) const;
|
||||
ui8 battleGetSiegeLevel() const; //returns 0 when there is no siege, 1 if fort, 2 is citadel, 3 is castle
|
||||
bool battleHasHero(ui8 side) const;
|
||||
int battleCastSpells(ui8 side) const; //how many spells has given side cast
|
||||
|
@@ -271,32 +271,31 @@ bool CGameInfoCallback::getHeroInfo(const CGObjectInstance * hero, InfoAboutHero
|
||||
ERROR_RET_VAL_IF(!h, "That's not a hero!", false);
|
||||
ERROR_RET_VAL_IF(!isVisible(h->getPosition(false)), "That hero is not visible!", false);
|
||||
|
||||
bool accessFlag = hasAccess(h->tempOwner);
|
||||
InfoAboutHero::EInfoLevel infoLevel = InfoAboutHero::EInfoLevel::BASIC;
|
||||
|
||||
if (!accessFlag && gs->curB) //if it's battle we can get enemy hero full data
|
||||
if(hasAccess(h->tempOwner))
|
||||
infoLevel = InfoAboutHero::EInfoLevel::DETAILED;
|
||||
|
||||
if ( (infoLevel == InfoAboutHero::EInfoLevel::BASIC) && gs->curB) //if it's battle we can get enemy hero full data
|
||||
{
|
||||
ui8 playerSide = gs->curB->playerToSide(*player);
|
||||
if (playerSide >= 0)
|
||||
{
|
||||
if (gs->curB->sides[!playerSide].hero == h)
|
||||
accessFlag = true;
|
||||
}
|
||||
if(gs->curB->playerHasAccessToHeroInfo(*player, h))
|
||||
infoLevel = InfoAboutHero::EInfoLevel::INBATTLE;
|
||||
}
|
||||
|
||||
if(!accessFlag && nullptr != selectedObject)
|
||||
if( (infoLevel == InfoAboutHero::EInfoLevel::BASIC) && nullptr != selectedObject)
|
||||
{
|
||||
const CGHeroInstance * selectedHero = dynamic_cast<const CGHeroInstance *>(selectedObject);
|
||||
if(nullptr != selectedHero)
|
||||
accessFlag = selectedHero->hasVisions(hero, 1);
|
||||
if(selectedHero->hasVisions(hero, 1))
|
||||
infoLevel = InfoAboutHero::EInfoLevel::DETAILED;
|
||||
}
|
||||
|
||||
dest.initFromHero(h, accessFlag);
|
||||
|
||||
if (accessFlag && !gs->curB)
|
||||
dest.details->manaLimit = -1; //we do not want to leak max mana info outside battle so set to meaningless value
|
||||
dest.initFromHero(h, infoLevel);
|
||||
|
||||
//DISGUISED bonus implementation
|
||||
|
||||
bool disguiseFlag = (infoLevel == InfoAboutHero::EInfoLevel::DETAILED);
|
||||
|
||||
if(getPlayerRelations(getLocalPlayer(), hero->tempOwner) == PlayerRelations::ENEMIES)
|
||||
{
|
||||
//todo: bonus cashing
|
||||
@@ -325,7 +324,7 @@ bool CGameInfoCallback::getHeroInfo(const CGObjectInstance * hero, InfoAboutHero
|
||||
}
|
||||
};
|
||||
|
||||
auto doAdvancedDisguise = [accessFlag, &doBasicDisguise](InfoAboutHero & info)
|
||||
auto doAdvancedDisguise = [disguiseFlag, &doBasicDisguise](InfoAboutHero & info)
|
||||
{
|
||||
doBasicDisguise(info);
|
||||
|
||||
|
@@ -2619,7 +2619,7 @@ void CGameState::obtainPlayersStats(SThievesGuildInfo & tgi, int level)
|
||||
continue;
|
||||
const CGHeroInstance * best = statsHLP::findBestHero(this, g->second.color);
|
||||
InfoAboutHero iah;
|
||||
iah.initFromHero(best, level >= 2);
|
||||
iah.initFromHero(best, (level >= 2) ? InfoAboutHero::EInfoLevel::DETAILED : InfoAboutHero::EInfoLevel::BASIC);
|
||||
iah.army.clear();
|
||||
tgi.colorToBestHero[g->second.color] = iah;
|
||||
}
|
||||
@@ -3007,12 +3007,12 @@ InfoAboutHero::InfoAboutHero(const InfoAboutHero & iah):
|
||||
assign(iah);
|
||||
}
|
||||
|
||||
InfoAboutHero::InfoAboutHero(const CGHeroInstance *h, bool detailed)
|
||||
InfoAboutHero::InfoAboutHero(const CGHeroInstance *h, InfoAboutHero::EInfoLevel infoLevel)
|
||||
: details(nullptr),
|
||||
hclass(nullptr),
|
||||
portrait(-1)
|
||||
{
|
||||
initFromHero(h, detailed);
|
||||
initFromHero(h, infoLevel);
|
||||
}
|
||||
|
||||
InfoAboutHero::~InfoAboutHero()
|
||||
@@ -3026,11 +3026,13 @@ InfoAboutHero & InfoAboutHero::operator=(const InfoAboutHero & iah)
|
||||
return *this;
|
||||
}
|
||||
|
||||
void InfoAboutHero::initFromHero(const CGHeroInstance *h, bool detailed)
|
||||
void InfoAboutHero::initFromHero(const CGHeroInstance *h, InfoAboutHero::EInfoLevel infoLevel)
|
||||
{
|
||||
if(!h)
|
||||
return;
|
||||
|
||||
bool detailed = ( (infoLevel == EInfoLevel::DETAILED) || (infoLevel == EInfoLevel::INBATTLE) );
|
||||
|
||||
initFromArmy(h, detailed);
|
||||
|
||||
hclass = h->type->heroClass;
|
||||
@@ -3044,13 +3046,16 @@ void InfoAboutHero::initFromHero(const CGHeroInstance *h, bool detailed)
|
||||
details->luck = h->LuckVal();
|
||||
details->morale = h->MoraleVal();
|
||||
details->mana = h->mana;
|
||||
details->manaLimit = h->manaLimit();
|
||||
details->primskills.resize(GameConstants::PRIMARY_SKILLS);
|
||||
|
||||
for (int i = 0; i < GameConstants::PRIMARY_SKILLS ; i++)
|
||||
{
|
||||
details->primskills[i] = h->getPrimSkillLevel(static_cast<PrimarySkill::PrimarySkill>(i));
|
||||
}
|
||||
if (infoLevel == EInfoLevel::INBATTLE)
|
||||
details->manaLimit = h->manaLimit();
|
||||
else
|
||||
details->manaLimit = -1; //we do not want to leak max mana info outside battle so set to meaningless value
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -44,6 +44,7 @@ struct DLL_LINKAGE InfoAboutHero : public InfoAboutArmy
|
||||
{
|
||||
private:
|
||||
void assign(const InfoAboutHero & iah);
|
||||
|
||||
public:
|
||||
struct DLL_LINKAGE Details
|
||||
{
|
||||
@@ -54,14 +55,21 @@ public:
|
||||
const CHeroClass *hclass;
|
||||
int portrait;
|
||||
|
||||
enum EInfoLevel
|
||||
{
|
||||
BASIC,
|
||||
DETAILED,
|
||||
INBATTLE
|
||||
};
|
||||
|
||||
InfoAboutHero();
|
||||
InfoAboutHero(const InfoAboutHero & iah);
|
||||
InfoAboutHero(const CGHeroInstance *h, bool detailed);
|
||||
InfoAboutHero(const CGHeroInstance *h, EInfoLevel infoLevel);
|
||||
~InfoAboutHero();
|
||||
|
||||
InfoAboutHero & operator=(const InfoAboutHero & iah);
|
||||
|
||||
void initFromHero(const CGHeroInstance *h, bool detailed);
|
||||
void initFromHero(const CGHeroInstance *h, EInfoLevel infoLevel);
|
||||
};
|
||||
|
||||
/// Struct which holds a int information about a town
|
||||
|
Reference in New Issue
Block a user