1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

some additional descriptions on heroWindow, better functions for hero level <-> exp (to be tested a bit more)

This commit is contained in:
mateuszb 2008-01-27 16:07:27 +00:00
parent 9b805ea1e7
commit 74cce9b7a0
8 changed files with 209 additions and 167 deletions

View File

@ -221,6 +221,11 @@ void CHeroList::hover (bool on)
void CHeroList::keyPressed (SDL_KeyboardEvent & key) void CHeroList::keyPressed (SDL_KeyboardEvent & key)
{ {
} }
void CHeroList::updateHList()
{
items.clear();
genList();
}
void CHeroList::updateMove(const CGHeroInstance* which) //draws move points bar void CHeroList::updateMove(const CGHeroInstance* which) //draws move points bar
{ {
int ser = LOCPLINT->cb->getHeroSerial(which); int ser = LOCPLINT->cb->getHeroSerial(which);

View File

@ -396,6 +396,17 @@ int CCallback::swapCreatures(const CCreatureSet *s1, const CCreatureSet *s2, int
} }
return -1; return -1;
} }
bool CCallback::dismissHero(const CGHeroInstance *hero)
{
CGHeroInstance * Vhero = const_cast<CGHeroInstance *>(hero);
CGI->mh->removeObject(Vhero);
std::vector<CGHeroInstance*>::iterator nitr = find(CGI->state->players[player].heroes.begin(), CGI->state->players[player].heroes.end(), Vhero);
CGI->state->players[player].heroes.erase(nitr);
LOCPLINT->adventureInt->heroList.updateHList();
return false;
}
int CCallback::getMySerial() int CCallback::getMySerial()
{ {
return gs->players[player].serial; return gs->players[player].serial;

View File

@ -35,6 +35,7 @@ public:
virtual int getMySerial()=0; virtual int getMySerial()=0;
virtual int getHeroSerial(const CGHeroInstance * hero)=0; virtual int getHeroSerial(const CGHeroInstance * hero)=0;
virtual int swapCreatures(const CCreatureSet *s1, const CCreatureSet *s2, int p1, int p2)=0;//swaps creatures between two posiibly different garrisons // TODO: AI-unsafe code - fix it! virtual int swapCreatures(const CCreatureSet *s1, const CCreatureSet *s2, int p1, int p2)=0;//swaps creatures between two posiibly different garrisons // TODO: AI-unsafe code - fix it!
virtual bool dismissHero(const CGHeroInstance * hero)=0; //dismisses diven hero; true - successfuly, false - not successfuly
}; };
struct HeroMoveDetails struct HeroMoveDetails
@ -80,6 +81,7 @@ public:
int getHeroSerial(const CGHeroInstance * hero); int getHeroSerial(const CGHeroInstance * hero);
int getMySerial(); int getMySerial();
int swapCreatures(const CCreatureSet *s1, const CCreatureSet *s2, int p1, int p2); int swapCreatures(const CCreatureSet *s1, const CCreatureSet *s2, int p1, int p2);
bool dismissHero(const CGHeroInstance * hero);
//friends //friends
friend int _tmain(int argc, _TCHAR* argv[]); friend int _tmain(int argc, _TCHAR* argv[]);

View File

