Guest

Untitled

By: a guest on Sep 17th, 2009  |  syntax: C++  |  size: 24.09 KB  |  hits: 80  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Name:   GameStateLevel02.cpp
  4. //
  5. // Author: Paul Rowland (area51) and Nicolas Bertoa
  6. //
  7. // Desc :  Level specific data, inheriting generic level data from CPlayState.
  8. //
  9. ////////////////////////////////////////////////////////////////////////////////
  10.  
  11.  
  12. #include "GameStateLevel02.h"
  13. #include "GameMenuState.h"
  14. #include "GameCreditsState.h"
  15.  
  16.  
  17. // static variable instantation
  18. // Singleton
  19. CGameStateLevel02 CGameStateLevel02::m_GameStateLevel02;
  20.  
  21.  
  22. //! Default constructor
  23. CGameStateLevel02::CGameStateLevel02() {}
  24.  
  25.  
  26. //! Default destructor
  27. CGameStateLevel02::~CGameStateLevel02() {}
  28.  
  29.  
  30. CGameStateLevel02* CGameStateLevel02::Instance()
  31. {
  32.  
  33.         return ( &m_GameStateLevel02 );
  34.  
  35. }
  36.  
  37.  
  38. //! Keyboard event for level (state), main keyboard events
  39. //! passed down by Game manager
  40. void CGameStateLevel02::KeyboardEvent(CGameManager * pManager)
  41. {
  42.  
  43.         CGamePlayState::KeyboardEvent(pManager);
  44.  
  45.         // go to Game Menu Windows
  46.         if(pManager->getKey(irr::KEY_ESCAPE))
  47.                 ChangeState(pManager, CGameMenuState::Instance());
  48.  
  49. }
  50.  
  51.  
  52. //! Initialization, loads data required for level
  53. // Enter state function
  54. void CGameStateLevel02::Init(CGameManager* pManager)
  55. {
  56.  
  57.         // load enemies icon and transparent key color
  58.         mEnemiesRemainingIcon = pManager->getDriver()->getTexture("media/hobgoblin/hobgoblinicon.png");
  59.         pManager->getDriver()->makeColorKeyTexture(mEnemiesRemainingIcon,core::position2d<s32>(0,0));
  60.  
  61.         mEnemiesRemainingText = pManager->getGUIEnvironment()->addStaticText(L"", rect<int>(80, 585, 500, 800), false);
  62.         mEnemiesRemainingText->setOverrideColor(video::SColor(255,255,255,255));       
  63.         mEnemiesRemainingText->setOverrideFont(pManager->getGUIEnvironment()->getFont("media/font_lucida.bmp"));
  64.  
  65.         mBossIcon = pManager->getDriver()->getTexture("media/bossIcon.png");
  66.         pManager->getDriver()->makeColorKeyTexture(mBossIcon,core::position2d<s32>(0,0));
  67.  
  68.         mBossLifeText = pManager->getGUIEnvironment()->addStaticText(L"", rect<int>(80, 515, 220, 570), false);
  69.         mBossLifeText->setOverrideColor(video::SColor(255,255,255,255));       
  70.         mBossLifeText->setOverrideFont(pManager->getGUIEnvironment()->getFont("media/font_lucida.bmp"));
  71.  
  72.  
  73.         // perform generic initialization from parent
  74.         CGamePlayState::Init(pManager);
  75.         CGamePlayState::loadMap(pManager, "20kdm2.bsp", core::vector3df(-1300,-144,-1249), core::vector3df(112, -9, -115));
  76.  
  77.         // AI Navigation Graph, try xml first
  78.         loadPathMap(pManager);
  79.  
  80.         pManager->getWeaponManager()->addFPSWeapons(pManager);
  81.  
  82.         pManager->getPlayer()->Init(pManager); // 100% Health & Ammo
  83.  
  84.         // load in Enemy(s) NodeID and EnemyID must be the unique and the same,
  85.         // and within a range that indicates that it is an enemy, and therefore
  86.         // shootable. See CGameManager.h for ID_ENEMY_MIN & ID_ENEMY_MAX range.
  87.         for (u32 i=0; i < 6; i++)
  88.         {
  89.  
  90.                 scene::IAnimatedMeshSceneNode* enemyNode;
  91.                 scene::IAnimatedMesh* enemyModel;
  92.  
  93.                 enemyModel = pManager->getSceneManager()->getMesh("media/hobgoblin/hobgoblin.md2");
  94.  
  95.                 CGameEnemy* enemy;
  96.  
  97.                 if (enemyModel)
  98.                 {        
  99.  
  100.                         enemyNode = pManager->getSceneManager()->addAnimatedMeshSceneNode(enemyModel);
  101.                         enemyNode->setMaterialFlag(EMF_LIGHTING, false);
  102.                         enemyNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/hobgoblin/hobgoblin.pcx") );
  103.                         enemyNode->setRotation(core::vector3df(0,0,0));
  104.                         enemyNode->setMD2Animation(scene::EMAT_STAND);
  105.                         enemyNode->setScale(core::vector3df(2, 2, 2));
  106.                         enemyNode->setID(ID_ENEMY_MIN + i);
  107.  
  108.                         //get waypoint from node list in case it changes
  109.                         enemyNode->setPosition(pManager->getPathManager()->getWaypointAt(5+i));
  110.  
  111.                         enemy = new CGameEnemy(ID_ENEMY_MIN + i);  
  112.                         enemy->setMeshNode(enemyNode);
  113.                         enemy->init(pManager);
  114.                         enemy->setSpeed(1500);
  115.                         enemy->setHealth(60);
  116.                         enemy->setMaxHealth(60);
  117.                         enemy->setAttackRating(4);
  118.                         enemy->setAttackRegion(450);
  119.  
  120.                         // Play attack sound when the animation is at 75%
  121.                         enemy->setAttackSoundFrame(195);
  122.                         enemy->setShotSoundPath("media/hobgoblin/laserfire.wav");
  123.  
  124.                         if(i == 0)
  125.                                 enemy->setDeathSoundPath("media/goblin/death1.wav");
  126.                         else if(i == 1)
  127.                                 enemy->setDeathSoundPath("media/goblin/death1.wav");
  128.                         else if(i == 2)
  129.                                 enemy->setDeathSoundPath("media/goblin/death2.wav");
  130.                         else if(i == 3)
  131.                                 enemy->setDeathSoundPath("media/goblin/death2.wav");
  132.                         else if(i == 4)
  133.                                 enemy->setDeathSoundPath("media/goblin/death2.wav");
  134.  
  135.                         pManager->getSceneManager()->setShadowColor(video::SColor(150,0,0,0));
  136.                         pManager->getEnemyManager()->AddEntity(enemy);
  137.                         irr::scene::ITriangleSelector* enemySelector = pManager->getSceneManager()->
  138.                                 createTriangleSelectorFromBoundingBox(enemyNode);
  139.  
  140.                         if(enemySelector)
  141.                                 pManager->getMetaSelector()->addTriangleSelector(enemySelector);
  142.  
  143.                 }
  144.  
  145.                 scene::IAnimatedMesh* weapon = pManager->getSceneManager()->getMesh("media/hobgoblin/weapon.md2");
  146.                 scene::IAnimatedMeshSceneNode* wepNode = pManager->getSceneManager()->addAnimatedMeshSceneNode( weapon );
  147.                 wepNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/hobgoblin/weapon.pcx") );
  148.                 wepNode->setMaterialFlag(EMF_LIGHTING, false);
  149.                 wepNode->setMD2Animation(scene::EMAT_STAND);
  150.                 wepNode->setParent(enemyNode);
  151.  
  152.         }
  153.  
  154.         // Load the Boss!!!!
  155.         scene::IAnimatedMeshSceneNode* enemyNode;
  156.         scene::IAnimatedMesh* enemyModel;
  157.  
  158.         enemyModel = pManager->getSceneManager()->getMesh("media/goblin/tris.md2");
  159.  
  160.         CGameEnemy* enemy;
  161.  
  162.         if (enemyModel)
  163.         {        
  164.  
  165.                 enemyNode = pManager->getSceneManager()->addAnimatedMeshSceneNode(enemyModel);
  166.                 enemyNode->setMaterialFlag(EMF_LIGHTING, false);
  167.                 enemyNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/goblin/deadburned.pcx") );
  168.                 enemyNode->setRotation(core::vector3df(0,0,0));
  169.                 enemyNode->setMD2Animation(scene::EMAT_STAND);
  170.                 enemyNode->setScale(core::vector3df(3, 3, 3));
  171.                 enemyNode->setID(ID_ENEMY_MIN + 6);
  172.                 enemy = new CGameEnemy(ID_ENEMY_MIN + 6);  
  173.                 enemy->setSpeed(700);
  174.                 enemy->setMeshNode(enemyNode);
  175.                 enemy->setHealth(1000);
  176.                 enemy->setMaxHealth(1000);
  177.                 enemy->setAttackRating(8);
  178.                 enemy->setShotSoundPath("media/goblin/hit.wav");
  179.                 enemy->setDeathSoundPath("media/hobgoblin/death2.wav");
  180.                 enemy->init(pManager);
  181.                 enemy->setTriggerRegion(3000); 
  182.                 enemy->setAttackRegion(170);
  183.  
  184.                 pManager->getSceneManager()->setShadowColor(video::SColor(150,0,0,0));
  185.                 pManager->getEnemyManager()->AddBoss(enemy);
  186.                 pManager->getEnemyManager()->setBossMustAppear(false);
  187.                 irr::scene::ITriangleSelector* enemySelector = pManager->getSceneManager()->
  188.                         createTriangleSelectorFromBoundingBox(enemyNode);
  189.  
  190.                 if(enemySelector)
  191.                         pManager->getMetaSelector()->addTriangleSelector(enemySelector);
  192.                 scene::IAnimatedMesh* weapon = pManager->getSceneManager()->getMesh("media/goblin/weapon.md2");
  193.                 scene::IAnimatedMeshSceneNode* wepNode = pManager->getSceneManager()->addAnimatedMeshSceneNode( weapon );
  194.                 wepNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/goblin/weapon.pcx") );
  195.                 wepNode->setMaterialFlag(EMF_LIGHTING, false);
  196.                 wepNode->setMD2Animation(scene::EMAT_STAND);
  197.                 wepNode->setParent(enemyNode);
  198.  
  199.         }
  200.  
  201.  
  202.         // Enemies Size
  203.         mEnemiesRemaining = 20;
  204.  
  205.         // Finished counter
  206.         mLevelFinishedCounter = 0;
  207.  
  208.         // Add items/effects to level
  209.         addHealthPickups(pManager);
  210.  
  211.         // Set level
  212.         pManager->getEnemyManager()->setLevel(2);
  213.  
  214. }
  215.  
  216.  
  217. //! Update, game loop for level, updates, moves and
  218. //! displays all elements used by level
  219. // Update state function
  220. void CGameStateLevel02::Update(CGameManager * pManager)
  221. {
  222.  
  223.         // Begin and End Scene
  224.         pManager->getDriver()->beginScene(true, true, video::SColor(0,100,100,100));
  225.  
  226.         // is boss time???
  227.         if(mEnemiesRemaining == 0)
  228.         {
  229.  
  230.                 pManager->getEnemyManager()->setBossMustAppear(true);
  231.  
  232.                 // Boss Time!!
  233.                 mEnemiesRemaining = -1;
  234.  
  235.         }
  236.  
  237.         // perform generic update from parent
  238.         CGamePlayState::Update(pManager);
  239.         displayEnemiesRemaining(pManager);
  240.  
  241.         // Display Boss Life
  242.         if(pManager->getEnemyManager()->bossMustAppear())
  243.                 displayBossLife(pManager);
  244.  
  245.         // This is the DEMO! We go to credits state
  246.         if(levelFinished(pManager))
  247.                 ChangeState(pManager, CGameCreditsState::Instance());
  248.  
  249.  
  250.         pManager->getDriver()->endScene();
  251.  
  252.  
  253.         // If the main character dies, then I go to game credits state
  254.         if (pManager->getPlayer()->getHealth() <= 0)
  255.         {
  256.  
  257.                 if (pManager->getPlayer()->Death(pManager))
  258.                         ChangeState(pManager, CGameCreditsState::Instance());
  259.  
  260.         }
  261.  
  262. }
  263.  
  264.  
  265. //! Clears or destroys resources used by level, clean up.
  266. //  Exit state function
  267. void CGameStateLevel02::Clear(CGameManager* pManager)
  268. {
  269.  
  270.         // perform generic clean up from parent
  271.         CGamePlayState::Clear(pManager);
  272.  
  273.         if(mEnemiesRemainingText)
  274.                 mEnemiesRemainingText->remove();
  275.         if(mBossLifeText)
  276.                 mBossLifeText->remove();
  277. }
  278.  
  279.  
  280. //! Add AMMO pickups to level
  281. void CGameStateLevel02::addAmmoPickups(CGameManager* pManager)
  282. {
  283.  
  284.         // load in pickups, AMMO(s)
  285.         for (u32 i=0; i < 3; i++)
  286.         {
  287.  
  288.                 scene::IAnimatedMesh* ammoMesh = 0;
  289.                 ammoMesh = pManager->getSceneManager()->getMesh("media/ammo.ms3d");
  290.                 CGameItem* ammo = new CGameItem(GAME_ITEM_AMMO);
  291.                 ammo->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(ammoMesh));
  292.                 if (ammo->getMeshNode())
  293.                 {
  294.  
  295.                         ammo->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/ammo.tga"));
  296.                         ammo->getMeshNode()->setPosition(pManager->getPathManager()->getRandomWaypoint());
  297.                         ammo->getMeshNode()->setScale(core::vector3df(1,1,1));
  298.                         ammo->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
  299.                         ammo->getMeshNode()->addShadowVolumeSceneNode();
  300.                         ammo->getMeshNode()->setID(GAME_ITEM_AMMO); //OBJECT_PICKUP
  301.  
  302.                         // add rotation animator
  303.                         scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));      
  304.                         ammo->getMeshNode()->addAnimator(anim);
  305.                         anim->drop();
  306.                         pManager->getItemManager()->AddItem(ammo);
  307.  
  308.                 }
  309.  
  310.         }
  311.  
  312. }
  313.  
  314.  
  315. //! Add HEALTH pickups to level
  316. void CGameStateLevel02::addHealthPickups(CGameManager* pManager)
  317. {
  318.  
  319.         // load in pickups, HEALTH
  320.         for (u32 i=0; i < 2; i++)
  321.         {
  322.  
  323.                 scene::IAnimatedMesh* healthMesh = 0;
  324.                 healthMesh = pManager->getSceneManager()->getMesh("media/health.ms3d");
  325.                 CGameItem* health = new CGameItem(GAME_ITEM_HEALTH);
  326.                 health->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(healthMesh));
  327.                 if (health->getMeshNode())
  328.                 {
  329.  
  330.                         health->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/health.jpg"));
  331.                         health->getMeshNode()->setPosition(pManager->getPathManager()->getRandomWaypoint());
  332.                         health->getMeshNode()->setScale(core::vector3df(3,3,3));
  333.                         health->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
  334.                         health->getMeshNode()->addShadowVolumeSceneNode();
  335.                         health->getMeshNode()->setID(GAME_ITEM_HEALTH); //OBJECT_PICKUP
  336.                         health->setTriggerRegion(70);//reduce radius due to model size
  337.  
  338.  
  339.                         // add rotation animator
  340.                         scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));      
  341.                         health->getMeshNode()->addAnimator(anim);
  342.                         anim->drop();
  343.                         pManager->getItemManager()->AddItem(health);
  344.  
  345.                 }
  346.  
  347.         }
  348.  
  349. }
  350.  
  351.  
  352. //! Add KEY pickups to level
  353. void CGameStateLevel02::addKeyPickups(CGameManager* pManager)
  354. {
  355.  
  356.         // load in pickups, Key
  357.         scene::IAnimatedMesh* keyMesh = 0;
  358.         keyMesh = pManager->getSceneManager()->getMesh("media/key.ms3d");
  359.         CGameItem* key = new CGameItem(GAME_ITEM_KEY);
  360.         key->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(keyMesh));
  361.         if (key->getMeshNode())
  362.         {
  363.  
  364.                 key->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/key.jpg"));
  365.                 key->getMeshNode()->setPosition(vector3df(0,-500,0)); // off screen
  366.                 key->getMeshNode()->setScale(core::vector3df(1,1,1));
  367.                 key->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
  368.                 key->getMeshNode()->addShadowVolumeSceneNode();
  369.                 key->getMeshNode()->setID(GAME_ITEM_KEY); //OBJECT_PICKUP
  370.                 key->setTriggerRegion(70);//reduce radius due to model size
  371.  
  372.                 // add rotation animator
  373.                 scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));      
  374.                 key->getMeshNode()->addAnimator(anim);
  375.                 anim->drop();
  376.                 pManager->getItemManager()->AddItem(key);
  377.  
  378.         }
  379.  
  380. }
  381.  
  382.  
  383. // Decrement Enemies remaining
  384. void CGameStateLevel02::decrementEnemiesRemaining(void)
  385. {
  386.  
  387.         if(mEnemiesRemaining > 0)
  388.                 mEnemiesRemaining--;
  389.  
  390. }
  391.  
  392.  
  393. //! We can create a new enemy only if enemies remaining - enemies actives > 0
  394. bool CGameStateLevel02::acceptEnemyCreation(CGameManager * pManager)
  395. {
  396.  
  397.         // All the enemies actives except the enemy recently killed
  398.         return mEnemiesRemaining > pManager->getEnemyManager()->GetEntitySize()-1;
  399.  
  400. }
  401.  
  402.  
  403. //! Define the Navigation Graph for this game level
  404. void CGameStateLevel02::loadPathMap(CGameManager* pManager)
  405. {
  406.  
  407.         irr::f32 offset = -18; // height offset for model, taller model more offset required
  408.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(110,-9+offset,86));                // node 00
  409.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(105,-9+offset,275));               // node 01
  410.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(111, 118+offset, 565));    // node 02
  411.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(119, 118+offset, 867));    // node 03
  412.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-92, 118+offset, 498));    // node 04
  413.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, 471));   // node 05
  414.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, 103));   // node 06
  415.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, -286));  // node 07
  416.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-72, 118+offset, -291));   // node 08
  417.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-80, 118+offset, -469));   // node 09
  418.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-85, 182+offset, -616));   // node 10
  419.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-88, 182+offset, -829));   // node 11
  420.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(292, 182+offset, -836));   // node 12
  421.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(292, 182+offset, -611));   // node 13
  422.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(301, 118+offset, -480));   // node 14
  423.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(107, 118+offset, -361));   // node 15
  424.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(112, -9+offset, -115));    // node 16
  425.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(321, 118+offset, 473));    // node 17
  426.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(616, 118+offset, 464));    // node 18
  427.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(617, 118+offset, 89));     // node 19
  428.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(610, 118+offset, -288));   // node 20
  429.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(859, 118+offset, 473));    // node 21
  430.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(1010, 150+offset, 531));   // node 22
  431.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(1113, 182+offset, 672));   // node 23
  432.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(1090, 214+offset, 889));   // node 24
  433.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(871, 246+offset, 987));    // node 25
  434.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(621, 246+offset, 1001));   // node 26
  435.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(628, 342+offset, 755));    // node 27
  436.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(619, 340+offset, 479));    // node 28
  437.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(612, 340+offset, 92));     // node 29
  438.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(622, 340+offset, -287));   // node 30
  439.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(619, 342+offset, -517));   // node 31
  440.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(613, 278+offset, -833));   // node 32
  441.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(367, 342+offset, 97));     // node 33
  442.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(181, 340+offset, 474));    // node 34
  443.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, 476));   // node 35
  444.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, 93));    // node 36
  445.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, -107));  // node 37
  446.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-162, 342+offset, 95));    // node 38
  447.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(250, 118+offset, 970));    // node 39
  448.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-88,-9+offset,90));                // node 40
  449.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-350,-9+offset,90));               // node 41
  450.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(-490,-9+offset,90));               // node 42
  451.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(340,-9+offset,90));                // node 43
  452.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(550,-9+offset,90));                // node 44
  453.         pManager->getPathManager()->setWaypoint(irr::core::vector3df(720,-9+offset,90));                // node 45
  454.  
  455.         pManager->getPathManager()->setAdjacentNode(0, 1);
  456.         pManager->getPathManager()->setAdjacentNode(0, 16);
  457.         pManager->getPathManager()->setAdjacentNode(0, 40);
  458.         pManager->getPathManager()->setAdjacentNode(0, 43);
  459.         pManager->getPathManager()->setAdjacentNode(1, 0);
  460.         pManager->getPathManager()->setAdjacentNode(1, 2);
  461.         pManager->getPathManager()->setAdjacentNode(2, 1);
  462.         pManager->getPathManager()->setAdjacentNode(2, 3);
  463.         pManager->getPathManager()->setAdjacentNode(2, 4);
  464.         pManager->getPathManager()->setAdjacentNode(2, 17);
  465.         pManager->getPathManager()->setAdjacentNode(3, 2);
  466.         pManager->getPathManager()->setAdjacentNode(3, 39);
  467.         pManager->getPathManager()->setAdjacentNode(4, 2);
  468.         pManager->getPathManager()->setAdjacentNode(4, 5);
  469.         pManager->getPathManager()->setAdjacentNode(5, 4);
  470.         pManager->getPathManager()->setAdjacentNode(5, 6);
  471.         pManager->getPathManager()->setAdjacentNode(6, 5);
  472.         pManager->getPathManager()->setAdjacentNode(6, 7);
  473.         pManager->getPathManager()->setAdjacentNode(7, 6);
  474.         pManager->getPathManager()->setAdjacentNode(7, 8);
  475.         pManager->getPathManager()->setAdjacentNode(8, 7);
  476.         pManager->getPathManager()->setAdjacentNode(8, 9);
  477.         pManager->getPathManager()->setAdjacentNode(8, 15);
  478.         pManager->getPathManager()->setAdjacentNode(9, 8);
  479.         pManager->getPathManager()->setAdjacentNode(9, 10);
  480.         pManager->getPathManager()->setAdjacentNode(9, 15);
  481.         pManager->getPathManager()->setAdjacentNode(10, 9);
  482.         pManager->getPathManager()->setAdjacentNode(10, 11);
  483.         pManager->getPathManager()->setAdjacentNode(11, 10);
  484.         pManager->getPathManager()->setAdjacentNode(11, 12);
  485.         pManager->getPathManager()->setAdjacentNode(12, 11);
  486.         pManager->getPathManager()->setAdjacentNode(12, 13);
  487.         pManager->getPathManager()->setAdjacentNode(13, 12);
  488.         pManager->getPathManager()->setAdjacentNode(13, 14);
  489.         pManager->getPathManager()->setAdjacentNode(14, 13);
  490.         pManager->getPathManager()->setAdjacentNode(14, 15);
  491.         pManager->getPathManager()->setAdjacentNode(15, 8);
  492.         pManager->getPathManager()->setAdjacentNode(15, 9);
  493.         pManager->getPathManager()->setAdjacentNode(15, 14);
  494.         pManager->getPathManager()->setAdjacentNode(15, 16);
  495.         pManager->getPathManager()->setAdjacentNode(16, 15);
  496.         pManager->getPathManager()->setAdjacentNode(16, 0);
  497.         pManager->getPathManager()->setAdjacentNode(17, 2);
  498.         pManager->getPathManager()->setAdjacentNode(17, 18);
  499.         pManager->getPathManager()->setAdjacentNode(18, 17);
  500.         pManager->getPathManager()->setAdjacentNode(18, 19);
  501.         pManager->getPathManager()->setAdjacentNode(18, 21);
  502.         pManager->getPathManager()->setAdjacentNode(19, 18);
  503.         pManager->getPathManager()->setAdjacentNode(19, 20);
  504.         pManager->getPathManager()->setAdjacentNode(20, 19);
  505.         pManager->getPathManager()->setAdjacentNode(21, 18);
  506.         pManager->getPathManager()->setAdjacentNode(21, 22);
  507.         pManager->getPathManager()->setAdjacentNode(22, 21);
  508.         pManager->getPathManager()->setAdjacentNode(22, 23);
  509.         pManager->getPathManager()->setAdjacentNode(23, 22);
  510.         pManager->getPathManager()->setAdjacentNode(23, 24);
  511.         pManager->getPathManager()->setAdjacentNode(24, 23);
  512.         pManager->getPathManager()->setAdjacentNode(24, 25);
  513.         pManager->getPathManager()->setAdjacentNode(25, 24);
  514.         pManager->getPathManager()->setAdjacentNode(25, 26);
  515.         pManager->getPathManager()->setAdjacentNode(26, 25);
  516.         pManager->getPathManager()->setAdjacentNode(26, 27);
  517.         pManager->getPathManager()->setAdjacentNode(27, 26);
  518.         pManager->getPathManager()->setAdjacentNode(27, 28);
  519.         pManager->getPathManager()->setAdjacentNode(28, 27);
  520.         pManager->getPathManager()->setAdjacentNode(28, 29);
  521.         pManager->getPathManager()->setAdjacentNode(28, 34);
  522.         pManager->getPathManager()->setAdjacentNode(29, 28);
  523.         pManager->getPathManager()->setAdjacentNode(29, 30);
  524.         pManager->getPathManager()->setAdjacentNode(29, 33);
  525.         pManager->getPathManager()->setAdjacentNode(30, 29);
  526.         pManager->getPathManager()->setAdjacentNode(30, 31);
  527.         pManager->getPathManager()->setAdjacentNode(31, 30);
  528.         pManager->getPathManager()->setAdjacentNode(31, 32);
  529.         pManager->getPathManager()->setAdjacentNode(32, 31);
  530.         pManager->getPathManager()->setAdjacentNode(33, 29);
  531.         pManager->getPathManager()->setAdjacentNode(34, 28);
  532.         pManager->getPathManager()->setAdjacentNode(34, 35);
  533.         pManager->getPathManager()->setAdjacentNode(35, 34);
  534.         pManager->getPathManager()->setAdjacentNode(35, 36);
  535.         pManager->getPathManager()->setAdjacentNode(36, 35);
  536.         pManager->getPathManager()->setAdjacentNode(36, 37);
  537.         pManager->getPathManager()->setAdjacentNode(36, 38);
  538.         pManager->getPathManager()->setAdjacentNode(37, 36);
  539.         pManager->getPathManager()->setAdjacentNode(38, 36);
  540.         pManager->getPathManager()->setAdjacentNode(39, 3);
  541.         pManager->getPathManager()->setAdjacentNode(40, 0);
  542.         pManager->getPathManager()->setAdjacentNode(40, 41);
  543.         pManager->getPathManager()->setAdjacentNode(41, 40);
  544.         pManager->getPathManager()->setAdjacentNode(41, 42);
  545.         pManager->getPathManager()->setAdjacentNode(42, 41);
  546.         pManager->getPathManager()->setAdjacentNode(43, 0);
  547.         pManager->getPathManager()->setAdjacentNode(43, 44);
  548.         pManager->getPathManager()->setAdjacentNode(44, 43);
  549.         pManager->getPathManager()->setAdjacentNode(44, 45);
  550.         pManager->getPathManager()->setAdjacentNode(45, 44);
  551.  
  552. }
  553.  
  554.  
  555. //! Display enemies remaining before Boss
  556. void CGameStateLevel02::displayEnemiesRemaining(CGameManager* pManager)
  557. {
  558.  
  559.         pManager->getDriver()->draw2DImage(mEnemiesRemainingIcon, irr::core::position2d< irr::s32 >(20,570),
  560.                 irr::core::rect< irr::s32 >(0, 0, mEnemiesRemainingIcon->getSize().Height, mEnemiesRemainingIcon->getSize().Width), 0,
  561.                 irr::video::SColor(255, 255, 255, 255), true);
  562.  
  563.         // Enemies remaining before boss
  564.         core::stringw str = "";
  565.  
  566.         // There are Enemies to kill!
  567.         if(mEnemiesRemaining >= 0)
  568.                 str += mEnemiesRemaining;
  569.  
  570.         // BOSS TIME!!!
  571.         else if(pManager->getEnemyManager()->isBossKilled())
  572.                 str += "Congratulations!!";
  573.  
  574.         else
  575.                 str += "It's Show Time!";
  576.  
  577.         mEnemiesRemainingText->setText(str.c_str());
  578.  
  579. }
  580.  
  581.  
  582. //! Display boss remaining life
  583. void CGameStateLevel02::displayBossLife(CGameManager* pManager)
  584. {
  585.  
  586.         pManager->getDriver()->draw2DImage(mBossIcon, irr::core::position2d< irr::s32 >(20,500),
  587.                 irr::core::rect< irr::s32 >(0, 0, mEnemiesRemainingIcon->getSize().Height, mEnemiesRemainingIcon->getSize().Width), 0,
  588.                 irr::video::SColor(255, 255, 255, 255), true);
  589.  
  590.         // Current boss health
  591.         core::stringw str = "";
  592.         str += pManager->getEnemyManager()->getBossEntity()->getHealth();
  593.         mBossLifeText->setText(str.c_str());
  594.  
  595. }
  596.  
  597.  
  598. //! Returns true if it is the correct time to pass to the next level then you killed the boss
  599. bool CGameStateLevel02::levelFinished(CGameManager* pManager)
  600. {
  601.  
  602.         // We increase the counter only if the boss is dead
  603.         if(pManager->getEnemyManager()->isBossKilled())
  604.                 mLevelFinishedCounter++;
  605.  
  606.         if(mLevelFinishedCounter > 500)
  607.                 return true;
  608.  
  609.         else
  610.                 return false;
  611.  
  612. }