mapHandler.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  1. #include "stdafx.h"
  2. #include "mapHandler.h"
  3. #include "CSemiDefHandler.h"
  4. #include "SDL_rotozoom.h"
  5. #include "SDL_Extensions.h"
  6. #include "CGameInfo.h"
  7. #include "stdlib.h"
  8. #include <algorithm>
  9. extern SDL_Surface * ekran;
  10. //
  11. //bool ObjSorter::operator <(const ObjSorter & por) const
  12. //{
  13. // if(this->xpos>=por.xpos)
  14. // return false;
  15. // if(this->ypos>=por.ypos)
  16. // return false;
  17. // return true;
  18. //};
  19. class poX
  20. {
  21. public:
  22. bool operator()(const ObjSorter & por2, const ObjSorter & por) const
  23. {
  24. if(por2.xpos<=por.xpos)
  25. return false;
  26. return true;
  27. };
  28. } pox;
  29. class poY
  30. {
  31. public:
  32. bool operator ()(const ObjSorter & por2, const ObjSorter & por) const
  33. {
  34. if(por2.ypos>=por.ypos)
  35. return false;
  36. return true;
  37. };
  38. } poy;
  39. void CMapHandler::init()
  40. {
  41. fullHide = CGameInfo::mainObj->spriteh->giveDef("TSHRC.DEF");
  42. partialHide = CGameInfo::mainObj->spriteh->giveDef("TSHRE.DEF");
  43. for(int i=0; i<partialHide->ourImages.size(); ++i)
  44. {
  45. CSDL_Ext::alphaTransform(partialHide->ourImages[i].bitmap);
  46. }
  47. visibility.resize(reader->map.width+2*Woff);
  48. for(int gg=0; gg<reader->map.width+2*Woff; ++gg)
  49. {
  50. visibility[gg].resize(reader->map.height+2*Hoff);
  51. for(int jj=0; jj<reader->map.height+2*Hoff; ++jj)
  52. visibility[gg][jj] = true;
  53. }
  54. undVisibility.resize(reader->map.width+2*Woff);
  55. for(int gg=0; gg<reader->map.width+2*Woff; ++gg)
  56. {
  57. undVisibility[gg].resize(reader->map.height+2*Woff);
  58. for(int jj=0; jj<reader->map.height+2*Woff; ++jj)
  59. undVisibility[gg][jj] = true;
  60. }
  61. visibility[6][7] = false;
  62. undVisibility[5][7] = false;
  63. visibility[7][7] = false;
  64. visibility[6][8] = false;
  65. visibility[6][6] = false;
  66. //visibility[5][6] = false;
  67. //visibility[7][8] = false;
  68. visibility[5][8] = false;
  69. visibility[7][6] = false;
  70. visibility[6][9] = false;
  71. //initializing road's and river's DefHandlers
  72. #if SDL_BYTEORDER == SDL_BIG_ENDIAN
  73. int rmask = 0xff000000;
  74. int gmask = 0x00ff0000;
  75. int bmask = 0x0000ff00;
  76. int amask = 0x000000ff;
  77. #else
  78. int rmask = 0x000000ff;
  79. int gmask = 0x0000ff00;
  80. int bmask = 0x00ff0000;
  81. int amask = 0xff000000;
  82. #endif
  83. SDL_Surface * su = SDL_CreateRGBSurface(SDL_SWSURFACE, 32, 32, 32,
  84. rmask, gmask, bmask, amask);
  85. roadDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("dirtrd.def"));
  86. roadDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("gravrd.def"));
  87. roadDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("cobbrd.def"));
  88. staticRiverDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("clrrvr.def"));
  89. staticRiverDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("icyrvr.def"));
  90. staticRiverDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("mudrvr.def"));
  91. staticRiverDefs.push_back(CGameInfo::mainObj->spriteh->giveDef("lavrvr.def"));
  92. roadBitmaps = new SDL_Surface **[reader->map.width+2*Woff];
  93. for (int ii=0;ii<reader->map.width+2*Woff;ii++)
  94. roadBitmaps[ii] = new SDL_Surface*[reader->map.height+2*Hoff]; // allocate memory
  95. for (int i=0; i<reader->map.width+2*Woff; i++) //jest po szerokoœci
  96. {
  97. for (int j=0; j<reader->map.height+2*Hoff;j++) //po wysokoœci
  98. {
  99. if(i<Woff || i>reader->map.width+Woff-1 || j<Woff || j>reader->map.height+Hoff-1)
  100. roadBitmaps[i][j] = NULL;
  101. else
  102. {
  103. if(reader->map.terrain[i-Woff][j-Hoff].malle)
  104. {
  105. roadBitmaps[i][j] = roadDefs[reader->map.terrain[i-Woff][j-Hoff].malle-1]->ourImages[reader->map.terrain[i-Woff][j-Hoff].roadDir].bitmap;
  106. int cDir = reader->map.terrain[i-Woff][j-Hoff].roadDir;
  107. if(cDir==0 || cDir==1 || cDir==2 || cDir==3 || cDir==4 || cDir==5)
  108. {
  109. if(i-Woff+1<reader->map.width && j-Hoff-1>0 && reader->map.terrain[i-Woff+1][j-Hoff].malle && reader->map.terrain[i-Woff][j-Hoff-1].malle)
  110. {
  111. roadBitmaps[i][j] = CSDL_Ext::hFlip(roadBitmaps[i][j]);
  112. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  113. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  114. }
  115. if(i-Woff-1>0 && j-Hoff-1>0 && reader->map.terrain[i-Woff-1][j-Hoff].malle && reader->map.terrain[i-Woff][j-Hoff-1].malle)
  116. {
  117. roadBitmaps[i][j] = CSDL_Ext::rotate03(roadBitmaps[i][j]);
  118. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  119. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  120. }
  121. if(i-Woff-1>0 && j-Hoff+1<reader->map.height && reader->map.terrain[i-Woff-1][j-Hoff].malle && reader->map.terrain[i-Woff][j-Hoff+1].malle)
  122. {
  123. roadBitmaps[i][j] = CSDL_Ext::rotate01(roadBitmaps[i][j]);
  124. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  125. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  126. }
  127. }
  128. if(cDir==8 || cDir==9)
  129. {
  130. if(j-Hoff+1<reader->map.height && !(reader->map.terrain[i-Woff][j-Hoff+1].malle))
  131. {
  132. roadBitmaps[i][j] = CSDL_Ext::hFlip(roadBitmaps[i][j]);
  133. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  134. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  135. }
  136. }
  137. if(cDir==6 || cDir==7)
  138. {
  139. if(i-Woff+1<reader->map.width && !(reader->map.terrain[i-Woff+1][j-Hoff].malle))
  140. {
  141. roadBitmaps[i][j] = CSDL_Ext::rotate01(roadBitmaps[i][j]);
  142. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  143. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  144. }
  145. }
  146. if(cDir==0x0e)
  147. {
  148. if(j-Hoff+1<reader->map.height && !(reader->map.terrain[i-Woff][j-Hoff+1].malle))
  149. {
  150. roadBitmaps[i][j] = CSDL_Ext::hFlip(roadBitmaps[i][j]);
  151. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  152. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  153. }
  154. }
  155. if(cDir==0x0f)
  156. {
  157. if(i-Woff+1<reader->map.width && !(reader->map.terrain[i-Woff+1][j-Hoff].malle))
  158. {
  159. roadBitmaps[i][j] = CSDL_Ext::rotate01(roadBitmaps[i][j]);
  160. roadBitmaps[i][j] = CSDL_Ext::alphaTransform(roadBitmaps[i][j]);
  161. roadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(roadBitmaps[i][j], su);
  162. }
  163. }
  164. }
  165. else
  166. roadBitmaps[i][j] = NULL;
  167. }
  168. }
  169. }
  170. undRoadBitmaps = new SDL_Surface **[reader->map.width+2*Woff];
  171. for (int ii=0;ii<reader->map.width+2*Woff;ii++)
  172. undRoadBitmaps[ii] = new SDL_Surface*[reader->map.height+2*Hoff]; // allocate memory
  173. if(reader->map.twoLevel)
  174. {
  175. for (int i=0; i<reader->map.width+2*Woff; i++) //jest po szerokoœci
  176. {
  177. for (int j=0; j<reader->map.height+2*Hoff;j++) //po wysokoœci
  178. {
  179. if(i<Woff || i>reader->map.width+Woff-1 || j<Woff || j>reader->map.height+Hoff-1)
  180. undRoadBitmaps[i][j] = NULL;
  181. else
  182. {
  183. if(reader->map.undergroungTerrain[i-Woff][j-Hoff].malle)
  184. {
  185. undRoadBitmaps[i][j] = roadDefs[reader->map.undergroungTerrain[i-Woff][j-Hoff].malle-1]->ourImages[reader->map.undergroungTerrain[i-Woff][j-Hoff].roadDir].bitmap;
  186. int cDir = reader->map.undergroungTerrain[i-Woff][j-Hoff].roadDir;
  187. if(cDir==0 || cDir==1 || cDir==2 || cDir==3 || cDir==4 || cDir==5)
  188. {
  189. if(i-Woff+1<reader->map.width && j-Hoff-1>0 && reader->map.undergroungTerrain[i-Woff+1][j-Hoff].malle && reader->map.undergroungTerrain[i-Woff][j-Hoff-1].malle)
  190. {
  191. undRoadBitmaps[i][j] = CSDL_Ext::hFlip(undRoadBitmaps[i][j]);
  192. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  193. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  194. }
  195. if(i-Woff-1>0 && j-Hoff-1>0 && reader->map.undergroungTerrain[i-Woff-1][j-Hoff].malle && reader->map.undergroungTerrain[i-Woff][j-Hoff-1].malle)
  196. {
  197. undRoadBitmaps[i][j] = CSDL_Ext::rotate03(undRoadBitmaps[i][j]);
  198. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  199. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  200. }
  201. if(i-Woff-1>0 && j-Hoff+1<reader->map.height && reader->map.undergroungTerrain[i-Woff-1][j-Hoff].malle && reader->map.undergroungTerrain[i-Woff][j-Hoff+1].malle)
  202. {
  203. undRoadBitmaps[i][j] = CSDL_Ext::rotate01(undRoadBitmaps[i][j]);
  204. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  205. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  206. }
  207. }
  208. if(cDir==8 || cDir==9)
  209. {
  210. if(j-Hoff+1<reader->map.height && !(reader->map.undergroungTerrain[i-Woff][j-Hoff+1].malle))
  211. {
  212. undRoadBitmaps[i][j] = CSDL_Ext::hFlip(undRoadBitmaps[i][j]);
  213. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  214. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  215. }
  216. }
  217. if(cDir==6 || cDir==7)
  218. {
  219. if(i-Woff+1<reader->map.width && !(reader->map.undergroungTerrain[i-Woff+1][j-Hoff].malle))
  220. {
  221. undRoadBitmaps[i][j] = CSDL_Ext::rotate01(undRoadBitmaps[i][j]);
  222. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  223. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  224. }
  225. }
  226. if(cDir==0x0e)
  227. {
  228. if(j-Hoff+1<reader->map.height && !(reader->map.undergroungTerrain[i-Woff][j-Hoff+1].malle))
  229. {
  230. undRoadBitmaps[i][j] = CSDL_Ext::hFlip(undRoadBitmaps[i][j]);
  231. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  232. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  233. }
  234. }
  235. if(cDir==0x0f)
  236. {
  237. if(i-Woff+1<reader->map.width && !(reader->map.undergroungTerrain[i-Woff+1][j-Hoff].malle))
  238. {
  239. undRoadBitmaps[i][j] = CSDL_Ext::rotate01(undRoadBitmaps[i][j]);
  240. undRoadBitmaps[i][j] = CSDL_Ext::alphaTransform(undRoadBitmaps[i][j]);
  241. undRoadBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undRoadBitmaps[i][j], su);
  242. }
  243. }
  244. }
  245. else
  246. undRoadBitmaps[i][j] = NULL;
  247. }
  248. }
  249. }
  250. }
  251. staticRiverBitmaps = new SDL_Surface **[reader->map.width+2*Woff];
  252. for (int ii=0;ii<reader->map.width+2*Woff;ii++)
  253. staticRiverBitmaps[ii] = new SDL_Surface*[reader->map.height+2*Hoff]; // allocate memory
  254. for (int i=0; i<reader->map.width+2*Woff; i++) //jest po szerokoœci
  255. {
  256. for (int j=0; j<reader->map.height+2*Hoff;j++) //po wysokoœci
  257. {
  258. if(i<Woff || i>reader->map.width+Woff-1 || j<Woff || j>reader->map.height+Hoff-1)
  259. staticRiverBitmaps[i][j] = NULL;
  260. else
  261. {
  262. if(reader->map.terrain[i-Woff][j-Hoff].nuine)
  263. {
  264. staticRiverBitmaps[i][j] = staticRiverDefs[reader->map.terrain[i-Woff][j-Hoff].nuine-1]->ourImages[reader->map.terrain[i-Woff][j-Hoff].rivDir].bitmap;
  265. int cDir = reader->map.terrain[i-Woff][j-Hoff].rivDir;
  266. if(cDir==0 || cDir==1 || cDir==2 || cDir==3)
  267. {
  268. if(i-Woff+1<reader->map.width && j-Hoff-1>0 && reader->map.terrain[i-Woff+1][j-Hoff].nuine && reader->map.terrain[i-Woff][j-Hoff-1].nuine)
  269. {
  270. staticRiverBitmaps[i][j] = CSDL_Ext::hFlip(staticRiverBitmaps[i][j]);
  271. staticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(staticRiverBitmaps[i][j]);
  272. staticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(staticRiverBitmaps[i][j], su);
  273. }
  274. if(i-Woff-1>0 && j-Hoff-1>0 && reader->map.terrain[i-Woff-1][j-Hoff].nuine && reader->map.terrain[i-Woff][j-Hoff-1].nuine)
  275. {
  276. staticRiverBitmaps[i][j] = CSDL_Ext::rotate03(staticRiverBitmaps[i][j]);
  277. staticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(staticRiverBitmaps[i][j]);
  278. staticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(staticRiverBitmaps[i][j], su);
  279. }
  280. if(i-Woff-1>0 && j-Hoff+1<reader->map.height && reader->map.terrain[i-Woff-1][j-Hoff].nuine && reader->map.terrain[i-Woff][j-Hoff+1].nuine)
  281. {
  282. staticRiverBitmaps[i][j] = CSDL_Ext::rotate01(staticRiverBitmaps[i][j]);
  283. staticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(staticRiverBitmaps[i][j]);
  284. staticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(staticRiverBitmaps[i][j], su);
  285. }
  286. }
  287. if(cDir==5 || cDir==6)
  288. {
  289. if(j-Hoff+1<reader->map.height && !(reader->map.terrain[i-Woff][j-Hoff+1].nuine))
  290. {
  291. staticRiverBitmaps[i][j] = CSDL_Ext::hFlip(staticRiverBitmaps[i][j]);
  292. staticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(staticRiverBitmaps[i][j]);
  293. staticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(staticRiverBitmaps[i][j], su);
  294. }
  295. }
  296. if(cDir==7 || cDir==8)
  297. {
  298. if(i-Woff+1<reader->map.width && !(reader->map.terrain[i-Woff+1][j-Hoff].nuine))
  299. {
  300. staticRiverBitmaps[i][j] = CSDL_Ext::rotate01(staticRiverBitmaps[i][j]);
  301. staticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(staticRiverBitmaps[i][j]);
  302. staticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(staticRiverBitmaps[i][j], su);
  303. }
  304. }
  305. }
  306. else
  307. staticRiverBitmaps[i][j] = NULL;
  308. }
  309. }
  310. }
  311. undStaticRiverBitmaps = new SDL_Surface **[reader->map.width+2*Woff];
  312. for (int ii=0;ii<reader->map.width+2*Woff;ii++)
  313. undStaticRiverBitmaps[ii] = new SDL_Surface*[reader->map.height+2*Hoff]; // allocate memory
  314. if(reader->map.twoLevel)
  315. {
  316. for (int i=0; i<reader->map.width+2*Woff; i++) //jest po szerokoœci
  317. {
  318. for (int j=0; j<reader->map.height+2*Hoff;j++) //po wysokoœci
  319. {
  320. if(i<Woff || i>reader->map.width+Woff-1 || j<Woff || j>reader->map.height+Hoff-1)
  321. undStaticRiverBitmaps[i][j] = NULL;
  322. else
  323. {
  324. if(reader->map.undergroungTerrain[i-Woff][j-Hoff].nuine)
  325. {
  326. undStaticRiverBitmaps[i][j] = staticRiverDefs[reader->map.undergroungTerrain[i-Woff][j-Hoff].nuine-1]->ourImages[reader->map.undergroungTerrain[i-Woff][j-Hoff].rivDir].bitmap;
  327. int cDir = reader->map.undergroungTerrain[i-Woff][j-Hoff].rivDir;
  328. if(cDir==0 || cDir==1 || cDir==2 || cDir==3)
  329. {
  330. if(i-Woff+1<reader->map.width && j-Hoff-1>0 && reader->map.undergroungTerrain[i-Woff+1][j-Hoff].nuine && reader->map.undergroungTerrain[i-Woff][j-Hoff-1].nuine)
  331. {
  332. undStaticRiverBitmaps[i][j] = CSDL_Ext::hFlip(undStaticRiverBitmaps[i][j]);
  333. undStaticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(undStaticRiverBitmaps[i][j]);
  334. undStaticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undStaticRiverBitmaps[i][j], su);
  335. }
  336. if(i-Woff-1>0 && j-Hoff-1>0 && reader->map.undergroungTerrain[i-Woff-1][j-Hoff].nuine && reader->map.undergroungTerrain[i-Woff][j-Hoff-1].nuine)
  337. {
  338. undStaticRiverBitmaps[i][j] = CSDL_Ext::rotate03(undStaticRiverBitmaps[i][j]);
  339. undStaticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(undStaticRiverBitmaps[i][j]);
  340. undStaticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undStaticRiverBitmaps[i][j], su);
  341. }
  342. if(i-Woff-1>0 && j-Hoff+1<reader->map.height && reader->map.undergroungTerrain[i-Woff-1][j-Hoff].nuine && reader->map.undergroungTerrain[i-Woff][j-Hoff+1].nuine)
  343. {
  344. undStaticRiverBitmaps[i][j] = CSDL_Ext::rotate01(undStaticRiverBitmaps[i][j]);
  345. undStaticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(undStaticRiverBitmaps[i][j]);
  346. undStaticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undStaticRiverBitmaps[i][j], su);
  347. }
  348. }
  349. if(cDir==5 || cDir==6)
  350. {
  351. if(j-Hoff+1<reader->map.height && !(reader->map.undergroungTerrain[i-Woff][j-Hoff+1].nuine))
  352. {
  353. undStaticRiverBitmaps[i][j] = CSDL_Ext::hFlip(undStaticRiverBitmaps[i][j]);
  354. undStaticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(undStaticRiverBitmaps[i][j]);
  355. undStaticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undStaticRiverBitmaps[i][j], su);
  356. }
  357. }
  358. if(cDir==7 || cDir==8)
  359. {
  360. if(i-Woff+1<reader->map.width && !(reader->map.undergroungTerrain[i-Woff+1][j-Hoff].nuine))
  361. {
  362. undStaticRiverBitmaps[i][j] = CSDL_Ext::rotate01(undStaticRiverBitmaps[i][j]);
  363. undStaticRiverBitmaps[i][j] = CSDL_Ext::alphaTransform(undStaticRiverBitmaps[i][j]);
  364. undStaticRiverBitmaps[i][j] = CSDL_Ext::secondAlphaTransform(undStaticRiverBitmaps[i][j], su);
  365. }
  366. }
  367. }
  368. else
  369. undStaticRiverBitmaps[i][j] = NULL;
  370. }
  371. }
  372. }
  373. }
  374. SDL_FreeSurface(su);
  375. //road's and river's DefHandlers initialized
  376. terrainBitmap = new SDL_Surface **[reader->map.width+2*Woff];
  377. for (int ii=0;ii<reader->map.width+2*Woff;ii++)
  378. terrainBitmap[ii] = new SDL_Surface*[reader->map.height+2*Hoff]; // allocate memory
  379. CDefHandler * bord = CGameInfo::mainObj->spriteh->giveDef("EDG.DEF");
  380. for (int i=0; i<reader->map.width+2*Woff; i++) //jest po szerokoœci
  381. {
  382. for (int j=0; j<reader->map.height+2*Hoff;j++) //po wysokoœci
  383. {
  384. if(i < Woff || i > (reader->map.width+Woff-1) || j < Hoff || j > (reader->map.height+Hoff-1))
  385. {
  386. if(i==Woff-1 && j==Hoff-1)
  387. {
  388. terrainBitmap[i][j] = bord->ourImages[16].bitmap;
  389. continue;
  390. }
  391. else if(i==Woff-1 && j==(reader->map.height+Hoff))
  392. {
  393. terrainBitmap[i][j] = bord->ourImages[19].bitmap;
  394. continue;
  395. }
  396. else if(i==(reader->map.width+Woff) && j==Hoff-1)
  397. {
  398. terrainBitmap[i][j] = bord->ourImages[17].bitmap;
  399. continue;
  400. }
  401. else if(i==(reader->map.width+Woff) && j==(reader->map.height+Hoff))
  402. {
  403. terrainBitmap[i][j] = bord->ourImages[18].bitmap;
  404. continue;
  405. }
  406. else if(j == Hoff-1 && i > Woff-1 && i < reader->map.height+Woff)
  407. {
  408. terrainBitmap[i][j] = bord->ourImages[22+rand()%2].bitmap;
  409. continue;
  410. }
  411. else if(i == Woff-1 && j > Hoff-1 && j < reader->map.height+Hoff)
  412. {
  413. terrainBitmap[i][j] = bord->ourImages[33+rand()%2].bitmap;
  414. continue;
  415. }
  416. else if(j == reader->map.height+Hoff && i > Woff-1 && i < reader->map.width+Woff)
  417. {
  418. terrainBitmap[i][j] = bord->ourImages[29+rand()%2].bitmap;
  419. continue;
  420. }
  421. else if(i == reader->map.width+Woff && j > Hoff-1 && j < reader->map.height+Hoff)
  422. {
  423. terrainBitmap[i][j] = bord->ourImages[25+rand()%2].bitmap;
  424. continue;
  425. }
  426. else
  427. {
  428. terrainBitmap[i][j] = bord->ourImages[rand()%16].bitmap;
  429. continue;
  430. }
  431. }
  432. TerrainTile zz = reader->map.terrain[i-Woff][j-Hoff];
  433. std::string name = CSemiDefHandler::nameFromType(reader->map.terrain[i-Woff][j-Hoff].tertype);
  434. for (unsigned int k=0; k<reader->defs.size(); k++)
  435. {
  436. try
  437. {
  438. if (reader->defs[k]->defName != name)
  439. continue;
  440. else
  441. {
  442. int ktora = reader->map.terrain[i-Woff][j-Hoff].terview;
  443. terrainBitmap[i][j] = reader->defs[k]->ourImages[ktora].bitmap;
  444. //TODO: odwracanie
  445. switch ((reader->map.terrain[i-Woff][j-Hoff].siodmyTajemniczyBajt)%4)
  446. {
  447. case 1:
  448. {
  449. terrainBitmap[i][j] = CSDL_Ext::rotate01(terrainBitmap[i][j]);
  450. break;
  451. }
  452. case 2:
  453. {
  454. terrainBitmap[i][j] = CSDL_Ext::hFlip(terrainBitmap[i][j]);
  455. break;
  456. }
  457. case 3:
  458. {
  459. terrainBitmap[i][j] = CSDL_Ext::rotate03(terrainBitmap[i][j]);
  460. break;
  461. }
  462. }
  463. //SDL_BlitSurface(terrainBitmap[i][j],NULL,ekran,NULL); SDL_Flip(ekran);SDL_Delay(50);
  464. break;
  465. }
  466. }
  467. catch (...)
  468. { continue; }
  469. }
  470. }
  471. }
  472. if (reader->map.twoLevel)
  473. {
  474. undTerrainBitmap = new SDL_Surface **[reader->map.width+8];
  475. for (int ii=0;ii<reader->map.width+8;ii++)
  476. undTerrainBitmap[ii] = new SDL_Surface*[reader->map.height+8]; // allocate memory
  477. for (int i=0; i<reader->map.width+2*Woff; i++)
  478. {
  479. for (int j=0; j<reader->map.height+2*Hoff;j++)
  480. {
  481. if(i < Woff || i > (reader->map.width+Woff-1) || j < Hoff || j > (reader->map.height+Hoff-1))
  482. {
  483. if(i==Woff-1 && j==Hoff-1)
  484. {
  485. undTerrainBitmap[i][j] = bord->ourImages[16].bitmap;
  486. continue;
  487. }
  488. else if(i==Woff-1 && j==(reader->map.height+Hoff))
  489. {
  490. undTerrainBitmap[i][j] = bord->ourImages[19].bitmap;
  491. continue;
  492. }
  493. else if(i==(reader->map.width+Woff) && j==Hoff-1)
  494. {
  495. undTerrainBitmap[i][j] = bord->ourImages[17].bitmap;
  496. continue;
  497. }
  498. else if(i==(reader->map.width+Woff) && j==(reader->map.height+Hoff))
  499. {
  500. undTerrainBitmap[i][j] = bord->ourImages[18].bitmap;
  501. continue;
  502. }
  503. else if(j == Hoff-1 && i > Woff-1 && i < reader->map.width+Woff)
  504. {
  505. undTerrainBitmap[i][j] = bord->ourImages[22+rand()%2].bitmap;
  506. continue;
  507. }
  508. else if(i == Woff-1 && j > Hoff-1 && j < reader->map.height+Hoff)
  509. {
  510. undTerrainBitmap[i][j] = bord->ourImages[33+rand()%2].bitmap;
  511. continue;
  512. }
  513. else if(j == reader->map.height+Hoff && i > Woff-1 && i < reader->map.width+Woff)
  514. {
  515. undTerrainBitmap[i][j] = bord->ourImages[29+rand()%2].bitmap;
  516. continue;
  517. }
  518. else if(i == reader->map.width+Woff && j > Hoff-1 && j < reader->map.height+Hoff)
  519. {
  520. undTerrainBitmap[i][j] = bord->ourImages[25+rand()%2].bitmap;
  521. continue;
  522. }
  523. else
  524. {
  525. undTerrainBitmap[i][j] = bord->ourImages[rand()%16].bitmap;
  526. continue;
  527. }
  528. }
  529. TerrainTile zz = reader->map.undergroungTerrain[i-Woff][j-Hoff];
  530. std::string name = CSemiDefHandler::nameFromType(reader->map.undergroungTerrain[i-Woff][j-Hoff].tertype);
  531. for (unsigned int k=0; k<reader->defs.size(); k++)
  532. {
  533. try
  534. {
  535. if (reader->defs[k]->defName != name)
  536. continue;
  537. else
  538. {
  539. int ktora = reader->map.undergroungTerrain[i-Woff][j-Hoff].terview;
  540. undTerrainBitmap[i][j] = reader->defs[k]->ourImages[ktora].bitmap;
  541. //TODO: odwracanie
  542. switch ((reader->map.undergroungTerrain[i-Woff][j-Hoff].siodmyTajemniczyBajt)%4)
  543. {
  544. case 1:
  545. {
  546. undTerrainBitmap[i][j] = CSDL_Ext::rotate01(undTerrainBitmap[i][j]);
  547. break;
  548. }
  549. case 2:
  550. {
  551. undTerrainBitmap[i][j] = CSDL_Ext::hFlip(undTerrainBitmap[i][j]);
  552. break;
  553. }
  554. case 3:
  555. {
  556. undTerrainBitmap[i][j] = CSDL_Ext::rotate03(undTerrainBitmap[i][j]);
  557. break;
  558. }
  559. }
  560. //SDL_BlitSurface(undTerrainBitmap[i][j],NULL,ekran,NULL); SDL_Flip(ekran);SDL_Delay(50);
  561. break;
  562. }
  563. }
  564. catch (...)
  565. { continue; }
  566. }
  567. } //end of internal for
  568. } //end of external for
  569. } //end of if
  570. }
  571. SDL_Surface * CMapHandler::terrainRect(int x, int y, int dx, int dy, int level, unsigned char anim)
  572. {
  573. #if SDL_BYTEORDER == SDL_BIG_ENDIAN
  574. int rmask = 0xff000000;
  575. int gmask = 0x00ff0000;
  576. int bmask = 0x0000ff00;
  577. int amask = 0x000000ff;
  578. #else
  579. int rmask = 0x000000ff;
  580. int gmask = 0x0000ff00;
  581. int bmask = 0x00ff0000;
  582. int amask = 0xff000000;
  583. #endif
  584. SDL_Surface * su = SDL_CreateRGBSurface(SDL_SWSURFACE, dx*32, dy*32, 32,
  585. rmask, gmask, bmask, amask);
  586. if (((dx+x)>((reader->map.width+8)) || (dy+y)>((reader->map.height+8))) || ((x<0)||(y<0) ) )
  587. throw new std::string("Poza zakresem");
  588. ////printing terrain
  589. for (int bx=0; bx<dx; bx++)
  590. {
  591. for (int by=0; by<dy; by++)
  592. {
  593. SDL_Rect * sr = new SDL_Rect;
  594. sr->y=by*32;
  595. sr->x=bx*32;
  596. sr->h=sr->w=32;
  597. if (!level)
  598. {
  599. SDL_BlitSurface(terrainBitmap[bx+x][by+y],NULL,su,sr);
  600. }
  601. else
  602. {
  603. SDL_BlitSurface(undTerrainBitmap[bx+x][by+y],NULL,su,sr);
  604. }
  605. delete sr;
  606. }
  607. }
  608. ////terrain printed
  609. ////printing rivers
  610. for (int bx=0; bx<dx; bx++)
  611. {
  612. for (int by=0; by<dy; by++)
  613. {
  614. SDL_Rect * sr = new SDL_Rect;
  615. sr->y=by*32;
  616. sr->x=bx*32;
  617. sr->h=sr->w=32;
  618. if (!level)
  619. {
  620. if(staticRiverBitmaps[bx+x][by+y])
  621. SDL_BlitSurface(staticRiverBitmaps[bx+x][by+y],NULL,su,sr);
  622. }
  623. else
  624. {
  625. if(undStaticRiverBitmaps[bx+x][by+y])
  626. SDL_BlitSurface(undStaticRiverBitmaps[bx+x][by+y],NULL,su,sr);
  627. }
  628. delete sr;
  629. }
  630. }
  631. ////rivers printed
  632. ////printing roads
  633. for (int bx=0; bx<dx; bx++)
  634. {
  635. for (int by=0; by<dy; by++)
  636. {
  637. SDL_Rect * sr = new SDL_Rect;
  638. sr->y=by*32;
  639. sr->x=bx*32;
  640. sr->h=sr->w=32;
  641. if (!level)
  642. {
  643. if(roadBitmaps[bx+x][by+y])
  644. SDL_BlitSurface(roadBitmaps[bx+x][by+y],NULL,su,sr);
  645. }
  646. else
  647. {
  648. if(undRoadBitmaps[bx+x][by+y])
  649. SDL_BlitSurface(undRoadBitmaps[bx+x][by+y],NULL,su,sr);
  650. }
  651. delete sr;
  652. }
  653. }
  654. ////roads printed
  655. ////printing objects
  656. std::vector<ObjSorter> lowPrObjs;
  657. std::vector<ObjSorter> highPrObjs;
  658. std::vector<ObjSorter> highPrObjsVis;
  659. for(int gg=0; gg<CGameInfo::mainObj->objh->objInstances.size(); ++gg)
  660. {
  661. if(CGameInfo::mainObj->objh->objInstances[gg].x >= x-Woff-4 && CGameInfo::mainObj->objh->objInstances[gg].x < dx+x-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].y >= y-Hoff-4 && CGameInfo::mainObj->objh->objInstances[gg].y < dy+y-Hoff+4 && CGameInfo::mainObj->objh->objInstances[gg].z == level)
  662. {
  663. if(!CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isOnDefList)
  664. {
  665. ObjSorter os;
  666. os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap;
  667. os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32;
  668. os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32;
  669. highPrObjsVis.push_back(os);
  670. }
  671. else if(CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].printPriority==0)
  672. {
  673. ObjSorter os;
  674. int defyod = CGameInfo::mainObj->objh->objInstances[gg].defNumber;
  675. int ourimagesod = anim%CGameInfo::mainObj->ac->map.defy[defyod].handler->ourImages.size();
  676. os.bitmap = CGameInfo::mainObj->ac->map.defy[defyod].handler->ourImages[ourimagesod].bitmap;
  677. os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32;
  678. os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32;
  679. if (CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].isVisitable())
  680. highPrObjsVis.push_back(os);
  681. else
  682. highPrObjs.push_back(os);
  683. }
  684. else
  685. {
  686. ObjSorter os;
  687. os.bitmap = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap;
  688. os.xpos = (CGameInfo::mainObj->objh->objInstances[gg].x-x+Woff)*32;
  689. os.ypos = (CGameInfo::mainObj->objh->objInstances[gg].y-y+Hoff)*32;
  690. lowPrObjs.push_back(os);
  691. }
  692. }
  693. }
  694. #ifndef _DEBUG
  695. std::stable_sort(lowPrObjs.begin(), lowPrObjs.end(), pox);
  696. std::stable_sort(lowPrObjs.begin(), lowPrObjs.end(), poy);
  697. std::stable_sort(highPrObjs.begin(), highPrObjs.end(),pox);
  698. std::stable_sort(highPrObjs.begin(), highPrObjs.end(),poy);
  699. std::stable_sort(highPrObjsVis.begin(), highPrObjsVis.end(),pox);
  700. std::stable_sort(highPrObjsVis.begin(), highPrObjsVis.end(),poy);
  701. #else
  702. std::sort(lowPrObjs.begin(), lowPrObjs.end(), pox);
  703. std::sort(lowPrObjs.begin(), lowPrObjs.end(), poy);
  704. std::sort(highPrObjs.begin(), highPrObjs.end(),pox);
  705. std::sort(highPrObjs.begin(), highPrObjs.end(),poy);
  706. std::sort(highPrObjsVis.begin(), highPrObjsVis.end(),pox);
  707. std::sort(highPrObjsVis.begin(), highPrObjsVis.end(),poy);
  708. #endif
  709. for(int yy=0; yy<lowPrObjs.size(); ++yy)
  710. {
  711. SDL_Rect * sr = new SDL_Rect;
  712. sr->w = lowPrObjs[yy].bitmap->w;
  713. sr->h = lowPrObjs[yy].bitmap->h;
  714. sr->x = lowPrObjs[yy].xpos - lowPrObjs[yy].bitmap->w + 32;
  715. sr->y = lowPrObjs[yy].ypos - lowPrObjs[yy].bitmap->h + 32;
  716. SDL_BlitSurface(lowPrObjs[yy].bitmap, NULL, su, sr);
  717. delete sr;
  718. }
  719. for(int yy=0; yy<highPrObjs.size(); ++yy)
  720. {
  721. SDL_Rect * sr = new SDL_Rect;
  722. sr->w = highPrObjs[yy].bitmap->w;
  723. sr->h = highPrObjs[yy].bitmap->h;
  724. sr->x = highPrObjs[yy].xpos - highPrObjs[yy].bitmap->w + 32;
  725. sr->y = highPrObjs[yy].ypos - highPrObjs[yy].bitmap->h + 32;
  726. SDL_BlitSurface(highPrObjs[yy].bitmap, NULL, su, sr);
  727. delete sr;
  728. }
  729. for(int yy=0; yy<highPrObjsVis.size(); ++yy)
  730. {
  731. SDL_Rect * sr = new SDL_Rect;
  732. sr->w = highPrObjsVis[yy].bitmap->w;
  733. sr->h = highPrObjsVis[yy].bitmap->h;
  734. sr->x = highPrObjsVis[yy].xpos - highPrObjsVis[yy].bitmap->w + 32;
  735. sr->y = highPrObjsVis[yy].ypos - highPrObjsVis[yy].bitmap->h + 32;
  736. SDL_BlitSurface(highPrObjsVis[yy].bitmap, NULL, su, sr);
  737. delete sr;
  738. }
  739. /*for(int gg=0; gg<CGameInfo::mainObj->objh->objInstances.size(); ++gg)
  740. {
  741. if(CGameInfo::mainObj->objh->objInstances[gg].x >= x-3 && CGameInfo::mainObj->objh->objInstances[gg].x < dx+x-3 && CGameInfo::mainObj->objh->objInstances[gg].y >= y-3 && CGameInfo::mainObj->objh->objInstances[gg].y < dy+y-3 && CGameInfo::mainObj->objh->objInstances[gg].z == level)
  742. {
  743. SDL_Rect * sr = new SDL_Rect;
  744. sr->w = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[0].bitmap->w;
  745. sr->h = CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[0].bitmap->h;
  746. sr->x = (CGameInfo::mainObj->objh->objInstances[gg].x-x+4)*32 - CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[0].bitmap->w + 32;
  747. sr->y = (CGameInfo::mainObj->objh->objInstances[gg].y-y+4)*32 - CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[0].bitmap->h + 32;
  748. SDL_BlitSurface(CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages[anim%CGameInfo::mainObj->ac->map.defy[CGameInfo::mainObj->objh->objInstances[gg].defNumber].handler->ourImages.size()].bitmap, NULL, su, sr);
  749. delete sr;
  750. }
  751. }*/
  752. ////objects printed, printing shadow
  753. for (int bx=0; bx<dx; bx++)
  754. {
  755. for (int by=0; by<dy; by++)
  756. {
  757. SDL_Rect * sr = new SDL_Rect;
  758. sr->y=by*32;
  759. sr->x=bx*32;
  760. sr->h=sr->w=32;
  761. if (!level)
  762. {
  763. if( bx+x>Woff-1 && by+y>Hoff-1 && bx+x<visibility.size()-(Woff-1) && by+y<visibility[0].size()-(Hoff-1) && !visibility[bx+x][by+y])
  764. {
  765. SDL_Surface * hide = getVisBitmap(bx+x, by+y, visibility);
  766. SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su);
  767. SDL_BlitSurface(hide2, NULL, su, sr);
  768. SDL_FreeSurface(hide2);
  769. }
  770. }
  771. else
  772. {
  773. if( bx+x>Woff-1 && by+y>Hoff-1 && bx+x<undVisibility.size()-(Woff-1) && by+y<undVisibility[0].size()-(Hoff-1) && !undVisibility[bx+x][by+y])
  774. {
  775. SDL_Surface * hide = getVisBitmap(bx+x, by+y, undVisibility);
  776. SDL_Surface * hide2 = CSDL_Ext::secondAlphaTransform(hide, su);
  777. SDL_BlitSurface(hide2, NULL, su, sr);
  778. SDL_FreeSurface(hide2);
  779. }
  780. }
  781. delete sr;
  782. }
  783. }
  784. ////shadow printed
  785. //printing borders
  786. for (int bx=0; bx<dx; bx++)
  787. {
  788. for (int by=0; by<dy; by++)
  789. {
  790. if(bx+x<Woff || by+y<Hoff || bx+x>reader->map.width+(Woff-1) || by+y>reader->map.height+(Hoff-1))
  791. {
  792. SDL_Rect * sr = new SDL_Rect;
  793. sr->y=by*32;
  794. sr->x=bx*32;
  795. sr->h=sr->w=32;
  796. if (!level)
  797. {
  798. SDL_BlitSurface(terrainBitmap[bx+x][by+y],NULL,su,sr);
  799. }
  800. else
  801. {
  802. SDL_BlitSurface(undTerrainBitmap[bx+x][by+y],NULL,su,sr);
  803. }
  804. delete sr;
  805. }
  806. }
  807. }
  808. //borders printed
  809. return su;
  810. }
  811. SDL_Surface * CMapHandler::terrBitmap(int x, int y)
  812. {
  813. return terrainBitmap[x+4][y+4];
  814. }
  815. SDL_Surface * CMapHandler::undTerrBitmap(int x, int y)
  816. {
  817. return undTerrainBitmap[x+4][y+4];
  818. }
  819. SDL_Surface * CMapHandler::getVisBitmap(int x, int y, std::vector< std::vector<char> > & visibility)
  820. {
  821. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1])
  822. {
  823. return fullHide->ourImages[rand()%fullHide->ourImages.size()].bitmap; //fully hidden
  824. }
  825. else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1])
  826. {
  827. return partialHide->ourImages[22].bitmap; //visible right bottom corner
  828. }
  829. else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  830. {
  831. return partialHide->ourImages[15].bitmap; //visible right top corner
  832. }
  833. else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  834. {
  835. return CSDL_Ext::rotate01(partialHide->ourImages[22].bitmap); //visible left bottom corner
  836. }
  837. else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1])
  838. {
  839. return CSDL_Ext::rotate01(partialHide->ourImages[15].bitmap); //visible left top corner
  840. }
  841. else if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  842. {
  843. //return partialHide->ourImages[rand()%2].bitmap; //visible top
  844. return partialHide->ourImages[0].bitmap; //visible top
  845. }
  846. else if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  847. {
  848. //return partialHide->ourImages[4+rand()%2].bitmap; //visble bottom
  849. return partialHide->ourImages[4].bitmap; //visble bottom
  850. }
  851. else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  852. {
  853. //return CSDL_Ext::rotate01(partialHide->ourImages[2+rand()%2].bitmap); //visible left
  854. return CSDL_Ext::rotate01(partialHide->ourImages[2].bitmap); //visible left
  855. }
  856. else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  857. {
  858. //return partialHide->ourImages[2+rand()%2].bitmap; //visible right
  859. return partialHide->ourImages[2].bitmap; //visible right
  860. }
  861. else if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1])
  862. {
  863. //return partialHide->ourImages[12+2*(rand()%2)].bitmap; //visible bottom, right - bottom, right; left top corner hidden
  864. return partialHide->ourImages[12].bitmap; //visible bottom, right - bottom, right; left top corner hidden
  865. }
  866. else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && !visibility[x-1][y+1])
  867. {
  868. return partialHide->ourImages[13].bitmap; //visible right, right - top; left bottom corner hidden
  869. }
  870. else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && !visibility[x+1][y+1])
  871. {
  872. return CSDL_Ext::rotate01(partialHide->ourImages[13].bitmap); //visible top, top - left, left; right bottom corner hidden
  873. }
  874. else if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && !visibility[x+1][y-1])
  875. {
  876. //return CSDL_Ext::rotate01(partialHide->ourImages[12+2*(rand()%2)].bitmap); //visible left, left - bottom, bottom; right top corner hidden
  877. return CSDL_Ext::rotate01(partialHide->ourImages[12].bitmap); //visible left, left - bottom, bottom; right top corner hidden
  878. }
  879. else if(visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1])
  880. {
  881. return partialHide->ourImages[10].bitmap; //visible left, right, bottom and top
  882. }
  883. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  884. {
  885. return partialHide->ourImages[16].bitmap; //visible right corners
  886. }
  887. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  888. {
  889. return partialHide->ourImages[18].bitmap; //visible top corners
  890. }
  891. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  892. {
  893. return CSDL_Ext::rotate01(partialHide->ourImages[16].bitmap); //visible left corners
  894. }
  895. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  896. {
  897. return CSDL_Ext::hFlip(partialHide->ourImages[18].bitmap); //visible bottom corners
  898. }
  899. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1])
  900. {
  901. return partialHide->ourImages[17].bitmap; //visible right - top and bottom - left corners
  902. }
  903. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && !visibility[x-1][y+1])
  904. {
  905. return CSDL_Ext::hFlip(partialHide->ourImages[17].bitmap); //visible top - left and bottom - right corners
  906. }
  907. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1])
  908. {
  909. return partialHide->ourImages[19].bitmap; //visible corners without left top
  910. }
  911. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && !visibility[x-1][y+1])
  912. {
  913. return partialHide->ourImages[20].bitmap; //visible corners without left bottom
  914. }
  915. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1])
  916. {
  917. return CSDL_Ext::rotate01(partialHide->ourImages[20].bitmap); //visible corners without right bottom
  918. }
  919. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1] && visibility[x-1][y+1])
  920. {
  921. return CSDL_Ext::rotate01(partialHide->ourImages[19].bitmap); //visible corners without right top
  922. }
  923. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1] && visibility[x-1][y+1])
  924. {
  925. return partialHide->ourImages[21].bitmap; //visible all corners only
  926. }
  927. if(visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1])
  928. {
  929. return partialHide->ourImages[6].bitmap; //hidden top
  930. }
  931. if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1])
  932. {
  933. return partialHide->ourImages[7].bitmap; //hidden right
  934. }
  935. if(!visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1])
  936. {
  937. return partialHide->ourImages[8].bitmap; //hidden bottom
  938. }
  939. if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1])
  940. {
  941. return CSDL_Ext::rotate01(partialHide->ourImages[6].bitmap); //hidden left
  942. }
  943. if(!visibility[x][y+1] && visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1])
  944. {
  945. return partialHide->ourImages[9].bitmap; //hidden top and bottom
  946. }
  947. if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1])
  948. {
  949. return partialHide->ourImages[29].bitmap; //hidden left and right
  950. }
  951. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1] && !visibility[x-1][y+1])
  952. {
  953. return partialHide->ourImages[24].bitmap; //visible top and right bottom corner
  954. }
  955. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && !visibility[x+1][y+1] && visibility[x-1][y+1])
  956. {
  957. return CSDL_Ext::rotate01(partialHide->ourImages[24].bitmap); //visible top and left bottom corner
  958. }
  959. if(!visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1] && visibility[x-1][y+1])
  960. {
  961. return partialHide->ourImages[33].bitmap; //visible top and bottom corners
  962. }
  963. if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && !visibility[x+1][y+1] && visibility[x+1][y-1])
  964. {
  965. return CSDL_Ext::rotate01(partialHide->ourImages[26].bitmap); //visible left and right top corner
  966. }
  967. if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y+1] && !visibility[x+1][y-1])
  968. {
  969. return CSDL_Ext::rotate01(partialHide->ourImages[25].bitmap); //visible left and right bottom corner
  970. }
  971. if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y+1] && visibility[x+1][y-1])
  972. {
  973. return partialHide->ourImages[32].bitmap; //visible left and right corners
  974. }
  975. if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x+1][y-1])
  976. {
  977. return CSDL_Ext::rotate01(partialHide->ourImages[30].bitmap); //visible bottom and left top corner
  978. }
  979. if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x+1][y-1])
  980. {
  981. return partialHide->ourImages[30].bitmap; //visible bottom and right top corner
  982. }
  983. if(visibility[x][y+1] && !visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x+1][y-1])
  984. {
  985. return partialHide->ourImages[31].bitmap; //visible bottom and top corners
  986. }
  987. if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && !visibility[x-1][y-1] && visibility[x-1][y+1])
  988. {
  989. return partialHide->ourImages[25].bitmap; //visible right and left bottom corner
  990. }
  991. if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && !visibility[x-1][y+1])
  992. {
  993. return partialHide->ourImages[26].bitmap; //visible right and left top corner
  994. }
  995. if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1] && visibility[x-1][y+1])
  996. {
  997. return CSDL_Ext::rotate01(partialHide->ourImages[32].bitmap); //visible right and left cornres
  998. }
  999. if(visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && !visibility[x][y-1] && visibility[x-1][y-1])
  1000. {
  1001. return partialHide->ourImages[28].bitmap; //visible bottom, right - bottom, right; left top corner visible
  1002. }
  1003. else if(!visibility[x][y+1] && visibility[x+1][y] && !visibility[x-1][y] && visibility[x][y-1] && visibility[x-1][y+1])
  1004. {
  1005. return partialHide->ourImages[27].bitmap; //visible right, right - top; left bottom corner visible
  1006. }
  1007. else if(!visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && visibility[x][y-1] && visibility[x+1][y+1])
  1008. {
  1009. return CSDL_Ext::rotate01(partialHide->ourImages[27].bitmap); //visible top, top - left, left; right bottom corner visible
  1010. }
  1011. else if(visibility[x][y+1] && !visibility[x+1][y] && visibility[x-1][y] && !visibility[x][y-1] && visibility[x+1][y-1])
  1012. {
  1013. return CSDL_Ext::rotate01(partialHide->ourImages[28].bitmap); //visible left, left - bottom, bottom; right top corner visible
  1014. }
  1015. return fullHide->ourImages[0].bitmap; //this case should never happen, but it is better to hide too much than reveal it....
  1016. }
  1017. char & CMapHandler::visAccess(int x, int y)
  1018. {
  1019. return visibility[x+Woff][y+Hoff];
  1020. }
  1021. char & CMapHandler::undVisAccess(int x, int y)
  1022. {
  1023. return undVisibility[x+Woff][y+Hoff];
  1024. }