@ -56,12 +56,27 @@ CHeroWindow::CHeroWindow(int playerColor): artFeet(0), artHead(0), artLHand(0),
skillpics = CGI->spriteh->giveDef("pskil42.def"); skillpics = CGI->spriteh->giveDef("pskil42.def");
flags = CGI->spriteh->giveDef("CREST58.DEF"); flags = CGI->spriteh->giveDef("CREST58.DEF");
//areas //areas
portraitArea = new LClickableAreaWText(); portraitArea = new LRClickableAreaWText();
portraitArea->pos.x = 83; portraitArea->pos.x = 83;
portraitArea->pos.y = 26; portraitArea->pos.y = 26;
portraitArea->pos.w = 58; portraitArea->pos.w = 58;
portraitArea->pos.h = 64; portraitArea->pos.h = 64;
for(int v=0; v<4; ++v)
{
primSkillAreas.push_back(new LRClickableAreaWTextComp());
primSkillAreas[v]->pos.x = 95 + 70*v;
primSkillAreas[v]->pos.y = 111;
primSkillAreas[v]->pos.w = 42;
primSkillAreas[v]->pos.h = 42;
primSkillAreas[v]->text = CGI->generaltexth->arraytxt[2+v].substr(1, CGI->generaltexth->arraytxt[2+v].size()-2);
primSkillAreas[v]->type = v;
primSkillAreas[v]->bonus = -1; // to be initilized when hero is being set
}
expArea = new LRClickableAreaWText();
expArea->pos.x = 83;
expArea->pos.y = 236;
expArea->pos.w = 136;
expArea->pos.h = 42;
} }
CHeroWindow::~CHeroWindow() CHeroWindow::~CHeroWindow()
@ -112,6 +127,11 @@ CHeroWindow::~CHeroWindow()
backpack.clear(); backpack.clear();
delete portraitArea; delete portraitArea;
delete expArea;
for(int v=0; v<primSkillAreas.size(); ++v)
{
delete primSkillAreas[v];
}
} }
void CHeroWindow::show(SDL_Surface *to) void CHeroWindow::show(SDL_Surface *to)
@ -164,6 +184,16 @@ void CHeroWindow::setHero(const CGHeroInstance *hero)
curHero = hero; curHero = hero;
portraitArea->text = hero->biography; portraitArea->text = hero->biography;
for(int g=0; g<primSkillAreas.size(); ++g)
{
primSkillAreas[g]->bonus = hero->primSkills[g];
}
char * th = new char[200];
sprintf(th, CGI->generaltexth->allTexts[2].substr(1, CGI->generaltexth->allTexts[2].size()-2).c_str(), hero->level, CGI->heroh->reqExp(hero->level+1)-hero->exp, hero->exp);
expArea->text = std::string(th);
delete [] th;
delete artFeet; delete artFeet;
delete artHead; delete artHead;
delete artLHand; delete artLHand;
@ -355,6 +385,12 @@ void CHeroWindow::activate()
leftArtRoll->activate(); leftArtRoll->activate();
rightArtRoll->activate(); rightArtRoll->activate();
portraitArea->activate(); portraitArea->activate();
expArea->activate();
for(int v=0; v<primSkillAreas.size(); ++v)
{
primSkillAreas[v]->activate();
}
for(int g=0; g<heroListMi.size(); ++g) for(int g=0; g<heroListMi.size(); ++g)
{ {
heroListMi[g]->activate(); heroListMi[g]->activate();
@ -424,6 +460,12 @@ void CHeroWindow::deactivate()
leftArtRoll->deactivate(); leftArtRoll->deactivate();
rightArtRoll->deactivate(); rightArtRoll->deactivate();
portraitArea->deactivate(); portraitArea->deactivate();
expArea->deactivate();
for(int v=0; v<primSkillAreas.size(); ++v)
{
primSkillAreas[v]->deactivate();
}
for(int g=0; g<heroListMi.size(); ++g) for(int g=0; g<heroListMi.size(); ++g)
{ {
heroListMi[g]->deactivate(); heroListMi[g]->deactivate();
@ -480,6 +522,8 @@ void CHeroWindow::deactivate()
void CHeroWindow::dismissCurrent() void CHeroWindow::dismissCurrent()
{ {
LOCPLINT->cb->dismissHero(curHero);
quit();
} }
void CHeroWindow::questlog() void CHeroWindow::questlog()
@ -749,13 +793,43 @@ void LClickableArea::clickLeft(boost::logic::tribool down)
} }
} }
void LClickableAreaWText::clickLeft(boost::logic::tribool down) void RClickableArea::activate()
{
ClickableR::activate();
}
void RClickableArea::deactivate()
{
ClickableR::deactivate();
}
void RClickableArea::clickRight(boost::logic::tribool down)
{
if(!down)
{
LOCPLINT->showInfoDialog("TEST TEST AAA", std::vector<SComponent*>());
}
}
void LRClickableAreaWText::clickLeft(boost::logic::tribool down)
{ {
if(!down) if(!down)
{ {
LOCPLINT->showInfoDialog(text, std::vector<SComponent*>()); LOCPLINT->showInfoDialog(text, std::vector<SComponent*>());
} }
} }
void LRClickableAreaWText::clickRight(boost::logic::tribool down)
{
LOCPLINT->adventureInt->handleRightClick(text, down, this);
}
void LRClickableAreaWText::activate()
{
LClickableArea::activate();
RClickableArea::activate();
}
void LRClickableAreaWText::deactivate()
{
LClickableArea::deactivate();
RClickableArea::deactivate();
}
void LClickableAreaHero::clickLeft(boost::logic::tribool down) void LClickableAreaHero::clickLeft(boost::logic::tribool down)
{ {
@ -768,3 +842,26 @@ void LClickableAreaHero::clickLeft(boost::logic::tribool down)
owner->activate(); owner->activate();
} }
} }
void LRClickableAreaWTextComp::clickLeft(boost::logic::tribool down)
{
if(!down)
{
LOCPLINT->showInfoDialog(text, std::vector<SComponent*>(1, new SComponent(SComponent::Etype::primskill, type, bonus)));
}
}
void LRClickableAreaWTextComp::clickRight(boost::logic::tribool down)
{
LOCPLINT->adventureInt->handleRightClick(text, down, this);
}
void LRClickableAreaWTextComp::activate()
{
LClickableArea::activate();
RClickableArea::activate();
}
void LRClickableAreaWTextComp::deactivate()
{
LClickableArea::deactivate();
RClickableArea::deactivate();
}

