1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-23 21:29:13 +02:00

* our changes

* centered spellBook
* magic arrow animation fits battle window
* preventing different battle animations from getting out of appropriate rect
This commit is contained in:
mateuszb 2009-01-07 19:40:19 +00:00
parent 847a4f222c
commit fa11c06bdc
6 changed files with 51 additions and 42 deletions

@ -1036,6 +1036,7 @@ endTurn(CGI->generaltexth->zelp[302].first,CGI->generaltexth->zelp[302].second,
heroList(ADVOPT.hlistSize), heroList(ADVOPT.hlistSize),
townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlistAD)//(5,&genRect(192,48,747,196),747,196,747,372), townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlistAD)//(5,&genRect(192,48,747,196),747,196,747,372),
{ {
subInt = NULL;
selection = NULL; selection = NULL;
townList.fun = boost::bind(&CAdvMapInt::selectionChanged,this); townList.fun = boost::bind(&CAdvMapInt::selectionChanged,this);
LOCPLINT->adventureInt=this; LOCPLINT->adventureInt=this;
@ -1110,7 +1111,7 @@ void CAdvMapInt::fshowSpellbok()
LOCPLINT->curint->deactivate(); LOCPLINT->curint->deactivate();
CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, 90, 2), ((const CGHeroInstance*)LOCPLINT->adventureInt->selection)); CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), ((const CGHeroInstance*)LOCPLINT->adventureInt->selection));
spellWindow->activate(); spellWindow->activate();
LOCPLINT->objsToBlit.push_back(spellWindow); LOCPLINT->objsToBlit.push_back(spellWindow);
} }

@ -15,6 +15,7 @@
#include "client/CCreatureAnimation.h" #include "client/CCreatureAnimation.h"
#include "client/Graphics.h" #include "client/Graphics.h"
#include "client/CSpellWindow.h" #include "client/CSpellWindow.h"
#include "client/CConfigHandler.h"
#include <queue> #include <queue>
#include <sstream> #include <sstream>
#include "lib/CondSh.h" #include "lib/CondSh.h"
@ -344,6 +345,9 @@ void CBattleInterface::show(SDL_Surface * to)
if(!to) //"evaluating" to if(!to) //"evaluating" to
to = screen; to = screen;
SDL_Rect buf;
SDL_GetClipRect(to, &buf);
SDL_SetClipRect(to, &pos);
//printing background and hexes //printing background and hexes
if(activeStack != -1 && creAnims[activeStack]->getType() != 0) //show everything with range if(activeStack != -1 && creAnims[activeStack]->getType() != 0) //show everything with range
{ {
@ -489,7 +493,8 @@ void CBattleInterface::show(SDL_Surface * to)
std::vector< std::list<SBattleEffect>::iterator > toErase; std::vector< std::list<SBattleEffect>::iterator > toErase;
for(std::list<SBattleEffect>::iterator it = battleEffects.begin(); it!=battleEffects.end(); ++it) for(std::list<SBattleEffect>::iterator it = battleEffects.begin(); it!=battleEffects.end(); ++it)
{ {
blitAt(it->anim->ourImages[(it->frame)%it->anim->ourImages.size()].bitmap, it->x + pos.x, it->y + pos.y, to); SDL_Surface * bitmapToBlit = it->anim->ourImages[(it->frame)%it->anim->ourImages.size()].bitmap;
SDL_BlitSurface(bitmapToBlit, NULL, to, &genRect(bitmapToBlit->h, bitmapToBlit->w, pos.x + it->x, pos.y + it->y));
++(it->frame); ++(it->frame);
if(it->frame == it->maxFrame) if(it->frame == it->maxFrame)
@ -559,6 +564,7 @@ void CBattleInterface::show(SDL_Surface * to)
{ {
resWindow->show(to); resWindow->show(to);
} }
SDL_SetClipRect(to, &buf); //restoring previous clip_rect
} }
void CBattleInterface::keyPressed(const SDL_KeyboardEvent & key) void CBattleInterface::keyPressed(const SDL_KeyboardEvent & key)
{ {
@ -773,7 +779,7 @@ void CBattleInterface::bSpellf()
chi = attackingHeroInstance; chi = attackingHeroInstance;
else else
chi = defendingHeroInstance; chi = defendingHeroInstance;
CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, 90, 2), chi); CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), chi);
spellWindow->activate(); spellWindow->activate();
LOCPLINT->objsToBlit.push_back(spellWindow); LOCPLINT->objsToBlit.push_back(spellWindow);
} }
@ -1451,6 +1457,9 @@ void CBattleInterface::spellCasted(SpellCasted * sc)
int dx = (destcoord.first - srccoord.first - animDef->ourImages[0].bitmap->w)/steps, dy = (destcoord.second - srccoord.second - animDef->ourImages[0].bitmap->h)/steps; int dx = (destcoord.first - srccoord.first - animDef->ourImages[0].bitmap->w)/steps, dy = (destcoord.second - srccoord.second - animDef->ourImages[0].bitmap->h)/steps;
SDL_Rect buf;
SDL_GetClipRect(screen, &buf);
SDL_SetClipRect(screen, &pos); //setting rect we can blit to
for(int g=0; g<steps; ++g) for(int g=0; g<steps; ++g)
{ {
show(); show();
@ -1460,6 +1469,7 @@ void CBattleInterface::spellCasted(SpellCasted * sc)
CSDL_Ext::update(); CSDL_Ext::update();
SDL_framerateDelay(LOCPLINT->mainFPSmng); SDL_framerateDelay(LOCPLINT->mainFPSmng);
} }
SDL_SetClipRect(screen, &buf); //restoring previous clip rect
int b=0; //TODO use me int b=0; //TODO use me
break; //for 15 and 16 cases break; //for 15 and 16 cases
@ -2009,7 +2019,7 @@ void CBattleHero::clickLeft(boost::logic::tribool down)
CGI->curh->changeGraphic(0,0); CGI->curh->changeGraphic(0,0);
LOCPLINT->curint->deactivate(); LOCPLINT->curint->deactivate();
CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, 90, 2), myHero); CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), myHero);
spellWindow->activate(); spellWindow->activate();
LOCPLINT->objsToBlit.push_back(spellWindow); LOCPLINT->objsToBlit.push_back(spellWindow);
} }

