CDefObjInfoHandler.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #define VCMI_DLL
  2. #include "../stdafx.h"
  3. #include "CDefObjInfoHandler.h"
  4. #include "../CGameInfo.h"
  5. #include "CLodHandler.h"
  6. #include <sstream>
  7. #include "../lib/VCMI_Lib.h"
  8. #include <set>
  9. extern CLodHandler * bitmaph;
  10. bool CGDefInfo::isVisitable()
  11. {
  12. for (int i=0; i<6; i++)
  13. {
  14. if (visitMap[i])
  15. return true;
  16. }
  17. return false;
  18. }
  19. CGDefInfo::CGDefInfo()
  20. {
  21. visitDir = (8|16|32|64|128); //4,5,6,7,8 - any not-from-up direction
  22. }
  23. void CDefObjInfoHandler::load()
  24. {
  25. VLC->dobjinfo = this;
  26. nodrze<int> ideki;
  27. std::istringstream inp(bitmaph->getTextFile("ZOBJCTS.TXT"));
  28. int objNumber;
  29. inp>>objNumber;
  30. std::set<int> ids;
  31. for(int hh=0; hh<objNumber; ++hh)
  32. {
  33. CGDefInfo* nobj = new CGDefInfo();
  34. nobj->handler = NULL;
  35. std::string dump;
  36. inp>>nobj->name;
  37. std::transform(nobj->name.begin(), nobj->name.end(), nobj->name.begin(), (int(*)(int))toupper);
  38. for(int o=0; o<6; ++o)
  39. {
  40. nobj->blockMap[o] = 0xff;
  41. nobj->visitMap[o] = 0x00;
  42. }
  43. std::string mapStr;
  44. inp>>mapStr;
  45. std::reverse(mapStr.begin(), mapStr.end());
  46. for(int v=0; v<mapStr.size(); ++v)
  47. {
  48. if(mapStr[v]=='0')
  49. {
  50. nobj->blockMap[v/8] &= 255 - (128 >> (v%8));
  51. }
  52. }
  53. inp>>mapStr;
  54. std::reverse(mapStr.begin(), mapStr.end());
  55. for(int v=0; v<mapStr.size(); ++v)
  56. {
  57. if(mapStr[v]=='1')
  58. {
  59. nobj->visitMap[v/8] |= (128 >> (v%8));
  60. }
  61. }
  62. for(int yy=0; yy<2; ++yy) //first - on which types of terrain object can be placed;
  63. inp>>dump; //second -in which terrains' menus object in the editor will be available (?)
  64. inp>>nobj->id;
  65. inp>>nobj->subid;
  66. inp>>nobj->type;
  67. if(nobj->type == 2 || nobj->type == 3 || nobj->type == 4 || nobj->type == 5 || nobj->id == 111) //creature, hero, artifact, resource or whripool
  68. {
  69. nobj->visitDir = 0xff;
  70. ids.insert(nobj->id);
  71. }
  72. else
  73. nobj->visitDir = (8|16|32|64|128); //disabled visiting from the top
  74. inp>>nobj->printPriority;
  75. gobjs[nobj->id][nobj->subid] = nobj;
  76. if(nobj->id==98)
  77. castles[nobj->subid]=nobj;
  78. }
  79. }