View File

@ -17,6 +17,14 @@ public:
virtual void deactivate(); virtual void deactivate();
}; };
class RClickableArea: public ClickableR
{
public:
virtual void clickRight (tribool down);
virtual void activate();
virtual void deactivate();
};
class LClickableAreaHero : public LClickableArea class LClickableAreaHero : public LClickableArea
{ {
public: public:
@ -25,11 +33,25 @@ public:
virtual void clickLeft (tribool down); virtual void clickLeft (tribool down);
}; };
class LClickableAreaWText: public LClickableArea class LRClickableAreaWText: public virtual LClickableArea, public virtual RClickableArea
{ {
public: public:
std::string text; std::string text;
virtual void activate();
virtual void deactivate();
virtual void clickLeft (tribool down); virtual void clickLeft (tribool down);
virtual void clickRight (tribool down);
};
class LRClickableAreaWTextComp: public virtual LClickableArea, public virtual RClickableArea
{
public:
std::string text;
int bonus, type;
virtual void activate();
virtual void deactivate();
virtual void clickLeft (tribool down);
virtual void clickRight (tribool down);
}; };
class CArtPlace: public ClickableL, public IShowable class CArtPlace: public ClickableL, public IShowable
@ -69,7 +91,9 @@ class CHeroWindow: public IActivable, public IShowable, public virtual CIntObjec
std::vector<CArtPlace *> backpack; //hero's visible backpack (only 5 elements!) std::vector<CArtPlace *> backpack; //hero's visible backpack (only 5 elements!)
int backpackPos; //unmber of first art visible in backpack (in hero's vector) int backpackPos; //unmber of first art visible in backpack (in hero's vector)
//clickable areas //clickable areas
LClickableAreaWText * portraitArea; LRClickableAreaWText * portraitArea;
std::vector<LRClickableAreaWTextComp *> primSkillAreas;
LRClickableAreaWText * expArea;
public: public:
int player; int player;
CHeroWindow(int playerColor); //c-tor CHeroWindow(int playerColor); //c-tor