@ -11,6 +11,7 @@
#include "client/CBitmapHandler.h" #include "client/CBitmapHandler.h"
#include "client/Graphics.h" #include "client/Graphics.h"
#include "client/CSpellWindow.h" #include "client/CSpellWindow.h"
#include "client/CConfigHandler.h"
#include "global.h" #include "global.h"
#include "hch/CAbilityHandler.h" #include "hch/CAbilityHandler.h"
#include "hch/CArtHandler.h" #include "hch/CArtHandler.h"
@ -24,6 +25,7 @@
#include <boost/assign/std/vector.hpp> #include <boost/assign/std/vector.hpp>
#include <cstdlib> #include <cstdlib>
#include <sstream> #include <sstream>
extern SDL_Surface * screen; extern SDL_Surface * screen;
extern TTF_Font * GEOR16; extern TTF_Font * GEOR16;
using namespace boost::assign; using namespace boost::assign;
@ -697,7 +699,7 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
{ {
ourWindow->deactivate(); ourWindow->deactivate();
CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, 90, 2), ourWindow->curHero); CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), ourWindow->curHero);
spellWindow->activate(); spellWindow->activate();
LOCPLINT->objsToBlit.push_back(spellWindow); LOCPLINT->objsToBlit.push_back(spellWindow);
} }

36
CMT.cpp

