XmlMapFile.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "core/XmlMapFile.h"
  2. #include "core/EntityManager.h"
  3. #include "core/Logger.h"
  4. #include "core/ScriptManager.h"
  5. #include "core/XmlBackground2DFile.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 == NULL || 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 != NULL )
  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 == NULL || 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 != NULL )
  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. }