View File

@ -49,148 +49,6 @@ void CGeneralTextHandler::load()
CGeneralTextHandler::loadToIt(tmp, strin2, itr, 3); CGeneralTextHandler::loadToIt(tmp, strin2, itr, 3);
jktexts.push_back(tmp); jktexts.push_back(tmp);
} }
//std::ofstream ofs("arraytxts.txt");
//for (int i=0;i<arraytxt.size();i++)
// ofs << i <<".\t" << arraytxt[i] << std::endl<< std::endl;
/*loadToIt(cantAddManager, buf, i, 2);
loadToIt(experienceLimitScenarioReached, buf, i, 2);
loadToIt(heroExperienceInfo, buf, i, 2);
loadToIt(perDay, buf, i, 2);
loadToIt(or, buf, i, 2);
loadToIt(somethingVanquished, buf, i, 2);
loadToIt(lastTownLostInfo, buf, i, 2);
loadToIt(heroesAbandonedYou, buf, i, 2);
loadToIt(heroesAbandonedHim, buf, i, 2);
loadToIt(couldNotSaveGame, buf, i, 2);
loadToIt(errorOpeningFile, buf, i, 2);
loadToIt(newgameUppercase, buf, i, 2);
loadToIt(sureToDismissArmy, buf, i, 2);
loadToIt(playersTurn, buf, i, 2);
loadToIt(errorReceivingDataKeepTrying, buf, i, 2);
loadToIt(somethingTheSomething, buf, i, 2);
loadToIt(recruit, buf, i, 2);
loadToIt(noRoomInGarrision, buf, i, 2);
loadToIt(numberOFAdventuringHeroes, buf, i, 2);
loadToIt(heroWithoutCreatures, buf, i, 2);
loadToIt(videoQuality, buf, i, 2);
loadToIt(itemCantBeTraded, buf, i, 2);
loadToIt(sureDismissHero, buf, i, 2);
loadToIt(selectSpellTarget, buf, i, 2);
loadToIt(invalidTeleportDestination, buf, i, 2);
loadToIt(teleportHere, buf, i, 2);
loadToIt(castSomething, buf, i, 2);
loadToIt(castSomethingOnSomething, buf, i, 2);
loadToIt(sureRetreat, buf, i, 2);
loadToIt(notEnoughGold, buf, i, 2);
loadToIt(capturedEnemyArtifact, buf, i, 2);
loadToIt(none, buf, i, 2);
loadToIt(surrenderProposal, buf, i, 2);
loadToIt(highMoraleNextAttack, buf, i, 2);
loadToIt(lowMoraleFreeze, buf, i, 2);
loadToIt(makeRoomInArmyForSomething, buf, i, 2);
loadToIt(attackSomethingSomethingDamage, buf, i, 2);
loadToIt(shootSomethingOneShootLeftSomethingDamage, buf, i, 2);
loadToIt(campaignDescription, buf, i, 2);
loadToIt(somethingIsActive, buf, i, 2);
loadToIt(sessionName, buf, i, 2);
loadToIt(userName, buf, i, 2);
loadToIt(creature, buf, i, 2);
loadToIt(creatures, buf, i, 2);
loadToIt(badLuckOnSomething, buf, i, 2);
loadToIt(goodLuckOnSomething, buf, i, 2);
loadToIt(treasure, buf, i, 2);
loadToIt(somethingSomethingsUnderAttack, buf, i, 2);
loadToIt(town, buf, i, 2);
loadToIt(hero, buf, i, 2);
loadToIt(townScreen, buf, i, 2);
loadToIt(cannotBuildBoat, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(systemUppercase, buf, i, 2);
loadToIt(worldMapHelp, buf, i, 2);
loadToIt(sureEndTurnHeroMayMove, buf, i, 2);
loadToIt(diggingArtifactWholeDay, buf, i, 2);
loadToIt(noRoomForArtifact, buf, i, 2);
loadToIt(heroUncoveredThe, buf, i, 2);
loadToIt(diggingNothing, buf, i, 2);
loadToIt(tryLookingOnLand, buf, i, 2);
loadToIt(unchartedTerritory, buf, i, 2);
loadToIt(month, buf, i, 2);
loadToIt(week, buf, i, 2);
loadToIt(day, buf, i, 2);
loadToIt(enemyViewTip, buf, i, 2);
loadToIt(pingInfo, buf, i, 2);
loadToIt(sureToRestart, buf, i, 2);
loadToIt(sureToStartNewGame, buf, i, 2);
loadToIt(sureQuit, buf, i, 2);
loadToIt(dimensionDoorFiled, buf, i, 2);
loadToIt(chooseBonus, buf, i, 2);
loadToIt(ping, buf, i, 2);
loadToIt(pingSomething, buf, i, 2);
loadToIt(pingEveryone, buf, i, 2);
loadToIt(score, buf, i, 2);
loadToIt(autosaveUppercase, buf, i, 2);
loadToIt(startingHeroB, buf, i, 2);
loadToIt(heroSpecialityB, buf, i, 2);
loadToIt(associatedCreaturesB, buf, i, 2);
loadToIt(townAlignmentB, buf, i, 2);
loadToIt(errorSendingDataKeepTrying, buf, i, 2);
loadToIt(tooFewPalyersForMultiGame, buf, i, 2);
loadToIt(artifactBonusB, buf, i, 2);
loadToIt(goldBonusB, buf, i, 2);
loadToIt(resourceBonusB, buf, i, 2);
loadToIt(randomBonusB, buf, i, 2);
loadToIt(fiveHundredToOneThousand, buf, i, 2);
loadToIt(armageddonDamages, buf, i, 2);
loadToIt(woodOreBonus, buf, i, 2);
loadToIt(randomlyChoosenArtifact, buf, i, 2);
loadToIt(disruptingRayReducesDefence, buf, i, 2);
loadToIt(goldStartingBonus, buf, i, 2);
loadToIt(woodOreStartingBonus, buf, i, 2);
loadToIt(randomStartingBonus, buf, i, 2);
loadToIt(youEliminatedFormGame, buf, i, 2);
loadToIt(scoreToHallOfFame, buf, i, 2);
loadToIt(trySearchingOnClearGround, buf, i, 2);
loadToIt(sendingData, buf, i, 2);
loadToIt(receivingData, buf, i, 2);
loadToIt(chaosMp2, buf, i, 2);
loadToIt(randomHeroB, buf, i, 2);
loadToIt(randomStartingHeroInfo, buf, i, 2);
loadToIt(randomTownB, buf, i, 2);
loadToIt(randomStartingTownInfo, buf, i, 2);
loadToIt(somethingSurrendersInfo, buf, i, 2);
loadToIt(heroesCDNotFound, buf, i, 2);
loadToIt(autosaving, buf, i, 2);
loadToIt(playerexitUppercase, buf, i, 2);
loadToIt(statusWindowTip, buf, i, 2);
loadToIt(border, buf, i, 2);
loadToIt(somethingAbsorbsMana, buf, i, 2);
loadToIt(somethingsAbsorbMana, buf, i, 2);
loadToIt(unableChangeHeroesDirectory, buf, i, 2);
loadToIt(unableFindHeoresDataFiles, buf, i, 2);
loadToIt(victoryAchievementText, buf, i, 2);
loadToIt(somethingsRiseFromDeath, buf, i, 2);
loadToIt(somethingRisesFormDeath, buf, i, 2);
loadToIt(somethingDiesUnderGaze, buf, i, 2);
loadToIt(somethingsDieUnderGaze, buf, i, 2);
loadToIt(somethingTakesDefensiveStance, buf, i, 2);
loadToIt(somethingsTakeDefensiveStance, buf, i, 2);
loadToIt(somethingExp, buf, i, 2);
loadToIt(nearestTownOccupied, buf, i, 2);
loadToIt(noAvailableTown, buf, i, 2);
loadToIt(heroTooTiredSpell, buf, i, 2);
loadToIt(townGateCannotBeUsed, buf, i, 2);
loadToIt(youHaveNoHeroes, buf, i, 2);
loadToIt(heroHasCastSpell, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);
loadToIt(requires, buf, i, 2);*/
} }

