diff --git a/CAdvmapInterface.cpp b/CAdvmapInterface.cpp index aba6fd616..06f377b13 100644 --- a/CAdvmapInterface.cpp +++ b/CAdvmapInterface.cpp @@ -16,6 +16,7 @@ #include #include "CLua.h" #include "hch/CHeroHandler.h" +#include extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX; //fonts using namespace boost::logic; @@ -1173,22 +1174,101 @@ void CResDataBar::draw() } CInfoBar::CInfoBar() { + toNextTick = mode = pom = -1; pos.x=605; pos.y=389; pos.w=194; pos.h=186; + day = CGI->spriteh->giveDef("NEWDAY.DEF"); + week1 = CGI->spriteh->giveDef("NEWWEEK1.DEF"); + week2 = CGI->spriteh->giveDef("NEWWEEK2.DEF"); + week3 = CGI->spriteh->giveDef("NEWWEEK3.DEF"); + week4 = CGI->spriteh->giveDef("NEWWEEK4.DEF"); } -void CInfoBar::draw(void * specific) +CInfoBar::~CInfoBar() { - //if (!specific) - // specific = LOCPLINT->adventureInt->selection.selected; - SDL_Surface * todr = LOCPLINT->infoWin(specific); - if (!todr) - return; - blitAt(todr,pos.x,pos.y); - //SDL_Flip(ekran); - SDL_FreeSurface(todr); + delete day; + delete week1; + delete week2; + delete week3; + delete week4; } +void CInfoBar::draw(const CGObjectInstance * specific) +{ + if (mode==1) + { + //blitAt(day->ourImages[pom].bitmap,pos.x+10,pos.y+10); + return; + } + else if (mode==2) + { + mode = -1; + if(!LOCPLINT->adventureInt->selection.selected) + { + if (LOCPLINT->adventureInt->heroList.items.size()) + { + LOCPLINT->adventureInt->heroList.select(0); + } + } + draw((const CGObjectInstance *)LOCPLINT->adventureInt->selection.selected); + } + if (!specific) + specific = (const CGObjectInstance *)LOCPLINT->adventureInt->selection.selected; + //TODO: to rzutowanie wyglada groznie, ale dziala. Ale nie powinno wygladac groznie. + + if(!specific) + return; + + if(specific->ID == 34) //hero + { + if(LOCPLINT->heroWins.find(specific->subID)!=LOCPLINT->heroWins.end()) + blitAt(LOCPLINT->heroWins[specific->subID],pos.x,pos.y); + + } + + //SDL_Surface * todr = LOCPLINT->infoWin(specific); + //if (!todr) + // return; + //blitAt(todr,pos.x,pos.y); + //SDL_FreeSurface(todr); +} + +void CInfoBar::newDay(int Day) +{ + mode = 1; //showing day + pom = 0; + TimeInterested::activate(); + toNextTick = 500; + //blitAt(day->ourImages[pom].bitmap,pos.x+10,pos.y+10); +} + +void CInfoBar::showComp(SComponent * comp, int time) +{ +} + +void CInfoBar::tick() +{ + if (mode == 1) //new day animation + { + pom++; + if (pom >= day->ourImages.size()) + { + TimeInterested::deactivate(); + toNextTick = -1; + mode = 2; + draw(); + return; + } + toNextTick = 250; + blitAt(day->ourImages[pom].bitmap,pos.x+10,pos.y+10); + std::stringstream txt; + txt << CGI->generaltexth->allTexts[64] << " " << LOCPLINT->cb->getDate(1); + printAtMiddle(txt.str(),700,420,TNRB16,zwykly); + if (pom == day->ourImages.size()-1) + toNextTick+=750; + } +} + CAdvMapInt::CAdvMapInt(int Player) :player(Player), statusbar(7,556), diff --git a/CAdvmapInterface.h b/CAdvmapInterface.h index ffcbb5d5e..99080edc1 100644 --- a/CAdvmapInterface.h +++ b/CAdvmapInterface.h @@ -186,11 +186,19 @@ public: void draw(); }; class CInfoBar - :public virtual CIntObject + :public virtual CIntObject, public TimeInterested { public: + CDefHandler *day, *week1, *week2, *week3, *week4; + int mode; + int pom; + CInfoBar(); - void draw(void * specific=NULL); // if specific==0 function draws info about selected hero/town + ~CInfoBar(); + void newDay(int Day); + void showComp(SComponent * comp, int time=5000); + void tick(); + void draw(const CGObjectInstance * specific=NULL); // if specific==0 function draws info about selected hero/town }; /*****************************/ class CAdvMapInt //adventure map interface @@ -203,7 +211,6 @@ public: int player; std::vector gems; - bool scrollingLeft ; bool scrollingRight ; diff --git a/CPlayerInterface.cpp b/CPlayerInterface.cpp index 61d638933..b8ea8eecf 100644 --- a/CPlayerInterface.cpp +++ b/CPlayerInterface.cpp @@ -107,6 +107,73 @@ void SComponent::deactivate() { ClickableR::deactivate(); } + +void CSelectableComponent::clickLeft(tribool down) +{ + if (down) + { + select(true); + + } +} +CSelectableComponent::CSelectableComponent(Etype Type, int Sub, int Val, SDL_Surface * Border) +:SComponent(Type,Sub,Val) +{ + if (Border) //use custom border + { + border = Border; + } + else //we need to draw border + { + SDL_Surface * symb = SComponent::getImg(); + border = CSDL_Ext::newSurface(symb->w+2,symb->h+2,symb); + SDL_FillRect(border,NULL,0x00FFFF); + for (int i=0;iw;i++) + { + SDL_PutPixel(border,i,0,239,215,123); + SDL_PutPixel(border,i,(border->h)-1,239,215,123); + } + for (int i=0;ih;i++) + { + SDL_PutPixel(border,0,i,239,215,123); + SDL_PutPixel(border,(border->w)-1,i,239,215,123); + } + SDL_SetColorKey(border,SDL_SRCCOLORKEY,SDL_MapRGB(border->format,0,255,255)); + } + selected = false; +} +void CSelectableComponent::activate() +{ + SComponent::activate(); + ClickableL::activate(); +} +void CSelectableComponent::deactivate() +{ + SComponent::deactivate(); + ClickableL::deactivate(); +} +SDL_Surface * CSelectableComponent::getImg() +{ + return myBitmap; +} +void CSelectableComponent::select(bool on) +{ + if(on != selected) + { + blitAt(SComponent::getImg(),1,1,myBitmap); + if (on) + { + blitAt(SComponent::getImg(),0,0,border); + } + selected = on; + return; + } + else + { + return; + } +} + void CSimpleWindow::show(SDL_Surface * to) { if(!to) @@ -122,6 +189,28 @@ CSimpleWindow::~CSimpleWindow() } } +void CSelWindow::selectionChange(SComponent * to) +{ + for (int i=0;i(components[i]); + if (!pom) + continue; + pom->select(false); + } +} +void CSelWindow::okClicked(tribool down) +{ + if(!down) + close(); +} +void CSelWindow::close() +{ + //call owner with selection result + CInfoWindow::close(); +} template CSCButton::CSCButton(CDefHandler * img, CIntObject * obj, void(T::*poin)(tribool), T* Delg) { ourObj = obj; @@ -259,7 +348,15 @@ void MotionInterested::deactivate() LOCPLINT-> motioninterested.erase(std::find(LOCPLINT->motioninterested.begin(),LOCPLINT->motioninterested.end(),this)); } - +void TimeInterested::activate() +{ + LOCPLINT->timeinterested.push_back(this); +} +void TimeInterested::deactivate() +{ + LOCPLINT-> + timeinterested.erase(std::find(LOCPLINT->timeinterested.begin(),LOCPLINT->timeinterested.end(),this)); +} CPlayerInterface::CPlayerInterface(int Player, int serial) { playerID=Player; @@ -291,12 +388,20 @@ void CPlayerInterface::init(ICallback * CB) cb = dynamic_cast(CB); CGI->localPlayer = serialID; adventureInt = new CAdvMapInt(playerID); + + std::vector hh = cb->getHeroesInfo(false); + for(int i=0;i(hh[i]->subID,pom)); + } } void CPlayerInterface::yourTurn() { makingTurn = true; CGI->localPlayer = serialID; unsigned char & animVal = LOCPLINT->adventureInt->anim; //for animations handling + adventureInt->infoBar.newDay(cb->getDate(1)); adventureInt->show(); //show rest of things @@ -306,17 +411,26 @@ void CPlayerInterface::yourTurn() SDL_setFramerate(mainFPSmng, 24); SDL_Event sEvent; //framerate keeper initialized + timeHandler th; + th.getDif(); for(;makingTurn;) // main loop { CGI->screenh->updateScreen(); - + int tv = th.getDif(); + for (int i=0;itoNextTick>=0) + timeinterested[i]->toNextTick-=tv; + if (timeinterested[i]->toNextTick<0) + timeinterested[i]->tick(); + } LOCPLINT->adventureInt->updateScreen = false; while (SDL_PollEvent(&sEvent)) //wait for event... { handleEvent(&sEvent); } ++LOCPLINT->adventureInt->animValHitCount; //for animations - if(LOCPLINT->adventureInt->animValHitCount == 2) + if(LOCPLINT->adventureInt->animValHitCount == 4) { LOCPLINT->adventureInt->animValHitCount = 0; ++animVal; @@ -939,6 +1053,7 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details) CSDL_Ext::update(ekran); CGI->screenh->updateScreen(); LOCPLINT->adventureInt->anim++; + adventureInt->animValHitCount=0; SDL_framerateDelay(mainFPSmng); //for animation purposes } //for(int i=1; i<32; i+=4) //main moving done @@ -1009,46 +1124,69 @@ void CPlayerInterface::heroMoved(const HeroMoveDetails & details) adventureInt->minimap.draw(); adventureInt->heroList.updateMove(ho); } -void CPlayerInterface::heroKilled(const CGHeroInstance*) +void CPlayerInterface::heroKilled(const CGHeroInstance* hero) { + heroWins.erase(hero->ID); } void CPlayerInterface::heroCreated(const CGHeroInstance * hero) { + if(heroWins.find(hero->subID)==heroWins.end()) + heroWins.insert(std::pair(hero->subID,infoWin(hero))); } -SDL_Surface * CPlayerInterface::infoWin(const void * specific) //specific=0 => draws info about selected town/hero //TODO - gdy sie dorobi sensowna hierarchie klas ins. to wywalic tego brzydkiego void* +SDL_Surface * CPlayerInterface::drawHeroInfoWin(const CGHeroInstance * curh) +{ + char * buf = new char[10]; + SDL_Surface * ret = copySurface(hInfo); + SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255)); + blueToPlayersAdv(ret,playerID,1); + printAt(curh->name,75,15,GEOR13,zwykly,ret); + for (int i=0;iprimSkills[i],buf,10); + printAtMiddle(buf,84+28*i,68,GEOR13,zwykly,ret); + } + for (std::map >::const_iterator i=curh->army.slots.begin(); i!=curh->army.slots.end();i++) + { + blitAt(CGI->creh->smallImgs[(*i).second.first->idNumber],slotsPos[(*i).first].first+1,slotsPos[(*i).first].second+1,ret); + itoa((*i).second.second,buf,10); + printAtMiddle(buf,slotsPos[(*i).first].first+17,slotsPos[(*i).first].second+39,GEORM,zwykly,ret); + } + blitAt(curh->type->portraitLarge,11,12,ret); + itoa(curh->mana,buf,10); + printAtMiddle(buf,166,109,GEORM,zwykly,ret); //mana points + delete buf; + blitAt(morale22->ourImages[curh->getCurrentMorale()+3].bitmap,14,84,ret); + blitAt(luck22->ourImages[curh->getCurrentLuck()+3].bitmap,14,101,ret); + //SDL_SaveBMP(ret,"inf1.bmp"); + return ret; +} + +SDL_Surface * CPlayerInterface::drawTownInfoWin(const CGTownInstance * curh) +{ + return NULL; +} + +SDL_Surface * CPlayerInterface::infoWin(const CGObjectInstance * specific) //specific=0 => draws info about selected town/hero { if (specific) - ;//TODO: dorobic, ale w ogole to moze lepiej najpierw zastapic tego voida czym innym + { + switch (specific->ID) + { + case 34: + return drawHeroInfoWin(dynamic_cast(specific)); + break; + default: + return NULL; + break; + } + } else { if (adventureInt->selection.type == HEROI_TYPE) { - char * buf = new char[10]; - SDL_Surface * ret = copySurface(hInfo); - SDL_SetColorKey(ret,SDL_SRCCOLORKEY,SDL_MapRGB(ret->format,0,255,255)); - blueToPlayersAdv(ret,playerID,1); const CGHeroInstance * curh = (const CGHeroInstance *)adventureInt->selection.selected; - printAt(curh->name,75,15,GEOR13,zwykly,ret); - for (int i=0;iprimSkills[i],buf,10); - printAtMiddle(buf,84+28*i,68,GEOR13,zwykly,ret); - } - for (std::map >::const_iterator i=curh->army.slots.begin(); i!=curh->army.slots.end();i++) - { - blitAt(CGI->creh->smallImgs[(*i).second.first->idNumber],slotsPos[(*i).first].first+1,slotsPos[(*i).first].second+1,ret); - itoa((*i).second.second,buf,10); - printAtMiddle(buf,slotsPos[(*i).first].first+17,slotsPos[(*i).first].second+39,GEORM,zwykly,ret); - } - blitAt(curh->type->portraitLarge,11,12,ret); - itoa(curh->mana,buf,10); - printAtMiddle(buf,166,109,GEORM,zwykly,ret); //mana points - delete buf; - blitAt(morale22->ourImages[curh->getCurrentMorale()+3].bitmap,14,84,ret); - blitAt(luck22->ourImages[curh->getCurrentLuck()+3].bitmap,14,101,ret); - //SDL_SaveBMP(ret,"inf1.bmp"); - return ret; + return drawHeroInfoWin(curh); } else if (adventureInt->selection.type == TOWNI_TYPE) { @@ -1105,6 +1243,17 @@ void CPlayerInterface::handleEvent(SDL_Event *sEvent) case (SDLK_u): { adventureInt->underground.clickLeft(true); + break; + } + case (SDLK_m): + { + adventureInt->moveHero.clickLeft(true); + break; + } + case (SDLK_e): + { + adventureInt->endTurn.clickLeft(true); + break; } } } //keydown end @@ -1135,6 +1284,17 @@ void CPlayerInterface::handleEvent(SDL_Event *sEvent) case (SDLK_u): { adventureInt->underground.clickLeft(false); + break; + } + case (SDLK_m): + { + adventureInt->moveHero.clickLeft(false); + break; + } + case (SDLK_e): + { + adventureInt->endTurn.clickLeft(false); + break; } } }//keyup end @@ -1256,6 +1416,8 @@ int3 CPlayerInterface::repairScreenPos(int3 pos) } void CPlayerInterface::heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) { + SDL_FreeSurface(heroWins[hero->ID]);//TODO: moznaby zmieniac jedynie fragment bitmapy zwiazany z dana umiejetnoscia + heroWins[hero->ID] = infoWin(hero); //a nie przerysowywac calosc. Troche roboty, obecnie chyba nie wartej swieczki. if (adventureInt->selection.selected == hero) adventureInt->infoBar.draw(); return; diff --git a/CPlayerInterface.h b/CPlayerInterface.h index cd6c77ea3..8f42d6667 100644 --- a/CPlayerInterface.h +++ b/CPlayerInterface.h @@ -97,7 +97,14 @@ public: virtual void activate()=0; virtual void deactivate()=0; }; - +class TimeInterested: public virtual CIntObject +{ +public: + int toNextTick; + virtual void tick()=0; + virtual void activate(); + virtual void deactivate(); +}; template class CSCButton: public CButtonBase, public ClickableL //prosty guzik, ktory tylko zmienia obrazek { public: @@ -117,12 +124,17 @@ class CInfoWindow : public CSimpleWindow //text + comp. + ok button public: CSCButton okb; std::vector components; - void okClicked(tribool down); - void close(); + virtual void okClicked(tribool down); + virtual void close(); CInfoWindow(); ~CInfoWindow(); }; - +class CSelWindow : public CInfoWindow //component selection window +{ + void selectionChange(SComponent * to); + void okClicked(tribool down); + void close(); +}; class SComponent : public ClickableR { public: @@ -138,11 +150,24 @@ public: SComponent(Etype Type, int Subtype, int Val); //SComponent(const & SComponent r); - SDL_Surface * getImg(); void clickRight (tribool down); + virtual SDL_Surface * getImg(); + virtual void activate(); + virtual void deactivate(); +}; + +class CSelectableComponent : public SComponent, public ClickableL +{ +public: + bool selected; + SDL_Surface * border, *myBitmap; + void clickLeft(tribool down); + CSelectableComponent(Etype Type, int Sub, int Val, SDL_Surface * Border=NULL); void activate(); void deactivate(); + void select(bool on); + SDL_Surface * getImg(); }; class CPlayerInterface : public CGameInterface @@ -161,29 +186,34 @@ public: std::vector hoverable; std::vector keyinterested; std::vector motioninterested; + std::vector timeinterested; std::vector objsToBlit; SDL_Surface * hInfo; std::vector > slotsPos; CDefEssential *luck22, *luck30, *luck42, *luck82, *morale22, *morale30, *morale42, *morale82; + std::map heroWins; + //std::map townWins; //overloaded funcs from Interface void yourTurn(); void heroMoved(const HeroMoveDetails & details); void tileRevealed(int3 pos); void tileHidden(int3 pos); - void heroKilled(const CGHeroInstance*); - void heroCreated(const CGHeroInstance*); + void heroKilled(const CGHeroInstance* hero); + void heroCreated(const CGHeroInstance* hero); void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val); void receivedResource(int type, int val); - SDL_Surface * infoWin(const void * specific); //specific=0 => draws info about selected town/hero //TODO - gdy sie dorobi sensowna hierarchie klas ins. to wywalic tego brzydkiego void* + SDL_Surface * infoWin(const CGObjectInstance * specific); //specific=0 => draws info about selected town/hero //TODO - gdy sie dorobi sensowna hierarchie klas ins. to wywalic tego brzydkiego void* void handleEvent(SDL_Event * sEvent); void init(ICallback * CB); int3 repairScreenPos(int3 pos); void showInfoDialog(std::string text, std::vector & components); void removeObjToBlit(IShowable* obj); + SDL_Surface * drawHeroInfoWin(const CGHeroInstance * curh); + SDL_Surface * drawTownInfoWin(const CGTownInstance * curh); CPlayerInterface(int Player, int serial); }; \ No newline at end of file