@ -82,7 +82,6 @@ int main(int argc, char** argv)
CPG=NULL; CPG=NULL;
atexit(SDL_Quit); atexit(SDL_Quit);
CGameInfo * cgi = CGI = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.) CGameInfo * cgi = CGI = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.)
if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO)==0) if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO)==0)
{ {
screen = SDL_SetVideoMode(conf.cc.resx,conf.cc.resy,conf.cc.bpp,SDL_SWSURFACE|SDL_DOUBLEBUF|(conf.cc.fullscreen?SDL_FULLSCREEN:0)); //initializing important global surface screen = SDL_SetVideoMode(conf.cc.resx,conf.cc.resy,conf.cc.bpp,SDL_SWSURFACE|SDL_DOUBLEBUF|(conf.cc.fullscreen?SDL_FULLSCREEN:0)); //initializing important global surface
@ -106,7 +105,7 @@ int main(int argc, char** argv)
THC tlog0<<"\tInitializing fonts: "<<pomtime.getDif()<<std::endl; THC tlog0<<"\tInitializing fonts: "<<pomtime.getDif()<<std::endl;
CMusicHandler * mush = new CMusicHandler; //initializing audio CMusicHandler * mush = new CMusicHandler; //initializing audio
mush->initMusics(); mush->initMusics();
//audio initialized //audio initialized
cgi->mush = mush; cgi->mush = mush;
tlog0<<"\tInitializing sound: "<<pomtime.getDif()<<std::endl; tlog0<<"\tInitializing sound: "<<pomtime.getDif()<<std::endl;
tlog0<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl; tlog0<<"Initializing screen, fonts and sound handling: "<<tmh.getDif()<<std::endl;
@ -149,7 +148,7 @@ int main(int argc, char** argv)
tlog0<<"Message handler: "<<tmh.getDif()<<std::endl; tlog0<<"Message handler: "<<tmh.getDif()<<std::endl;
CPreGame * cpg = new CPreGame(); //main menu and submenus CPreGame * cpg = new CPreGame(); //main menu and submenus
tlog0<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl; tlog0<<"Initialization CPreGame (together): "<<tmh.getDif()<<std::endl;
tlog0<<"Initialization of VCMI (togeter): "<<total.getDif()<<std::endl; tlog0<<"Initialization of VCMI (together): "<<total.getDif()<<std::endl;
cpg->mush = mush; cpg->mush = mush;
StartInfo *options = new StartInfo(cpg->runLoop()); StartInfo *options = new StartInfo(cpg->runLoop());
@ -214,23 +213,20 @@ int main(int argc, char** argv)
tlog0 << "Ending...\n"; tlog0 << "Ending...\n";
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
//else if(ev.type == SDL_KEYDOWN && ev.key.keysym.sym==SDLK_F4) else if(ev.type == SDL_KEYDOWN && ev.key.keysym.sym==SDLK_F4)
//{ {
// LOCPLINT->pim->lock(); LOCPLINT->pim->lock();
// screen2 = SDL_CreateRGBSurface(SDL_SWSURFACE, screen->w, screen->h, screen->format->BitsPerPixel, rmask, gmask, bmask, amask); screen = SDL_SetVideoMode(screen->w,screen->h,screen->format->BitsPerPixel,
// SDL_SaveBMP(screen,"scra"); SDL_SWSURFACE|SDL_DOUBLEBUF|((screen->flags&SDL_FULLSCREEN) ? 0 : SDL_FULLSCREEN));
// SDL_SaveBMP(screen2,"scr2a"); LOCPLINT->curint->show();
// int hlp = SDL_BlitSurface(screen,0,screen2,0); if(LOCPLINT->curint != LOCPLINT->adventureInt)
// SDL_SaveBMP(screen2,"scr2b"); LOCPLINT->adventureInt->show();
// screen = SDL_SetVideoMode(screen->w,screen->h,screen->format->BitsPerPixel, if(LOCPLINT->curint == LOCPLINT->castleInt)
// SDL_SWSURFACE|SDL_DOUBLEBUF|((screen->flags&SDL_FULLSCREEN) ? 0 : SDL_FULLSCREEN)); LOCPLINT->castleInt->showAll(0,true);
// SDL_SaveBMP(screen,"scrb"); if(LOCPLINT->curint->subInt)
// SDL_BlitSurface(screen2,0,screen,0); LOCPLINT->curint->subInt->show();
// SDL_SaveBMP(screen,"scrc"); LOCPLINT->pim->unlock();
// SDL_FreeSurface(screen2); }
// SDL_Flip(screen);
// LOCPLINT->pim->unlock();
//}
eventsM.lock(); eventsM.lock();
events.push(ev); events.push(ev);
eventsM.unlock(); eventsM.unlock();

@ -218,34 +218,34 @@ CSpellWindow::CSpellWindow(const SDL_Rect & myRect, const CGHeroInstance * myHer
statusBar = new CStatusBar(97, 571, "Spelroll.bmp"); statusBar = new CStatusBar(7 + pos.x, 569 + pos.y, "Spelroll.bmp");
SDL_Rect temp_rect = genRect(45, 35, 569, 407); SDL_Rect temp_rect = genRect(45, 35, 479 + pos.x, 405 + pos.y);
exitBtn = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fexitb, this), CGI->generaltexth->zelp[460].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[460].first)), boost::bind(&CStatusBar::clear, statusBar)); exitBtn = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fexitb, this), CGI->generaltexth->zelp[460].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[460].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(45, 35, 311, 407); temp_rect = genRect(45, 35, 221 + pos.x, 405 + pos.y);
battleSpells = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fbattleSpellsb, this), CGI->generaltexth->zelp[453].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[453].first)), boost::bind(&CStatusBar::clear, statusBar)); battleSpells = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fbattleSpellsb, this), CGI->generaltexth->zelp[453].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[453].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(45, 35, 445, 407); temp_rect = genRect(45, 35, 355 + pos.x, 405 + pos.y);
adventureSpells = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fadvSpellsb, this), CGI->generaltexth->zelp[452].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[452].first)), boost::bind(&CStatusBar::clear, statusBar)); adventureSpells = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fadvSpellsb, this), CGI->generaltexth->zelp[452].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[452].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(45, 35, 508, 407); temp_rect = genRect(45, 35, 418 + pos.x, 405 + pos.y);
manaPoints = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fmanaPtsb, this), CGI->generaltexth->zelp[459].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[459].first)), boost::bind(&CStatusBar::clear, statusBar)); manaPoints = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fmanaPtsb, this), CGI->generaltexth->zelp[459].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[459].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(36, 56, 639, 96); temp_rect = genRect(36, 56, 549 + pos.x, 94 + pos.y);
selectSpellsA = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsAb, this), CGI->generaltexth->zelp[454].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[454].first)), boost::bind(&CStatusBar::clear, statusBar)); selectSpellsA = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsAb, this), CGI->generaltexth->zelp[454].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[454].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(36, 56, 639, 153); temp_rect = genRect(36, 56, 549 + pos.x, 151 + pos.y);
selectSpellsE = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsEb, this), CGI->generaltexth->zelp[457].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[457].first)), boost::bind(&CStatusBar::clear, statusBar)); selectSpellsE = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsEb, this), CGI->generaltexth->zelp[457].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[457].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(36, 56, 639, 212); temp_rect = genRect(36, 56, 549 + pos.x, 210 + pos.y);
selectSpellsF = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsFb, this), CGI->generaltexth->zelp[455].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[455].first)), boost::bind(&CStatusBar::clear, statusBar)); selectSpellsF = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsFb, this), CGI->generaltexth->zelp[455].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[455].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(36, 56, 639, 272); temp_rect = genRect(36, 56, 549 + pos.x, 270 + pos.y);
selectSpellsW = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsWb, this), CGI->generaltexth->zelp[456].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[456].first)), boost::bind(&CStatusBar::clear, statusBar)); selectSpellsW = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsWb, this), CGI->generaltexth->zelp[456].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[456].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(36, 56, 639, 332); temp_rect = genRect(36, 56, 549 + pos.x, 330 + pos.y);
selectSpellsAll = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsAllb, this), CGI->generaltexth->zelp[458].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[458].first)), boost::bind(&CStatusBar::clear, statusBar)); selectSpellsAll = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fspellsAllb, this), CGI->generaltexth->zelp[458].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[458].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(leftCorner->h, leftCorner->w, 187, 79); temp_rect = genRect(leftCorner->h, leftCorner->w, 97 + pos.x, 77 + pos.y);
lCorner = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fLcornerb, this), CGI->generaltexth->zelp[450].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[450].first)), boost::bind(&CStatusBar::clear, statusBar)); lCorner = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fLcornerb, this), CGI->generaltexth->zelp[450].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[450].first)), boost::bind(&CStatusBar::clear, statusBar));
temp_rect = genRect(rightCorner->h, rightCorner->w, 577, 76); temp_rect = genRect(rightCorner->h, rightCorner->w, 487 + pos.x, 72 + pos.y);
rCorner = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fRcornerb, this), CGI->generaltexth->zelp[451].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[451].first)), boost::bind(&CStatusBar::clear, statusBar)); rCorner = new SpellbookInteractiveArea(temp_rect, boost::bind(&CSpellWindow::fRcornerb, this), CGI->generaltexth->zelp[451].second, boost::bind(&CStatusBar::print, statusBar, (CGI->generaltexth->zelp[451].first)), boost::bind(&CStatusBar::clear, statusBar));
//areas for spells //areas for spells
int xpos = 207, ypos = 92; int xpos = 117 + pos.x, ypos = 90 + pos.y;
for(int v=0; v<12; ++v) for(int v=0; v<12; ++v)
{ {
@ -254,7 +254,7 @@ CSpellWindow::CSpellWindow(const SDL_Rect & myRect, const CGHeroInstance * myHer
if(v == 5) //to right page if(v == 5) //to right page
{ {
xpos = 426; ypos = 92; xpos = 336 + pos.x; ypos = 90 + pos.y;
} }
else else
{ {
@ -393,14 +393,14 @@ void CSpellWindow::show(SDL_Surface *to)
to = screen; to = screen;
SDL_BlitSurface(background, NULL, to, &pos); SDL_BlitSurface(background, NULL, to, &pos);
blitAt(spellTab->ourImages[selectedTab].bitmap, 614, 96, to); blitAt(spellTab->ourImages[selectedTab].bitmap, 524 + pos.x, 94 + pos.y, to);
statusBar->show(); statusBar->show();
//printing school images //printing school images
if(selectedTab!=4 && spellSite == 0) if(selectedTab!=4 && spellSite == 0)
{ {
blitAt(schools->ourImages[selectedTab].bitmap, 207, 76, to); blitAt(schools->ourImages[selectedTab].bitmap, 117 + pos.x, 74 + pos.y, to);
} }
//printing corners //printing corners

@ -199,7 +199,7 @@ void CMapHandler::roadsRiverTerrainInit()
} }
for (int i=0-Woff;i<ttiles.size()-Woff;i++) for (int i=0-Woff;i<ttiles.size()-Woff;i++)
{ {
for (int j=0-Hoff;j<CGI->mh->map->height+Hoff;j++) for (int j=0-Hoff;j<(int)CGI->mh->map->height+Hoff;j++)
ttiles[i][j].resize(CGI->mh->map->twoLevel+1,0); ttiles[i][j].resize(CGI->mh->map->twoLevel+1,0);
} }