View File

@ -134,6 +134,21 @@ void CHeroHandler::loadHeroes()
loadBiographies(); loadBiographies();
loadHeroClasses(); loadHeroClasses();
initHeroClasses(); initHeroClasses();
expPerLevel.push_back(0);
expPerLevel.push_back(1000);
expPerLevel.push_back(2000);
expPerLevel.push_back(3200);
expPerLevel.push_back(4500);
expPerLevel.push_back(6000);
expPerLevel.push_back(7700);
expPerLevel.push_back(9000);
expPerLevel.push_back(11000);
expPerLevel.push_back(13200);
expPerLevel.push_back(15500);
expPerLevel.push_back(18500);
expPerLevel.push_back(22100);
expPerLevel.push_back(26420);
expPerLevel.push_back(31604);
return; return;
} }
@ -453,33 +468,61 @@ unsigned int CHeroInstance::getTileCost(EterrainType & ttype, Eroad & rdtype, Er
unsigned int CHeroHandler::level(unsigned int experience) unsigned int CHeroHandler::level(unsigned int experience)
{ {
if (experience==0) //if (experience==0)
return 0; // return 0;
else if (experience<14700) //level < 10 //else if (experience<14700) //level < 10
//{
// return (-500+20*sqrt((float)experience+1025))/(200);
//}
//else if (experience<24320) //10 - 12
//{
// if (experience>20600)
// return 12;
// else if (experience>17500)
// return 11;
// else return 10;
//}
//else //>12
//{
// int lvl=12;
// int xp = 24320; //xp needed for 13 lvl
// int td = 4464; //diff 14-13
// float mp = 1.2;
// while (experience>xp)
// {
// xp+=td;
// td*=mp;
// lvl++;
// }
// return lvl;
//}
int add=0;
while(experience>=expPerLevel[expPerLevel.size()-1])
{ {
return (-500+20*sqrt((float)experience+1025))/(200); experience/=1.2;
add+1;
} }
else if (experience<24320) //10 - 12 for(int i=expPerLevel.size()-1; i>=0; --i)
{ {
if (experience>20600) if(experience>=expPerLevel[i])
return 12; return i+add;
else if (experience>17500)
return 11;
else return 10;
} }
else //>12 }
unsigned int CHeroHandler::reqExp(unsigned int level)
{
level-=1;
if(level<=expPerLevel.size())
return expPerLevel[level];
else
{ {
int lvl=12; unsigned int exp = expPerLevel[expPerLevel.size()-1];
int xp = 24320; //xp needed for 13 lvl level-=expPerLevel.size();
int td = 4464; //diff 14-13 while(level>0)
float mp = 1.2;
while (experience>xp)
{ {
xp+=td; --level;
td*=mp; exp*=1.2;
lvl++;
} }
return lvl;
} }
} }

View File

@ -92,7 +92,9 @@ public:
CDefHandler * pskillsb, *resources; //82x93 CDefHandler * pskillsb, *resources; //82x93
CDefHandler * un44; //many things CDefHandler * un44; //many things
std::vector<std::string> pskillsn; std::vector<std::string> pskillsn;
std::vector<int> expPerLevel; //expPerLEvel[i] is amount of exp needed to reach level i; if it is not in this vector, multiplicate last value by 1,2 to get next value
unsigned int level(unsigned int experience); unsigned int level(unsigned int experience);
unsigned int reqExp(unsigned int level);
void loadHeroes(); void loadHeroes();
void loadSpecialAbilities(); void loadSpecialAbilities();
void loadBiographies(); void loadBiographies();