mirror of
https://github.com/vcmi/vcmi.git
synced 2025-05-29 22:57:49 +02:00
* fixed bug with levelling up
* fixed pictures of secondary skills in hero window (in left - click popups) * added handling of navigation, logistics, pathfinding, scouting end estates secondary skills
This commit is contained in:
parent
a4afdc7145
commit
ceaa51d07d
@ -319,9 +319,9 @@ void CGameState::applyNL(IPack * pack)
|
|||||||
{
|
{
|
||||||
SetSecSkill *sr = static_cast<SetSecSkill*>(pack);
|
SetSecSkill *sr = static_cast<SetSecSkill*>(pack);
|
||||||
CGHeroInstance *hero = getHero(sr->id);
|
CGHeroInstance *hero = getHero(sr->id);
|
||||||
if(hero->getSecSkillLevel(sr->which) < 0)
|
if(hero->getSecSkillLevel(sr->which) == 0)
|
||||||
{
|
{
|
||||||
hero->secSkills.push_back(std::pair<int,int>(sr->which, (sr->abs)? (sr->val) : (sr->val-1)));
|
hero->secSkills.push_back(std::pair<int,int>(sr->which, sr->val));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -228,7 +228,7 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
|
|||||||
for(int g=0; g<hero->secSkills.size(); ++g)
|
for(int g=0; g<hero->secSkills.size(); ++g)
|
||||||
{
|
{
|
||||||
secSkillAreas[g]->type = hero->secSkills[g].first;
|
secSkillAreas[g]->type = hero->secSkills[g].first;
|
||||||
secSkillAreas[g]->bonus = hero->secSkills[g].second-1;
|
secSkillAreas[g]->bonus = hero->secSkills[g].second;
|
||||||
std::string hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->infoTexts[hero->secSkills[g].second-1];
|
std::string hlp = CGI->abilh->abilities[ hero->secSkills[g].first ]->infoTexts[hero->secSkills[g].second-1];
|
||||||
secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
|
secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
|
||||||
|
|
||||||
@ -305,7 +305,7 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
|
|||||||
dismissButton->block(hero->visitedTown);
|
dismissButton->block(hero->visitedTown);
|
||||||
leftArtRoll->block(hero->artifacts.size()<6);
|
leftArtRoll->block(hero->artifacts.size()<6);
|
||||||
rightArtRoll->block(hero->artifacts.size()<6);
|
rightArtRoll->block(hero->artifacts.size()<6);
|
||||||
if(hero->getSecSkillLevel(19)<0)
|
if(hero->getSecSkillLevel(19)==0)
|
||||||
gar2button->block(true);
|
gar2button->block(true);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -596,8 +596,8 @@ void SComponent::init(Etype Type, int Subtype, int Val)
|
|||||||
subtitle = oss.str();
|
subtitle = oss.str();
|
||||||
break;
|
break;
|
||||||
case secskill44:
|
case secskill44:
|
||||||
subtitle += CGI->abilh->levels[Val] + " " + CGI->abilh->abilities[Subtype]->name;
|
subtitle += CGI->abilh->levels[Val-1] + " " + CGI->abilh->abilities[Subtype]->name;
|
||||||
description = CGI->abilh->abilities[Subtype]->infoTexts[Val];
|
description = CGI->abilh->abilities[Subtype]->infoTexts[Val-1];
|
||||||
break;
|
break;
|
||||||
case resource:
|
case resource:
|
||||||
description = CGI->generaltexth->allTexts[242];
|
description = CGI->generaltexth->allTexts[242];
|
||||||
@ -658,10 +658,10 @@ SDL_Surface * SComponent::getImg()
|
|||||||
return graphics->pskillsb->ourImages[subtype].bitmap;
|
return graphics->pskillsb->ourImages[subtype].bitmap;
|
||||||
break;
|
break;
|
||||||
case secskill44:
|
case secskill44:
|
||||||
return CGI->abilh->abils44->ourImages[subtype*3 + 3 + val].bitmap;
|
return CGI->abilh->abils44->ourImages[subtype*3 + 3 + val - 1].bitmap;
|
||||||
break;
|
break;
|
||||||
case secskill:
|
case secskill:
|
||||||
return CGI->abilh->abils82->ourImages[subtype*3 + 3 + val].bitmap;
|
return CGI->abilh->abils82->ourImages[subtype*3 + 3 + val - 1].bitmap;
|
||||||
break;
|
break;
|
||||||
case resource:
|
case resource:
|
||||||
return graphics->resources->ourImages[subtype].bitmap;
|
return graphics->resources->ourImages[subtype].bitmap;
|
||||||
|
@ -168,6 +168,43 @@ bool CGHeroInstance::isHero() const
|
|||||||
unsigned int CGHeroInstance::getTileCost(const EterrainType & ttype, const Eroad & rdtype, const Eriver & rvtype) const
|
unsigned int CGHeroInstance::getTileCost(const EterrainType & ttype, const Eroad & rdtype, const Eriver & rvtype) const
|
||||||
{
|
{
|
||||||
unsigned int ret = type->heroClass->terrCosts[ttype];
|
unsigned int ret = type->heroClass->terrCosts[ttype];
|
||||||
|
//applying pathfinding skill
|
||||||
|
switch(getSecSkillLevel(0))
|
||||||
|
{
|
||||||
|
case 1: //basic
|
||||||
|
switch(ttype)
|
||||||
|
{
|
||||||
|
case rough:
|
||||||
|
ret = 100;
|
||||||
|
break;
|
||||||
|
case sand: case snow:
|
||||||
|
if(ret>125)
|
||||||
|
ret = 125;
|
||||||
|
break;
|
||||||
|
case swamp:
|
||||||
|
if(ret>150)
|
||||||
|
ret = 150;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: //advanced
|
||||||
|
switch(ttype)
|
||||||
|
{
|
||||||
|
case rough: case sand: case snow:
|
||||||
|
ret = 100;
|
||||||
|
break;
|
||||||
|
case swamp:
|
||||||
|
if(ret>125)
|
||||||
|
ret = 125;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: //expert
|
||||||
|
ret = 100;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//calculating road influence
|
||||||
switch(rdtype)
|
switch(rdtype)
|
||||||
{
|
{
|
||||||
case dirtRoad:
|
case dirtRoad:
|
||||||
@ -213,7 +250,7 @@ int3 CGHeroInstance::getPosition(bool h3m) const //h3m=true - returns position o
|
|||||||
}
|
}
|
||||||
int CGHeroInstance::getSightDistance() const //returns sight distance of this hero
|
int CGHeroInstance::getSightDistance() const //returns sight distance of this hero
|
||||||
{
|
{
|
||||||
return 6;
|
return 6 + getSecSkillLevel(3); //default + scouting
|
||||||
}
|
}
|
||||||
void CGHeroInstance::setPosition(int3 Pos, bool h3m) //as above, but sets position
|
void CGHeroInstance::setPosition(int3 Pos, bool h3m) //as above, but sets position
|
||||||
{
|
{
|
||||||
@ -243,7 +280,7 @@ int CGHeroInstance::getSecSkillLevel(const int & ID) const
|
|||||||
for(int i=0;i<secSkills.size();i++)
|
for(int i=0;i<secSkills.size();i++)
|
||||||
if(secSkills[i].first==ID)
|
if(secSkills[i].first==ID)
|
||||||
return secSkills[i].second;
|
return secSkills[i].second;
|
||||||
return -1;
|
return 0;
|
||||||
}
|
}
|
||||||
ui32 CGHeroInstance::getArtAtPos(ui16 pos) const
|
ui32 CGHeroInstance::getArtAtPos(ui16 pos) const
|
||||||
{
|
{
|
||||||
@ -278,7 +315,7 @@ void CGHeroInstance::setArtAtPos(ui16 pos, int art)
|
|||||||
artifacts.push_back(art);
|
artifacts.push_back(art);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const CArtifact * CGHeroInstance::getArt(int pos)
|
const CArtifact * CGHeroInstance::getArt(int pos) const
|
||||||
{
|
{
|
||||||
int id = getArtAtPos(pos);
|
int id = getArtAtPos(pos);
|
||||||
if(id>=0)
|
if(id>=0)
|
||||||
|
@ -125,10 +125,10 @@ public:
|
|||||||
bool canWalkOnSea() const;
|
bool canWalkOnSea() const;
|
||||||
int getCurrentLuck() const;
|
int getCurrentLuck() const;
|
||||||
int getCurrentMorale() const;
|
int getCurrentMorale() const;
|
||||||
int getSecSkillLevel(const int & ID) const; //-1 - no skill
|
int getSecSkillLevel(const int & ID) const; //0 - no skill
|
||||||
ui32 getArtAtPos(ui16 pos) const; //-1 - no artifact
|
ui32 getArtAtPos(ui16 pos) const; //-1 - no artifact
|
||||||
void setArtAtPos(ui16 pos, int art);
|
void setArtAtPos(ui16 pos, int art);
|
||||||
const CArtifact * getArt(int pos);
|
const CArtifact * getArt(int pos) const;
|
||||||
CGHeroInstance();
|
CGHeroInstance();
|
||||||
virtual ~CGHeroInstance();
|
virtual ~CGHeroInstance();
|
||||||
};
|
};
|
||||||
|
@ -269,8 +269,8 @@ void CGameHandler::startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile
|
|||||||
//tactic round
|
//tactic round
|
||||||
{
|
{
|
||||||
NEW_ROUND;
|
NEW_ROUND;
|
||||||
if( (hero1 && hero1->getSecSkillLevel(19)>=0) ||
|
if( (hero1 && hero1->getSecSkillLevel(19)>0) ||
|
||||||
( hero2 && hero2->getSecSkillLevel(19)>=0) )//someone has tactics
|
( hero2 && hero2->getSecSkillLevel(19)>0) )//someone has tactics
|
||||||
{
|
{
|
||||||
//TODO: tactic round (round -1)
|
//TODO: tactic round (round -1)
|
||||||
}
|
}
|
||||||
@ -1083,12 +1083,45 @@ int lowestSpeed(CGHeroInstance * chi)
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
int valMovePoints(CGHeroInstance * chi)
|
int valMovePoints(CGHeroInstance * chi, bool onLand)
|
||||||
{
|
{
|
||||||
int ret = 1270+70*lowestSpeed(chi);
|
int ret = 1270+70*lowestSpeed(chi);
|
||||||
if (ret>2000)
|
if (ret>2000)
|
||||||
ret=2000;
|
ret=2000;
|
||||||
|
|
||||||
|
if(onLand)
|
||||||
|
{
|
||||||
|
//logistics:
|
||||||
|
switch(chi->getSecSkillLevel(2))
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
ret *= 1.1f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ret *= 1.2f;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ret *= 1.3f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//navigation:
|
||||||
|
switch(chi->getSecSkillLevel(2))
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
ret *= 1.5f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ret *= 2.0f;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
ret *= 2.5f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: additional bonuses (but they aren't currently stored in chi)
|
//TODO: additional bonuses (but they aren't currently stored in chi)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -1111,9 +1144,22 @@ void CGameHandler::newTurn()
|
|||||||
{
|
{
|
||||||
NewTurn::Hero h;
|
NewTurn::Hero h;
|
||||||
h.id = (*i).second.heroes[j]->id;
|
h.id = (*i).second.heroes[j]->id;
|
||||||
h.move = valMovePoints((*i).second.heroes[j]);
|
h.move = valMovePoints((*i).second.heroes[j], true); //TODO: check if hero is really on the land
|
||||||
h.mana = (*i).second.heroes[j]->mana;
|
h.mana = (*i).second.heroes[j]->mana;
|
||||||
n.heroes.insert(h);
|
n.heroes.insert(h);
|
||||||
|
//handle estates
|
||||||
|
switch((*i).second.heroes[j]->getSecSkillLevel(13))
|
||||||
|
{
|
||||||
|
case 1: //basic
|
||||||
|
r.res[6] += 125;
|
||||||
|
break;
|
||||||
|
case 2: //advanced
|
||||||
|
r.res[6] += 250;
|
||||||
|
break;
|
||||||
|
case 3: //expert
|
||||||
|
r.res[6] += 500;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for(std::vector<CGTownInstance *>::iterator j=i->second.towns.begin();j!=i->second.towns.end();j++)//handle towns
|
for(std::vector<CGTownInstance *>::iterator j=i->second.towns.begin();j!=i->second.towns.end();j++)//handle towns
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user