XmlMapFile.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #include "core/EntityManager.h"
  2. #include "core/Logger.h"
  3. #include "core/ScriptManager.h"
  4. #include "core/XmlBackground2DFile.h"
  5. #include "core/XmlMapFile.h"
  6. #include "map/QGearsBackground2DFileManager.h"
  7. #include "map/QGearsWalkmeshFileManager.h"
  8. XmlMapFile::XmlMapFile(const Ogre::String& file):
  9. XmlFile(file)
  10. {
  11. }
  12. XmlMapFile::~XmlMapFile()
  13. {
  14. }
  15. void
  16. XmlMapFile::LoadMap()
  17. {
  18. TiXmlNode* node = m_File.RootElement();
  19. if(node == nullptr || node->ValueStr() != "map")
  20. {
  21. LOG_ERROR(m_File.ValueStr() + " is not a valid fields map file! No <map> in root.");
  22. return;
  23. }
  24. node = node->FirstChild();
  25. while(node != nullptr)
  26. {
  27. if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "walkmesh")
  28. {
  29. Ogre::String name(GetString(node, "file_name"));
  30. if(!name.empty())
  31. {
  32. QGears::WalkmeshFileManager::getSingleton();
  33. QGears::WalkmeshFilePtr walkmesh = QGears::WalkmeshFileManager::getSingleton().load(name, "Game").staticCast<QGears::WalkmeshFile>();
  34. EntityManager::getSingleton().GetWalkmesh()->load(walkmesh);
  35. }
  36. }
  37. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "movement_rotation")
  38. {
  39. Ogre::Degree rotation = Ogre::Degree(GetFloat(node, "degree", 0));
  40. EntityManager::getSingleton().SetPlayerMoveRotation(Ogre::Radian(rotation));
  41. }
  42. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "background2d")
  43. {
  44. Ogre::String name = GetString(node, "file_name");
  45. if(name != "")
  46. {
  47. // TODO migrate this code to a Resource and use it's group to load background
  48. QGears::Background2DFilePtr background = QGears::Background2DFileManager::getSingleton().load(name, "Game").staticCast<QGears::Background2DFile>();
  49. EntityManager::getSingleton().GetBackground2D()->load(background);
  50. }
  51. }
  52. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_model")
  53. {
  54. Ogre::String name = GetString(node, "name");
  55. if(name == "")
  56. {
  57. LOG_ERROR("There is no name specified for <entity_model> tag.");
  58. continue;
  59. }
  60. Ogre::String file_name = GetString(node, "file_name");
  61. if(file_name == "")
  62. {
  63. LOG_ERROR("There is no file_name specified for <entity_model> tag.");
  64. continue;
  65. }
  66. Ogre::Vector3 position(GetVector3(node, "position"));
  67. Ogre::Degree direction(Ogre::Degree(GetFloat(node, "direction")));
  68. Ogre::Vector3 scale(GetVector3(node, "scale", Ogre::Vector3::UNIT_SCALE));
  69. Ogre::Quaternion orientation(GetQuaternion(node, "root_orientation"));
  70. EntityManager::getSingleton().AddEntity(name, file_name, position, direction, scale, orientation);
  71. }
  72. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_trigger")
  73. {
  74. Ogre::String name = GetString(node, "name");
  75. if(name == "")
  76. {
  77. LOG_ERROR("There is no name specified for <entity_trigger> tag.");
  78. continue;
  79. }
  80. Ogre::Vector3 point1 = GetVector3(node, "point1", Ogre::Vector3::ZERO);
  81. Ogre::Vector3 point2 = GetVector3(node, "point2", Ogre::Vector3::ZERO);
  82. bool enabled = GetBool(node, "enabled", false);
  83. EntityManager::getSingleton().AddEntityTrigger(name, point1, point2, enabled);
  84. }
  85. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_point")
  86. {
  87. Ogre::String name = GetString(node, "name");
  88. if(name == "")
  89. {
  90. LOG_ERROR("There is no name specified for <entity_point> tag.");
  91. continue;
  92. }
  93. Ogre::Vector3 position = GetVector3(node, "position");
  94. float rotation = GetFloat(node, "rotation");
  95. EntityManager::getSingleton().AddEntityPoint(name, position, rotation);
  96. }
  97. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "entity_script")
  98. {
  99. Ogre::String name = GetString(node, "name");
  100. if(name == "")
  101. {
  102. LOG_ERROR("There is no name specified for <entity_script> tag.");
  103. continue;
  104. }
  105. EntityManager::getSingleton().AddEntityScript(name);
  106. }
  107. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "script")
  108. {
  109. Ogre::String file_name = GetString(node, "file_name");
  110. if(file_name != "")
  111. {
  112. ScriptManager::getSingleton().RunFile(file_name);
  113. }
  114. }
  115. node = node->NextSibling();
  116. }
  117. }
  118. const Ogre::String
  119. XmlMapFile::GetWalkmeshFileName()
  120. {
  121. TiXmlNode* node = m_File.RootElement();
  122. if(node == nullptr || node->ValueStr() != "map")
  123. {
  124. LOG_ERROR("Field Map XML Manager: " + m_File.ValueStr() + " is not a valid fields map file! No <map> in root.");
  125. return "";
  126. }
  127. node = node->FirstChild();
  128. while(node != nullptr)
  129. {
  130. if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "walkmesh")
  131. {
  132. return GetString(node, "file_name");
  133. }
  134. node = node->NextSibling();
  135. }
  136. LOG_WARNING("Can't find field's walkmesh in " + m_File.ValueStr() + ".");
  137. return "";
  138. }