CGameInterface.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. #include "stdafx.h"
  2. #include "CGameInterface.h"
  3. #include "CAdvMapInterface.h"
  4. #include "CMessage.h"
  5. #include "SDL_Extensions.h"
  6. #include "SDL_framerate.h"
  7. #include "CScreenHandler.h"
  8. #include "CCursorHandler.h"
  9. using namespace CSDL_Ext;
  10. CButtonBase::CButtonBase()
  11. {
  12. curimg=0;
  13. type=-1;
  14. abs=false;
  15. active=false;
  16. ourObj=NULL;
  17. state=0;
  18. }
  19. void CButtonBase::show()
  20. {
  21. if (abs)
  22. {
  23. blitAt(imgs[curimg][state],pos.x,pos.y);
  24. updateRect(&pos);
  25. }
  26. else
  27. {
  28. blitAt(imgs[curimg][state],pos.x+ourObj->pos.x,pos.y+ourObj->pos.y);
  29. updateRect(&genRect(pos.h,pos.w,pos.x+ourObj->pos.x,pos.y+ourObj->pos.y));
  30. }
  31. }
  32. ClickableL::ClickableL()
  33. {
  34. pressedL=false;
  35. }
  36. void ClickableL::clickLeft(tribool down)
  37. {
  38. if (down)
  39. pressedL=true;
  40. else
  41. pressedL=false;
  42. }
  43. void ClickableL::activate()
  44. {
  45. LOCPLINT->lclickable.push_back(this);
  46. }
  47. void ClickableL::deactivate()
  48. {
  49. LOCPLINT->lclickable.erase
  50. (std::find(LOCPLINT->lclickable.begin(),LOCPLINT->lclickable.end(),this));
  51. }
  52. ClickableR::ClickableR()
  53. {
  54. pressedR=false;
  55. }
  56. void ClickableR::activate()
  57. {
  58. LOCPLINT->rclickable.push_back(this);
  59. }
  60. void ClickableR::deactivate()
  61. {
  62. LOCPLINT->rclickable.erase(std::find(LOCPLINT->rclickable.begin(),LOCPLINT->rclickable.end(),this));
  63. }
  64. void Hoverable::activate()
  65. {
  66. LOCPLINT->hoverable.push_back(this);
  67. }
  68. void Hoverable::deactivate()
  69. {
  70. LOCPLINT->hoverable.erase(std::find(LOCPLINT->hoverable.begin(),LOCPLINT->hoverable.end(),this));
  71. }
  72. void Hoverable::hover(bool on)
  73. {
  74. hovered=on;
  75. }
  76. void KeyInterested::activate()
  77. {
  78. LOCPLINT->keyinterested.push_back(this);
  79. }
  80. void KeyInterested::deactivate()
  81. {
  82. LOCPLINT->
  83. keyinterested.erase(std::find(LOCPLINT->keyinterested.begin(),LOCPLINT->keyinterested.end(),this));
  84. }
  85. void MotionInterested::activate()
  86. {
  87. LOCPLINT->motioninterested.push_back(this);
  88. }
  89. void MotionInterested::deactivate()
  90. {
  91. LOCPLINT->
  92. motioninterested.erase(std::find(LOCPLINT->motioninterested.begin(),LOCPLINT->motioninterested.end(),this));
  93. }
  94. CPlayerInterface::CPlayerInterface(int Player, int serial)
  95. {
  96. playerID=Player;
  97. serialID=serial;
  98. CGI->localPlayer = playerID;
  99. human=true;
  100. }
  101. void CPlayerInterface::init()
  102. {
  103. CGI->localPlayer = serialID;
  104. adventureInt = new CAdvMapInt(playerID);
  105. }
  106. void CPlayerInterface::yourTurn()
  107. {
  108. CGI->localPlayer = serialID;
  109. unsigned char & animVal = LOCPLINT->adventureInt->anim; //for animations handling
  110. adventureInt->show();
  111. //show rest of things
  112. //initializing framerate keeper
  113. FPSmanager * mainLoopFramerateKeeper = new FPSmanager;
  114. SDL_initFramerate(mainLoopFramerateKeeper);
  115. SDL_setFramerate(mainLoopFramerateKeeper, 24);
  116. SDL_Event sEvent;
  117. //framerate keeper initialized
  118. for(;;) // main loop
  119. {
  120. CGI->screenh->updateScreen();
  121. LOCPLINT->adventureInt->updateScreen = false;
  122. while (SDL_PollEvent(&sEvent)) //wait for event...
  123. {
  124. handleEvent(&sEvent);
  125. }
  126. ++LOCPLINT->adventureInt->animValHitCount; //for animations
  127. if(LOCPLINT->adventureInt->animValHitCount == 2)
  128. {
  129. LOCPLINT->adventureInt->animValHitCount = 0;
  130. ++animVal;
  131. LOCPLINT->adventureInt->updateScreen = true;
  132. }
  133. if(LOCPLINT->adventureInt->scrollingLeft)
  134. {
  135. if(LOCPLINT->adventureInt->position.x>-Woff)
  136. {
  137. LOCPLINT->adventureInt->position.x--;
  138. LOCPLINT->adventureInt->updateScreen = true;
  139. }
  140. }
  141. if(LOCPLINT->adventureInt->scrollingRight)
  142. {
  143. if(LOCPLINT->adventureInt->position.x<CGI->ac->map.width-19+4)
  144. {
  145. LOCPLINT->adventureInt->position.x++;
  146. LOCPLINT->adventureInt->updateScreen = true;
  147. }
  148. }
  149. if(LOCPLINT->adventureInt->scrollingUp)
  150. {
  151. if(LOCPLINT->adventureInt->position.y>-Hoff)
  152. {
  153. LOCPLINT->adventureInt->position.y--;
  154. LOCPLINT->adventureInt->updateScreen = true;
  155. }
  156. }
  157. if(LOCPLINT->adventureInt->scrollingDown)
  158. {
  159. if(LOCPLINT->adventureInt->position.y<CGI->ac->map.height-18+4)
  160. {
  161. LOCPLINT->adventureInt->position.y++;
  162. LOCPLINT->adventureInt->updateScreen = true;
  163. }
  164. }
  165. if(LOCPLINT->adventureInt->updateScreen)
  166. {
  167. adventureInt->update();
  168. LOCPLINT->adventureInt->updateScreen=false;
  169. }
  170. SDL_Delay(5); //give time for other apps
  171. SDL_framerateDelay(mainLoopFramerateKeeper);
  172. }
  173. }
  174. void CPlayerInterface::heroMoved(const HeroMoveDetails & details)
  175. {
  176. }
  177. void CPlayerInterface::handleEvent(SDL_Event *sEvent)
  178. {
  179. current = sEvent;
  180. if(sEvent->type == SDL_MOUSEMOTION)
  181. {
  182. CGI->curh->cursorMove(sEvent->motion.x, sEvent->motion.y);
  183. }
  184. if(sEvent->type==SDL_QUIT)
  185. exit(0);
  186. else if (sEvent->type==SDL_KEYDOWN)
  187. {
  188. switch (sEvent->key.keysym.sym)
  189. {
  190. case SDLK_LEFT:
  191. {
  192. LOCPLINT->adventureInt->scrollingLeft = true;
  193. break;
  194. }
  195. case (SDLK_RIGHT):
  196. {
  197. LOCPLINT->adventureInt->scrollingRight = true;
  198. break;
  199. }
  200. case (SDLK_UP):
  201. {
  202. LOCPLINT->adventureInt->scrollingUp = true;
  203. break;
  204. }
  205. case (SDLK_DOWN):
  206. {
  207. LOCPLINT->adventureInt->scrollingDown = true;
  208. break;
  209. }
  210. case (SDLK_q):
  211. {
  212. exit(0);
  213. break;
  214. }
  215. case (SDLK_u):
  216. {
  217. adventureInt->underground.clickLeft(true);
  218. }
  219. }
  220. } //keydown end
  221. else if(sEvent->type==SDL_KEYUP)
  222. {
  223. switch (sEvent->key.keysym.sym)
  224. {
  225. case SDLK_LEFT:
  226. {
  227. LOCPLINT->adventureInt->scrollingLeft = false;
  228. break;
  229. }
  230. case (SDLK_RIGHT):
  231. {
  232. LOCPLINT->adventureInt->scrollingRight = false;
  233. break;
  234. }
  235. case (SDLK_UP):
  236. {
  237. LOCPLINT->adventureInt->scrollingUp = false;
  238. break;
  239. }
  240. case (SDLK_DOWN):
  241. {
  242. LOCPLINT->adventureInt->scrollingDown = false;
  243. break;
  244. }
  245. case (SDLK_u):
  246. {
  247. adventureInt->underground.clickLeft(false);
  248. }
  249. }
  250. }//keyup end
  251. else if(sEvent->type==SDL_MOUSEMOTION)
  252. {
  253. for (int i=0; i<hoverable.size();i++)
  254. {
  255. if (isItIn(&hoverable[i]->pos,sEvent->motion.x,sEvent->motion.y))
  256. {
  257. if (!hoverable[i]->hovered)
  258. hoverable[i]->hover(true);
  259. }
  260. else if (hoverable[i]->hovered)
  261. {
  262. hoverable[i]->hover(false);
  263. }
  264. }
  265. for(int i=0; i<motioninterested.size();i++)
  266. {
  267. if (isItIn(&motioninterested[i]->pos,sEvent->motion.x,sEvent->motion.y))
  268. {
  269. motioninterested[i]->mouseMoved(sEvent->motion);
  270. }
  271. }
  272. if(sEvent->motion.x<15)
  273. {
  274. LOCPLINT->adventureInt->scrollingLeft = true;
  275. }
  276. else
  277. {
  278. LOCPLINT->adventureInt->scrollingLeft = false;
  279. }
  280. if(sEvent->motion.x>ekran->w-15)
  281. {
  282. LOCPLINT->adventureInt->scrollingRight = true;
  283. }
  284. else
  285. {
  286. LOCPLINT->adventureInt->scrollingRight = false;
  287. }
  288. if(sEvent->motion.y<15)
  289. {
  290. LOCPLINT->adventureInt->scrollingUp = true;
  291. }
  292. else
  293. {
  294. LOCPLINT->adventureInt->scrollingUp = false;
  295. }
  296. if(sEvent->motion.y>ekran->h-15)
  297. {
  298. LOCPLINT->adventureInt->scrollingDown = true;
  299. }
  300. else
  301. {
  302. LOCPLINT->adventureInt->scrollingDown = false;
  303. }
  304. }
  305. else if ((sEvent->type==SDL_MOUSEBUTTONDOWN) && (sEvent->button.button == SDL_BUTTON_LEFT))
  306. {
  307. for(int i=0; i<lclickable.size();i++)
  308. {
  309. if (isItIn(&lclickable[i]->pos,sEvent->motion.x,sEvent->motion.y))
  310. {
  311. lclickable[i]->clickLeft(true);
  312. }
  313. }
  314. }
  315. else if ((sEvent->type==SDL_MOUSEBUTTONUP) && (sEvent->button.button == SDL_BUTTON_LEFT))
  316. {
  317. for(int i=0; i<lclickable.size();i++)
  318. {
  319. if (isItIn(&lclickable[i]->pos,sEvent->motion.x,sEvent->motion.y))
  320. {
  321. lclickable[i]->clickLeft(false);
  322. }
  323. else
  324. lclickable[i]->clickLeft(boost::logic::indeterminate);
  325. }
  326. }
  327. current = NULL;
  328. } //event end