#pragma once #include "SDL_Extensions.h" #include "hch\CDefHandler.h" #include "CGameInfo.h" #include "hch\CLodHandler.h" #include "hch\CPreGameTextHandler.h" #include "hch/CTownHandler.h" #include "CLua.h" #include "CPlayerInterface.h" template class AdventureMapButton : public ClickableL, public ClickableR, public Hoverable, public KeyInterested, public CButtonBase { public: std::string name; //for status bar std::string helpBox; //for right-click help char key; //key shortcut T* owner; void (T::*function)(); //function in CAdvMapInt called when this button is pressed, different for each button bool colorChange; void clickRight (tribool down); void clickLeft (tribool down); virtual void hover (bool on); void keyPressed (SDL_KeyboardEvent & key); void activate(); // makes button active void deactivate(); // makes button inactive (but doesn't delete) AdventureMapButton(); //c-tor AdventureMapButton( std::string Name, std::string HelpBox, void(T::*Function)(), int x, int y, std::string defName, T* Owner, bool activ=false, std::vector * add = NULL, bool playerColoredButton = true );//c-tor }; template AdventureMapButton::AdventureMapButton () { type=2; abs=true; active=false; ourObj=NULL; state=0; } template AdventureMapButton::AdventureMapButton ( std::string Name, std::string HelpBox, void(T::*Function)(), int x, int y, std::string defName, T* Owner, bool activ, std::vector * add, bool playerColoredButton ) { owner = Owner; type=2; abs=true; active=false; ourObj=NULL; state=0; name=Name; helpBox=HelpBox; colorChange = playerColoredButton; int est = LOCPLINT->playerID; CDefHandler * temp = CGI->spriteh->giveDef(defName); temp->notFreeImgs = true; for (int i=0;iourImages.size();i++) { imgs.resize(1); imgs[0].push_back(temp->ourImages[i].bitmap); if(playerColoredButton) CSDL_Ext::blueToPlayersAdv(imgs[curimg][i],LOCPLINT->playerID); } delete temp; if (add) { imgs.resize(imgs.size()+add->size()); for (int i=0; isize();i++) { temp = CGI->spriteh->giveDef((*add)[i]); temp->notFreeImgs = true; for (int j=0;jourImages.size();j++) { imgs[i+1].push_back(temp->ourImages[j].bitmap); if(playerColoredButton) CSDL_Ext::blueToPlayersAdv(imgs[1+i][j],LOCPLINT->playerID); } delete temp; } delete add; } function = Function; pos.x=x; pos.y=y; pos.w = imgs[curimg][0]->w; pos.h = imgs[curimg][0]->h -1; if (activ) activate(); } template void AdventureMapButton::clickLeft (tribool down) { if (down) { state=1; } else { state=0; } show(); if (pressedL && (down==false)) { pressedL=state; (owner->*function)(); } else { pressedL=state; } } template void AdventureMapButton::clickRight (tribool down) { if(helpBox.size()) //there is no point to show window with nothing inside... LOCPLINT->adventureInt->handleRightClick(helpBox,down,this); } template void AdventureMapButton::hover (bool on) { Hoverable::hover(on); if(name.size()) //if there is no name, there is nohing to display also { if (on) LOCPLINT->statusbar->print(name); else if (LOCPLINT->statusbar->getCurrent()==name) LOCPLINT->statusbar->clear(); } } template void AdventureMapButton::activate() { if (active) return; active=true; ClickableL::activate(); ClickableR::activate(); Hoverable::activate(); KeyInterested::activate(); } template void AdventureMapButton::keyPressed (SDL_KeyboardEvent & key) { //TODO: check if it's shortcut } template void AdventureMapButton::deactivate() { if (!active) return; active=false; ClickableL::deactivate(); ClickableR::deactivate(); Hoverable::deactivate(); KeyInterested::deactivate(); } template CTownList::~CTownList() { delete arrup; delete arrdo; } template CTownList::CTownList(int Size, SDL_Rect * Pos, int arupx, int arupy, int ardox, int ardoy) :CList(Size) { pos = *Pos; arrup = CGI->spriteh->giveDef("IAM014.DEF"); arrdo = CGI->spriteh->giveDef("IAM015.DEF"); arrupp.x=arupx; arrupp.y=arupy; arrupp.w=arrup->ourImages[0].bitmap->w; arrupp.h=arrup->ourImages[0].bitmap->h; arrdop.x=ardox; arrdop.y=ardoy; arrdop.w=arrdo->ourImages[0].bitmap->w; arrdop.h=arrdo->ourImages[0].bitmap->h; posporx = arrdop.x; pospory = arrupp.y + arrupp.h; pressed = indeterminate; from = 0; } template void CTownList::genList() { int howMany = LOCPLINT->cb->howManyTowns(); for (int i=0;icb->getTownInfo(i,0)); } } template void CTownList::select(int which) { if (which>=items.size()) return; selected = which; if(owner) (owner->*fun)(); } template void CTownList::mouseMoved (SDL_MouseMotionEvent & sEvent) { if(isItIn(&arrupp,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y)) { if (from>0) LOCPLINT->statusbar->print(CGI->preth->zelp[306].first); else LOCPLINT->statusbar->clear(); return; } else if(isItIn(&arrdop,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y)) { if ((items.size()-from) > SIZE) LOCPLINT->statusbar->print(CGI->preth->zelp[307].first); else LOCPLINT->statusbar->clear(); return; } //if not buttons then towns int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y; hx-=pos.x; hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h; float ny = (float)hy/(float)32; if ((ny>SIZE || ny<0) || (from+ny>=items.size())) { LOCPLINT->statusbar->clear(); return; }; LOCPLINT->statusbar->print(items[from+ny]->state->hoverText(const_cast(items[from+ny]))); } template void CTownList::clickLeft(tribool down) { if (down) { /***************************ARROWS*****************************************/ if(isItIn(&arrupp,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y) && from>0) { blitAt(arrup->ourImages[1].bitmap,arrupp.x,arrupp.y); pressed = true; return; } else if(isItIn(&arrdop,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y) && (items.size()-from>SIZE)) { blitAt(arrdo->ourImages[1].bitmap,arrdop.x,arrdop.y); pressed = false; return; } /***************************TOWNS*****************************************/ int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y; hx-=pos.x; hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h; float ny = (float)hy/(float)32; if (ny>SIZE || ny<0) return; if (SIZE==5 && ((int)(ny+from))==selected && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE)) LOCPLINT->openTownWindow(items[selected]);//print town screen else select(ny+from); } else { if (indeterminate(pressed)) return; if (pressed) //up { blitAt(arrup->ourImages[0].bitmap,arrupp.x,arrupp.y); pressed = indeterminate; if (!down) { from--; if (from<0) from=0; draw(); } } else if (!pressed) //down { blitAt(arrdo->ourImages[0].bitmap,arrdop.x,arrdop.y); pressed = indeterminate; if (!down) { from++; //if (from void CTownList::clickRight(tribool down) { if (down) { /***************************ARROWS*****************************************/ if(isItIn(&arrupp,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y) && from>0) { LOCPLINT->adventureInt->handleRightClick(CGI->preth->zelp[306].second,down,this); } else if(isItIn(&arrdop,LOCPLINT->current->motion.x,LOCPLINT->current->motion.y) && (items.size()-from>5)) { LOCPLINT->adventureInt->handleRightClick(CGI->preth->zelp[307].second,down,this); } //if not buttons then towns int hx = LOCPLINT->current->motion.x, hy = LOCPLINT->current->motion.y; hx-=pos.x; hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h; float ny = (float)hy/(float)32; if ((ny>5 || ny<0) || (from+ny>=items.size())) { return; } //show popup CInfoPopup * ip = new CInfoPopup(LOCPLINT->townWins[items[from+ny]->identifier],LOCPLINT->current->motion.x-LOCPLINT->townWins[items[from+ny]->identifier]->w,LOCPLINT->current->motion.y-LOCPLINT->townWins[items[from+ny]->identifier]->h,false); ip->activate(); } else { LOCPLINT->adventureInt->handleRightClick(CGI->preth->zelp[306].second,down,this); LOCPLINT->adventureInt->handleRightClick(CGI->preth->zelp[307].second,down,this); } } template void CTownList::hover (bool on) { } template void CTownList::keyPressed (SDL_KeyboardEvent & key) { } template void CTownList::draw() { for (int iT=0+from;iT=items.size()) { blitAt(CGI->townh->getPic(-1),posporx,pospory+i*32); continue; } blitAt(CGI->townh->getPic(items[iT]->subID,items[iT]->hasFort(),items[iT]->builded),posporx,pospory+i*32); if ((selected == iT) && (LOCPLINT->adventureInt->selection.type == TOWNI_TYPE)) { blitAt(CGI->townh->getPic(-2),posporx,pospory+i*32); } } if (from>0) blitAt(arrup->ourImages[0].bitmap,arrupp.x,arrupp.y); else blitAt(arrup->ourImages[2].bitmap,arrupp.x,arrupp.y); if (items.size()-from>SIZE) blitAt(arrdo->ourImages[0].bitmap,arrdop.x,arrdop.y); else blitAt(arrdo->ourImages[2].bitmap,arrdop.x,arrdop.y); }