mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-03 13:01:33 +02:00
- implemented scholar skill
- fixed some remaining building issues (#361) - Portal of Summoning will now be present in fort window - some fixes for Thieves Guild window (partial #386)
This commit is contained in:
parent
e507f8300b
commit
a00e5cc177
@ -580,7 +580,7 @@ void CCastleInterface::buildingClicked(int building)
|
|||||||
|
|
||||||
if(building >= 30)
|
if(building >= 30)
|
||||||
{
|
{
|
||||||
showRecruitmentWindow(building);
|
showRecruitmentWindow((building-30)%CREATURES_PER_TOWN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -761,14 +761,10 @@ void CCastleInterface::buildingClicked(int building)
|
|||||||
|
|
||||||
/*Dungeon*/ case 5: //Portal of Summoning
|
/*Dungeon*/ case 5: //Portal of Summoning
|
||||||
if (town->creatures[CREATURES_PER_TOWN].second.empty())
|
if (town->creatures[CREATURES_PER_TOWN].second.empty())
|
||||||
{//extra dwelling has no creatures in it. no external dwellinngs
|
//extra dwelling has no creatures in it
|
||||||
LOCPLINT->showInfoDialog(CGI->generaltexth->tcommands[30], std::vector<SComponent*>(), soundBase::sound_todo);
|
LOCPLINT->showInfoDialog(CGI->generaltexth->tcommands[30], std::vector<SComponent*>(), soundBase::sound_todo);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
this->showRecruitmentWindow(CREATURES_PER_TOWN);
|
||||||
GH.pushInt(new CRecruitmentWindow(town, CREATURES_PER_TOWN, town,
|
|
||||||
boost::bind(&CCallback::recruitCreatures,LOCPLINT->cb,town,_1,_2,CREATURES_PER_TOWN), -87));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
/*Stronghold*/ case 6: //Ballista Yard
|
/*Stronghold*/ case 6: //Ballista Yard
|
||||||
enterBlacksmith(4);
|
enterBlacksmith(4);
|
||||||
@ -1198,9 +1194,7 @@ void CCastleInterface::CCreaInfo::hover(bool on)
|
|||||||
void CCastleInterface::CCreaInfo::clickLeft(tribool down, bool previousState)
|
void CCastleInterface::CCreaInfo::clickLeft(tribool down, bool previousState)
|
||||||
{
|
{
|
||||||
if(previousState && (!down))
|
if(previousState && (!down))
|
||||||
{
|
LOCPLINT->castleInt->showRecruitmentWindow(level);
|
||||||
LOCPLINT->castleInt->showRecruitmentWindow(level+37);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int CCastleInterface::CCreaInfo::AddToString(std::string from, std::string & to, int numb)
|
int CCastleInterface::CCreaInfo::AddToString(std::string from, std::string & to, int numb)
|
||||||
@ -1379,26 +1373,12 @@ void CCastleInterface::CTownInfo::show(SDL_Surface * to)
|
|||||||
blitAt(pic->ourImages[bid-10].bitmap,pos.x,pos.y,to);
|
blitAt(pic->ourImages[bid-10].bitmap,pos.x,pos.y,to);
|
||||||
}
|
}
|
||||||
|
|
||||||
CRecruitmentWindow * CCastleInterface::showRecruitmentWindow( int building )
|
void CCastleInterface::showRecruitmentWindow( int level )
|
||||||
{
|
{
|
||||||
if(building>36) //upg dwelling
|
|
||||||
building-=7;
|
|
||||||
|
|
||||||
int level = building-30;
|
|
||||||
assert(level >= 0 && level < town->creatures.size());
|
assert(level >= 0 && level < town->creatures.size());
|
||||||
|
|
||||||
//std::vector<std::pair<int,int > > crs;
|
|
||||||
//int amount = town->creatures[level].first;
|
|
||||||
|
|
||||||
//const std::vector<ui32> &cres = town->creatures[level].second;
|
|
||||||
|
|
||||||
//for(size_t i = 0; i < cres.size(); i++)
|
|
||||||
// crs.push_back(std::make_pair((int)cres[i],amount));
|
|
||||||
//CRecruitmentWindow *rw = new CRecruitmentWindow(crs,boost::bind(&CCallback::recruitCreatures,LOCPLINT->cb,town,_1,_2));
|
|
||||||
|
|
||||||
CRecruitmentWindow *rw = new CRecruitmentWindow(town, level, town, boost::bind(&CCallback::recruitCreatures,LOCPLINT->cb,town,_1,_2,level), -87);
|
CRecruitmentWindow *rw = new CRecruitmentWindow(town, level, town, boost::bind(&CCallback::recruitCreatures,LOCPLINT->cb,town,_1,_2,level), -87);
|
||||||
GH.pushInt(rw);
|
GH.pushInt(rw);
|
||||||
return rw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCastleInterface::enterMageGuild()
|
void CCastleInterface::enterMageGuild()
|
||||||
@ -1817,7 +1797,7 @@ void CFortScreen::show( SDL_Surface * to)
|
|||||||
{
|
{
|
||||||
blitAt(bg,pos,to);
|
blitAt(bg,pos,to);
|
||||||
static unsigned char anim = 1;
|
static unsigned char anim = 1;
|
||||||
for (int i=0; i<CREATURES_PER_TOWN; i++)
|
for (int i=0; i<crePics.size(); i++)
|
||||||
{
|
{
|
||||||
crePics[i]->blitPic(to,pos.x+positions[i].x+159,pos.y+positions[i].y+4,!(anim%4));
|
crePics[i]->blitPic(to,pos.x+positions[i].x+159,pos.y+positions[i].y+4,!(anim%4));
|
||||||
}
|
}
|
||||||
@ -1853,6 +1833,11 @@ void CFortScreen::close()
|
|||||||
|
|
||||||
CFortScreen::CFortScreen( CCastleInterface * owner )
|
CFortScreen::CFortScreen( CCastleInterface * owner )
|
||||||
{
|
{
|
||||||
|
if (owner->town->creatures.size() > CREATURES_PER_TOWN
|
||||||
|
&& owner->town->creatures[CREATURES_PER_TOWN].second.size() )//dungeon with active portal
|
||||||
|
fortSize = CREATURES_PER_TOWN+1;
|
||||||
|
else
|
||||||
|
fortSize = CREATURES_PER_TOWN;
|
||||||
resdatabar = new CMinorResDataBar;
|
resdatabar = new CMinorResDataBar;
|
||||||
pos = owner->pos;
|
pos = owner->pos;
|
||||||
bg = NULL;
|
bg = NULL;
|
||||||
@ -1862,8 +1847,11 @@ CFortScreen::CFortScreen( CCastleInterface * owner )
|
|||||||
exit = new AdventureMapButton(temp,"",boost::bind(&CFortScreen::close,this),pos.x+748,pos.y+556,"TPMAGE1.DEF",SDLK_RETURN);
|
exit = new AdventureMapButton(temp,"",boost::bind(&CFortScreen::close,this),pos.x+748,pos.y+556,"TPMAGE1.DEF",SDLK_RETURN);
|
||||||
positions += genRect(126,386,10,22),genRect(126,386,404,22),
|
positions += genRect(126,386,10,22),genRect(126,386,404,22),
|
||||||
genRect(126,386,10,155),genRect(126,386,404,155),
|
genRect(126,386,10,155),genRect(126,386,404,155),
|
||||||
genRect(126,386,10,288),genRect(126,386,404,288),
|
genRect(126,386,10,288),genRect(126,386,404,288);
|
||||||
genRect(126,386,206,421);
|
if (fortSize == CREATURES_PER_TOWN)
|
||||||
|
positions += genRect(126,386,206,421);
|
||||||
|
else
|
||||||
|
positions += genRect(126,386,10,421),genRect(126,386,404,421);
|
||||||
draw(owner,true);
|
draw(owner,true);
|
||||||
resdatabar->pos += pos;
|
resdatabar->pos += pos;
|
||||||
}
|
}
|
||||||
@ -1874,22 +1862,40 @@ void CFortScreen::draw( CCastleInterface * owner, bool first)
|
|||||||
SDL_FreeSurface(bg);
|
SDL_FreeSurface(bg);
|
||||||
char buf[20];
|
char buf[20];
|
||||||
memset(buf,0,20);
|
memset(buf,0,20);
|
||||||
SDL_Surface *bg2 = BitmapHandler::loadBitmap("TPCASTL7.bmp"),
|
SDL_Surface *bg2;
|
||||||
*icons = BitmapHandler::loadBitmap("ZPCAINFO.bmp");
|
if (fortSize == CREATURES_PER_TOWN)
|
||||||
|
bg2 = BitmapHandler::loadBitmap("TPCASTL7.bmp");
|
||||||
|
else
|
||||||
|
bg2 = BitmapHandler::loadBitmap("TPCASTL8.bmp");
|
||||||
|
|
||||||
|
SDL_Surface *icons = BitmapHandler::loadBitmap("ZPCAINFO.bmp");
|
||||||
SDL_SetColorKey(icons,SDL_SRCCOLORKEY,SDL_MapRGB(icons->format,0,255,255));
|
SDL_SetColorKey(icons,SDL_SRCCOLORKEY,SDL_MapRGB(icons->format,0,255,255));
|
||||||
graphics->blueToPlayersAdv(bg2,LOCPLINT->playerID);
|
graphics->blueToPlayersAdv(bg2,LOCPLINT->playerID);
|
||||||
bg = SDL_ConvertSurface(bg2,screen->format,0);
|
bg = SDL_ConvertSurface(bg2,screen->format,0);
|
||||||
SDL_FreeSurface(bg2);
|
SDL_FreeSurface(bg2);
|
||||||
printAtMiddle(CGI->buildh->buildings[owner->town->subID][owner->town->fortLevel()+6]->Name(),400,13,FONT_MEDIUM,zwykly,bg);
|
printAtMiddle(CGI->buildh->buildings[owner->town->subID][owner->town->fortLevel()+6]->Name(),400,13,FONT_MEDIUM,zwykly,bg);
|
||||||
for(int i=0;i<CREATURES_PER_TOWN; i++)
|
for(int i=0;i<fortSize; i++)
|
||||||
{
|
{
|
||||||
bool upgraded = owner->town->creatureDwelling(i,true);
|
int dwelling;// ID of buiding with this creature
|
||||||
bool present = owner->town->creatureDwelling(i,false);
|
CCreature *c;
|
||||||
CCreature *c = CGI->creh->creatures[upgraded ? owner->town->town->upgradedCreatures[i] : owner->town->town->basicCreatures[i]];
|
bool present = true;
|
||||||
|
if ( i < CREATURES_PER_TOWN )
|
||||||
|
{
|
||||||
|
bool upgraded = owner->town->creatureDwelling(i,true);
|
||||||
|
present = owner->town->creatureDwelling(i,false);
|
||||||
|
c = CGI->creh->creatures[upgraded ? owner->town->town->upgradedCreatures[i] : owner->town->town->basicCreatures[i]];
|
||||||
|
dwelling = 30+i+upgraded*7;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
c = CGI->creh->creatures[owner->town->creatures[i].second[0]];
|
||||||
|
dwelling = 22;//Portal of summon
|
||||||
|
}
|
||||||
|
|
||||||
printAtMiddle(c->namePl,positions[i].x+79,positions[i].y+10,FONT_SMALL,zwykly,bg); //cr. name
|
printAtMiddle(c->namePl,positions[i].x+79,positions[i].y+10,FONT_SMALL,zwykly,bg); //cr. name
|
||||||
blitAt(owner->bicons->ourImages[30+i+upgraded*7].bitmap,positions[i].x+4,positions[i].y+21,bg); //dwelling pic
|
blitAt(owner->bicons->ourImages[dwelling].bitmap,positions[i].x+4,positions[i].y+21,bg); //dwelling pic
|
||||||
printAtMiddle(CGI->buildh->buildings[owner->town->subID][30+i+upgraded*7]->Name(),positions[i].x+79,positions[i].y+100,FONT_SMALL,zwykly,bg); //dwelling name
|
printAtMiddle(CGI->buildh->buildings[owner->town->subID][dwelling]->Name(),positions[i].x+79,positions[i].y+100,FONT_SMALL,zwykly,bg); //dwelling name
|
||||||
if(present) //if creature is present print avail able quantity
|
if(present) //if creature is present print available quantity
|
||||||
{
|
{
|
||||||
SDL_itoa(owner->town->creatures[i].first,buf,10);
|
SDL_itoa(owner->town->creatures[i].first,buf,10);
|
||||||
printAtMiddle(CGI->generaltexth->allTexts[217] + buf,positions[i].x+79,positions[i].y+118,FONT_SMALL,zwykly,bg);
|
printAtMiddle(CGI->generaltexth->allTexts[217] + buf,positions[i].x+79,positions[i].y+118,FONT_SMALL,zwykly,bg);
|
||||||
@ -1939,7 +1945,7 @@ void CFortScreen::draw( CCastleInterface * owner, bool first)
|
|||||||
crePics.push_back(new CCreaturePic(c,false));
|
crePics.push_back(new CCreaturePic(c,false));
|
||||||
if(present)
|
if(present)
|
||||||
{
|
{
|
||||||
recAreas.push_back(new RecArea(30+i+upgraded*7));
|
recAreas.push_back(new RecArea(i));
|
||||||
recAreas.back()->pos = positions[i] + pos;
|
recAreas.back()->pos = positions[i] + pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1949,10 +1955,7 @@ void CFortScreen::draw( CCastleInterface * owner, bool first)
|
|||||||
void CFortScreen::RecArea::clickLeft(tribool down, bool previousState)
|
void CFortScreen::RecArea::clickLeft(tribool down, bool previousState)
|
||||||
{
|
{
|
||||||
if(!down && previousState)
|
if(!down && previousState)
|
||||||
{
|
LOCPLINT->castleInt->showRecruitmentWindow(level);
|
||||||
LOCPLINT->castleInt->showRecruitmentWindow(bid);
|
|
||||||
}
|
|
||||||
//ClickableL::clickLeft(down);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CFortScreen::RecArea::clickRight(tribool down, bool previousState)
|
void CFortScreen::RecArea::clickRight(tribool down, bool previousState)
|
||||||
|
@ -138,7 +138,7 @@ public:
|
|||||||
void enterTavern();
|
void enterTavern();
|
||||||
void enterMageGuild();
|
void enterMageGuild();
|
||||||
void splitClicked(); //for hero meeting (splitting stacks is handled by garrison int)
|
void splitClicked(); //for hero meeting (splitting stacks is handled by garrison int)
|
||||||
CRecruitmentWindow * showRecruitmentWindow(int building);
|
void showRecruitmentWindow( int level );
|
||||||
void enterHall();
|
void enterHall();
|
||||||
void close();
|
void close();
|
||||||
void splitF();
|
void splitF();
|
||||||
@ -209,13 +209,14 @@ class CFortScreen : public CIntObject
|
|||||||
class RecArea : public CIntObject
|
class RecArea : public CIntObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int bid;
|
int level;
|
||||||
RecArea(int BID):bid(BID){used = LCLICK | RCLICK;}; //c-tor
|
RecArea(int LEVEL):level(LEVEL){used = LCLICK | RCLICK;}; //c-tor
|
||||||
void clickLeft(tribool down, bool previousState);
|
void clickLeft(tribool down, bool previousState);
|
||||||
void clickRight(tribool down, bool previousState);
|
void clickRight(tribool down, bool previousState);
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
CMinorResDataBar * resdatabar;
|
CMinorResDataBar * resdatabar;
|
||||||
|
int fortSize;
|
||||||
AdventureMapButton *exit;
|
AdventureMapButton *exit;
|
||||||
SDL_Surface * bg;
|
SDL_Surface * bg;
|
||||||
std::vector<Rect> positions;
|
std::vector<Rect> positions;
|
||||||
|
@ -3781,6 +3781,7 @@ void CAltarWindow::calcTotalExp()
|
|||||||
val += valOfArt * arts->artifactsOnAltar.count(*i);
|
val += valOfArt * arts->artifactsOnAltar.count(*i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val *=(100+hero->getSecSkillLevel(21)*5)/100.0f;
|
||||||
expOnAltar->setTxt(boost::lexical_cast<std::string>(val));
|
expOnAltar->setTxt(boost::lexical_cast<std::string>(val));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6235,15 +6236,16 @@ CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner)
|
|||||||
|
|
||||||
//loading backround and converting to more bpp form
|
//loading backround and converting to more bpp form
|
||||||
SDL_Surface * bg = background = BitmapHandler::loadBitmap("TpRank.bmp", false);
|
SDL_Surface * bg = background = BitmapHandler::loadBitmap("TpRank.bmp", false);
|
||||||
|
graphics->blueToPlayersAdv(bg,LOCPLINT->playerID);
|
||||||
background = newSurface(bg->w, bg->h);
|
background = newSurface(bg->w, bg->h);
|
||||||
blitAt(bg, 0, 0, background);
|
blitAt(bg, 0, 0, background);
|
||||||
SDL_FreeSurface(bg);
|
SDL_FreeSurface(bg);
|
||||||
|
|
||||||
exitb = new AdventureMapButton (std::string(), std::string(), boost::bind(&CThievesGuildWindow::bexitf,this), 748, 556, "HSBTNS.def", SDLK_RETURN);
|
exitb = new AdventureMapButton (std::string(), std::string(), boost::bind(&CThievesGuildWindow::bexitf,this), 748, 556, "TPMAGE1.def", SDLK_RETURN);
|
||||||
statusBar = new CGStatusBar(3, 555, "TStatBar.bmp", 742);
|
statusBar = new CGStatusBar(3, 555, "TStatBar.bmp", 742);
|
||||||
|
|
||||||
resdatabar = new CMinorResDataBar();
|
resdatabar = new CMinorResDataBar();
|
||||||
resdatabar->pos.x += pos.x - 3;
|
resdatabar->pos.x += pos.x;
|
||||||
resdatabar->pos.y += pos.y;
|
resdatabar->pos.y += pos.y;
|
||||||
|
|
||||||
static std::vector< std::list< ui8 > > SThievesGuildInfo::* fields[] = { &SThievesGuildInfo::numOfTowns, &SThievesGuildInfo::numOfHeroes, &SThievesGuildInfo::gold,
|
static std::vector< std::list< ui8 > > SThievesGuildInfo::* fields[] = { &SThievesGuildInfo::numOfTowns, &SThievesGuildInfo::numOfHeroes, &SThievesGuildInfo::gold,
|
||||||
@ -6271,7 +6273,9 @@ CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner)
|
|||||||
{
|
{
|
||||||
y = 52 + 32*g;
|
y = 52 + 32*g;
|
||||||
}
|
}
|
||||||
printAtMiddle(CGI->generaltexth->jktexts[24+g], 135, y, FONT_MEDIUM, tytulowy, background);
|
std::string text = CGI->generaltexth->jktexts[24+g];
|
||||||
|
boost::algorithm::trim_if(text,boost::algorithm::is_any_of("\""));
|
||||||
|
printAtMiddle(text, 135, y, FONT_MEDIUM, tytulowy, background);
|
||||||
}
|
}
|
||||||
|
|
||||||
CDefHandler * strips = CDefHandler::giveDef("PRSTRIPS.DEF");
|
CDefHandler * strips = CDefHandler::giveDef("PRSTRIPS.DEF");
|
||||||
@ -6284,7 +6288,7 @@ CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner)
|
|||||||
{
|
{
|
||||||
blitAt(strips->ourImages[g-1].bitmap, 250 + 66*g, 7, background);
|
blitAt(strips->ourImages[g-1].bitmap, 250 + 66*g, 7, background);
|
||||||
}
|
}
|
||||||
printAtMiddle(CGI->generaltexth->jktexts[16+g], 283 + 66*g, 20, FONT_MEDIUM, tytulowy, background);
|
printAtMiddle(CGI->generaltexth->jktexts[16+g], 283 + 66*g, 24, FONT_BIG, tytulowy, background);
|
||||||
SDL_Surface * box = BitmapHandler::loadBitmap(colorToBox[tgi.playerColors[g]]);
|
SDL_Surface * box = BitmapHandler::loadBitmap(colorToBox[tgi.playerColors[g]]);
|
||||||
blitAt(box, 253 + 66*g, 334, background);
|
blitAt(box, 253 + 66*g, 334, background);
|
||||||
SDL_FreeSurface(box);
|
SDL_FreeSurface(box);
|
||||||
@ -6327,12 +6331,12 @@ CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner)
|
|||||||
//printing stats
|
//printing stats
|
||||||
if(it->second.details)
|
if(it->second.details)
|
||||||
{
|
{
|
||||||
|
printAtWB(CGI->generaltexth->allTexts[184], 191 + 66*counter, 396, FONT_TINY, 10, zwykly, background);
|
||||||
for (int i=0; i<it->second.details->primskills.size(); ++i)
|
for (int i=0; i<it->second.details->primskills.size(); ++i)
|
||||||
{
|
{
|
||||||
printAt(CGI->generaltexth->allTexts[380+i], 191 + 66*counter, 394 + 11*i, FONT_SMALL, zwykly, background);
|
|
||||||
std::ostringstream skill;
|
std::ostringstream skill;
|
||||||
skill << it->second.details->primskills[i];
|
skill << it->second.details->primskills[i];
|
||||||
printTo(skill.str(), 244 + 66 * counter, 410 + 11*i, FONT_SMALL, zwykly, background);
|
printTo(skill.str(), 244 + 66 * counter, 407 + 11*i, FONT_TINY, zwykly, background);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,41 +1,56 @@
|
|||||||
0 11
|
-1 0 11
|
||||||
1 12
|
-1 1 12
|
||||||
2 13
|
-1 2 13
|
||||||
3 7
|
-1 3 7
|
||||||
4 8
|
-1 4 8
|
||||||
5 9
|
-1 5 9
|
||||||
6 5
|
-1 6 5
|
||||||
7 16
|
-1 7 16
|
||||||
8 14
|
-1 8 14
|
||||||
9 15
|
-1 9 15
|
||||||
10 23
|
-1 10 17
|
||||||
11 0
|
-1 11 0
|
||||||
12 1
|
-1 12 1
|
||||||
13 2
|
-1 13 2
|
||||||
14 3
|
-1 14 3
|
||||||
15 4
|
-1 15 4
|
||||||
16 6
|
-1 16 6
|
||||||
17 26
|
-1 17 26
|
||||||
18 17
|
-1 18 17
|
||||||
19 22
|
-1 19 22
|
||||||
20 21
|
-1 20 22
|
||||||
21 23
|
-1 21 23
|
||||||
22 30
|
-1 22 30
|
||||||
23 37
|
-1 23 37
|
||||||
24 -1
|
-1 24 -1
|
||||||
25 31
|
-1 25 31
|
||||||
26 38
|
-1 26 38
|
||||||
27 -2
|
-1 27 -2
|
||||||
28 32
|
-1 28 32
|
||||||
29 39
|
-1 29 39
|
||||||
30 -3
|
-1 30 -3
|
||||||
31 33
|
-1 31 33
|
||||||
32 40
|
-1 32 40
|
||||||
33 -4
|
-1 33 -4
|
||||||
34 34
|
-1 34 34
|
||||||
35 41
|
-1 35 41
|
||||||
36 -5
|
-1 36 -5
|
||||||
37 35
|
-1 37 35
|
||||||
38 42
|
-1 38 42
|
||||||
39 36
|
-1 39 36
|
||||||
40 43
|
-1 40 43
|
||||||
|
0 20 21
|
||||||
|
1 19 21
|
||||||
|
2 18 22
|
||||||
|
2 19 23
|
||||||
|
2 20 21
|
||||||
|
3 20 23
|
||||||
|
3 18 21
|
||||||
|
4 19 21
|
||||||
|
5 20 23
|
||||||
|
5 18 21
|
||||||
|
6 19 21
|
||||||
|
7 20 17
|
||||||
|
7 18 22
|
||||||
|
7 19 21
|
||||||
|
8 18 21
|
||||||
|
@ -1862,7 +1862,9 @@ int CGTownInstance::mageGuildLevel() const
|
|||||||
}
|
}
|
||||||
bool CGTownInstance::creatureDwelling(const int & level, bool upgraded) const
|
bool CGTownInstance::creatureDwelling(const int & level, bool upgraded) const
|
||||||
{
|
{
|
||||||
return builtBuildings.find(30+level+upgraded*7)!=builtBuildings.end();
|
if ( level<0 || level >= CREATURES_PER_TOWN )
|
||||||
|
return false;
|
||||||
|
return vstd::contains(builtBuildings, 30+level+upgraded*CREATURES_PER_TOWN);
|
||||||
}
|
}
|
||||||
int CGTownInstance::getHordeLevel(const int & HID) const//HID - 0 or 1; returns creature level or -1 if that horde structure is not present
|
int CGTownInstance::getHordeLevel(const int & HID) const//HID - 0 or 1; returns creature level or -1 if that horde structure is not present
|
||||||
{
|
{
|
||||||
@ -2437,6 +2439,8 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
}
|
}
|
||||||
case 100: //give exp
|
case 100: //give exp
|
||||||
{
|
{
|
||||||
|
const CGHeroInstance *h = cb->getHero(heroID);
|
||||||
|
val = val*(100+h->getSecSkillLevel(21)*5)/100.0f;
|
||||||
InfoWindow iw;
|
InfoWindow iw;
|
||||||
iw.soundID = sound;
|
iw.soundID = sound;
|
||||||
iw.components.push_back(Component(id,subid,val,0));
|
iw.components.push_back(Component(id,subid,val,0));
|
||||||
@ -2731,9 +2735,9 @@ void CTownBonus::onHeroVisit (const CGHeroInstance * h) const
|
|||||||
break;
|
break;
|
||||||
case 5://academy of battle scholars
|
case 5://academy of battle scholars
|
||||||
what = 4;
|
what = 4;
|
||||||
val = 1000;
|
val = 1000*(100+h->getSecSkillLevel(21)*5)/100.0f;
|
||||||
mid = 583;
|
mid = 583;
|
||||||
iw.components.push_back (Component(Component::EXPERIENCE, 0, 1000, 0));
|
iw.components.push_back (Component(Component::EXPERIENCE, 0, val, 0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3686,7 +3690,8 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
sd.player = h->tempOwner;
|
sd.player = h->tempOwner;
|
||||||
sd.text << std::pair<ui8,ui32>(11,146);
|
sd.text << std::pair<ui8,ui32>(11,146);
|
||||||
sd.components.push_back(Component(2,6,val1,0));
|
sd.components.push_back(Component(2,6,val1,0));
|
||||||
sd.components.push_back(Component(5,0,val2,0));
|
int expVal = val2*(100+h->getSecSkillLevel(21)*5)/100.0f;
|
||||||
|
sd.components.push_back(Component(5,0,expVal, 0));
|
||||||
sd.soundID = soundBase::chest;
|
sd.soundID = soundBase::chest;
|
||||||
boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
|
boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
|
||||||
cb->showBlockingDialog(&sd,fun);
|
cb->showBlockingDialog(&sd,fun);
|
||||||
@ -3699,13 +3704,14 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
|
|
||||||
void CGPickable::chosen( int which, int heroID ) const
|
void CGPickable::chosen( int which, int heroID ) const
|
||||||
{
|
{
|
||||||
|
const CGHeroInstance *h = cb->getHero(heroID);
|
||||||
switch(which)
|
switch(which)
|
||||||
{
|
{
|
||||||
case 1: //player pick gold
|
case 1: //player pick gold
|
||||||
cb->giveResource(cb->getOwner(heroID),6,val1);
|
cb->giveResource(cb->getOwner(heroID),6,val1);
|
||||||
break;
|
break;
|
||||||
case 2: //player pick exp
|
case 2: //player pick exp
|
||||||
cb->changePrimSkill(heroID, 4, val2);
|
cb->changePrimSkill(heroID, 4, val2*(100+h->getSecSkillLevel(21)*5)/100.0f);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw std::string("Unhandled treasure choice");
|
throw std::string("Unhandled treasure choice");
|
||||||
@ -4220,13 +4226,18 @@ void CGSeerHut::completeQuest (const CGHeroInstance * h) const //reward
|
|||||||
switch (rewardType)
|
switch (rewardType)
|
||||||
{
|
{
|
||||||
case 1: //experience
|
case 1: //experience
|
||||||
cb->changePrimSkill(h->id, 4, rVal, false);
|
{
|
||||||
iw.components.push_back (Component (Component::EXPERIENCE, 0, rVal, 0));
|
int expVal = rVal*(100+h->getSecSkillLevel(21)*5)/100.0f;
|
||||||
|
cb->changePrimSkill(h->id, 4, expVal, false);
|
||||||
|
iw.components.push_back (Component (Component::EXPERIENCE, 0, expVal, 0));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 2: //mana points
|
case 2: //mana points
|
||||||
|
{
|
||||||
cb->setManaPoints(h->id, h->mana+rVal);
|
cb->setManaPoints(h->id, h->mana+rVal);
|
||||||
iw.components.push_back (Component (Component::PRIM_SKILL, 5, rVal, 0));
|
iw.components.push_back (Component (Component::PRIM_SKILL, 5, rVal, 0));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 3: case 4: //morale /luck
|
case 3: case 4: //morale /luck
|
||||||
{
|
{
|
||||||
Bonus hb(Bonus::ONE_WEEK, (rewardType == 3 ? Bonus::MORALE : Bonus::LUCK),
|
Bonus hb(Bonus::ONE_WEEK, (rewardType == 3 ? Bonus::MORALE : Bonus::LUCK),
|
||||||
@ -4682,10 +4693,11 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con
|
|||||||
|
|
||||||
if(gainedExp || changesPrimSkill || abilities.size())
|
if(gainedExp || changesPrimSkill || abilities.size())
|
||||||
{
|
{
|
||||||
|
int expVal = gainedExp*(100+h->getSecSkillLevel(21)*5)/100.0f;
|
||||||
getText(iw,afterBattle,175,h);
|
getText(iw,afterBattle,175,h);
|
||||||
|
|
||||||
if(gainedExp)
|
if(expVal)
|
||||||
iw.components.push_back(Component(Component::EXPERIENCE,0,gainedExp,0));
|
iw.components.push_back(Component(Component::EXPERIENCE,0,expVal,0));
|
||||||
for(int i=0; i<primskills.size(); i++)
|
for(int i=0; i<primskills.size(); i++)
|
||||||
if(primskills[i])
|
if(primskills[i])
|
||||||
iw.components.push_back(Component(Component::PRIM_SKILL,i,primskills[i],0));
|
iw.components.push_back(Component(Component::PRIM_SKILL,i,primskills[i],0));
|
||||||
@ -4696,8 +4708,8 @@ void CGPandoraBox::giveContents( const CGHeroInstance *h, bool afterBattle ) con
|
|||||||
cb->showInfoDialog(&iw);
|
cb->showInfoDialog(&iw);
|
||||||
|
|
||||||
//give exp
|
//give exp
|
||||||
if(gainedExp)
|
if(expVal)
|
||||||
cb->changePrimSkill(h->id,4,gainedExp,false);
|
cb->changePrimSkill(h->id,4,expVal,false);
|
||||||
//give prim skills
|
//give prim skills
|
||||||
for(int i=0; i<primskills.size(); i++)
|
for(int i=0; i<primskills.size(); i++)
|
||||||
if(primskills[i])
|
if(primskills[i])
|
||||||
|
20
lib/map.cpp
20
lib/map.cpp
@ -29,23 +29,11 @@ static std::set<si32> convertBuildings(const std::set<si32> h3m, int castleID)
|
|||||||
std::ifstream b5(DATA_DIR "/config/buildings5.txt");
|
std::ifstream b5(DATA_DIR "/config/buildings5.txt");
|
||||||
while(!b5.eof())
|
while(!b5.eof())
|
||||||
{
|
{
|
||||||
int a, b;
|
int h3, VCMI, town;
|
||||||
b5 >> a >> b;
|
b5 >> town >> h3 >> VCMI;
|
||||||
if(castleID==8 && b==17) //magic university ID 17 (h3m) => 21 (vcmi)
|
if ( town == castleID || town == -1 )
|
||||||
b=21;
|
mapa[h3]=VCMI;
|
||||||
if(castleID==4 && a==20) //necropolis, skeleton transformer
|
|
||||||
b=22;
|
|
||||||
if(castleID==4 && a==19) //necropolis, necromancy aplifier
|
|
||||||
b=21;
|
|
||||||
if(castleID==3 && a==18) //inferno, brimstone clouds
|
|
||||||
b=21;
|
|
||||||
if(castleID==3 && a==20) //inferno, order of fire
|
|
||||||
b=23;
|
|
||||||
if(castleID==8 && a==10) //conflux, artifact merchant
|
|
||||||
b=17;
|
|
||||||
mapa[a]=b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(std::set<si32>::const_iterator i=h3m.begin();i!=h3m.end();i++)
|
for(std::set<si32>::const_iterator i=h3m.begin();i!=h3m.end();i++)
|
||||||
{
|
{
|
||||||
if(mapa[*i]>=0)
|
if(mapa[*i]>=0)
|
||||||
|
@ -571,6 +571,10 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
|
|||||||
|
|
||||||
//end battle, remove all info, free memory
|
//end battle, remove all info, free memory
|
||||||
giveExp(*battleResult.data);
|
giveExp(*battleResult.data);
|
||||||
|
if (hero1)
|
||||||
|
battleResult.data->exp[0] *= (100+hero1->getSecSkillLevel(21)*5)/100.0f;//sholar skill
|
||||||
|
if (hero2)
|
||||||
|
battleResult.data->exp[1] *= (100+hero2->getSecSkillLevel(21)*5)/100.0f;
|
||||||
sendAndApply(battleResult.data);
|
sendAndApply(battleResult.data);
|
||||||
|
|
||||||
//if one hero has lost we will erase him
|
//if one hero has lost we will erase him
|
||||||
@ -4936,7 +4940,7 @@ bool CGameHandler::sacrificeCreatures(const IMarket *market, const CGHeroInstanc
|
|||||||
int dump, exp;
|
int dump, exp;
|
||||||
market->getOffer(crid, 0, dump, exp, CREATURE_EXP);
|
market->getOffer(crid, 0, dump, exp, CREATURE_EXP);
|
||||||
exp *= count;
|
exp *= count;
|
||||||
changePrimSkill (hero->id, 4, exp);
|
changePrimSkill (hero->id, 4, exp*(100+hero->getSecSkillLevel(21)*5)/100.0f);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user