mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +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);
|
||||
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
|
||||
{
|
||||
|
@ -228,7 +228,7 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
|
||||
for(int g=0; g<hero->secSkills.size(); ++g)
|
||||
{
|
||||
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];
|
||||
secSkillAreas[g]->text = hlp.substr(1, hlp.size()-2);
|
||||
|
||||
@ -305,7 +305,7 @@ void CHeroWindow::setHero(const CGHeroInstance *Hero)
|
||||
dismissButton->block(hero->visitedTown);
|
||||
leftArtRoll->block(hero->artifacts.size()<6);
|
||||
rightArtRoll->block(hero->artifacts.size()<6);
|
||||
if(hero->getSecSkillLevel(19)<0)
|
||||
if(hero->getSecSkillLevel(19)==0)
|
||||
gar2button->block(true);
|
||||
else
|
||||
{
|
||||
|
@ -596,8 +596,8 @@ void SComponent::init(Etype Type, int Subtype, int Val)
|
||||
subtitle = oss.str();
|
||||
break;
|
||||
case secskill44:
|
||||
subtitle += CGI->abilh->levels[Val] + " " + CGI->abilh->abilities[Subtype]->name;
|
||||
description = CGI->abilh->abilities[Subtype]->infoTexts[Val];
|
||||
subtitle += CGI->abilh->levels[Val-1] + " " + CGI->abilh->abilities[Subtype]->name;
|
||||
description = CGI->abilh->abilities[Subtype]->infoTexts[Val-1];
|
||||
break;
|
||||
case resource:
|
||||
description = CGI->generaltexth->allTexts[242];
|
||||
@ -658,10 +658,10 @@ SDL_Surface * SComponent::getImg()
|
||||
return graphics->pskillsb->ourImages[subtype].bitmap;
|
||||
break;
|
||||
case secskill44:
|
||||
return CGI->abilh->abils44->ourImages[subtype*3 + 3 + val].bitmap;
|
||||
return CGI->abilh->abils44->ourImages[subtype*3 + 3 + val - 1].bitmap;
|
||||
break;
|
||||
case secskill:
|
||||
return CGI->abilh->abils82->ourImages[subtype*3 + 3 + val].bitmap;
|
||||
return CGI->abilh->abils82->ourImages[subtype*3 + 3 + val - 1].bitmap;
|
||||
break;
|
||||
case resource:
|
||||
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 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)
|
||||
{
|
||||
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
|
||||
{
|
||||
return 6;
|
||||
return 6 + getSecSkillLevel(3); //default + scouting
|
||||
}
|
||||
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++)
|
||||
if(secSkills[i].first==ID)
|
||||
return secSkills[i].second;
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
ui32 CGHeroInstance::getArtAtPos(ui16 pos) const
|
||||
{
|
||||
@ -278,7 +315,7 @@ void CGHeroInstance::setArtAtPos(ui16 pos, int art)
|
||||
artifacts.push_back(art);
|
||||
}
|
||||
}
|
||||
const CArtifact * CGHeroInstance::getArt(int pos)
|
||||
const CArtifact * CGHeroInstance::getArt(int pos) const
|
||||
{
|
||||
int id = getArtAtPos(pos);
|
||||
if(id>=0)
|
||||
|
@ -125,10 +125,10 @@ public:
|
||||
bool canWalkOnSea() const;
|
||||
int getCurrentLuck() 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
|
||||
void setArtAtPos(ui16 pos, int art);
|
||||
const CArtifact * getArt(int pos);
|
||||
const CArtifact * getArt(int pos) const;
|
||||
CGHeroInstance();
|
||||
virtual ~CGHeroInstance();
|
||||
};
|
||||
|
@ -269,8 +269,8 @@ void CGameHandler::startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile
|
||||
//tactic round
|
||||
{
|
||||
NEW_ROUND;
|
||||
if( (hero1 && hero1->getSecSkillLevel(19)>=0) ||
|
||||
( hero2 && hero2->getSecSkillLevel(19)>=0) )//someone has tactics
|
||||
if( (hero1 && hero1->getSecSkillLevel(19)>0) ||
|
||||
( hero2 && hero2->getSecSkillLevel(19)>0) )//someone has tactics
|
||||
{
|
||||
//TODO: tactic round (round -1)
|
||||
}
|
||||
@ -1083,12 +1083,45 @@ int lowestSpeed(CGHeroInstance * chi)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int valMovePoints(CGHeroInstance * chi)
|
||||
int valMovePoints(CGHeroInstance * chi, bool onLand)
|
||||
{
|
||||
int ret = 1270+70*lowestSpeed(chi);
|
||||
if (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)
|
||||
|
||||
return ret;
|
||||
@ -1111,9 +1144,22 @@ void CGameHandler::newTurn()
|
||||
{
|
||||
NewTurn::Hero h;
|
||||
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;
|
||||
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
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user