////////////////////////////////////////////////////////////////////////////////
//
// Name: GameStateLevel02.cpp
//
// Author: Paul Rowland (area51) and Nicolas Bertoa
//
// Desc : Level specific data, inheriting generic level data from CPlayState.
//
////////////////////////////////////////////////////////////////////////////////
#include "GameStateLevel02.h"
#include "GameMenuState.h"
#include "GameCreditsState.h"
// static variable instantation
// Singleton
CGameStateLevel02 CGameStateLevel02::m_GameStateLevel02;
//! Default constructor
CGameStateLevel02::CGameStateLevel02() {}
//! Default destructor
CGameStateLevel02::~CGameStateLevel02() {}
CGameStateLevel02* CGameStateLevel02::Instance()
{
return ( &m_GameStateLevel02 );
}
//! Keyboard event for level (state), main keyboard events
//! passed down by Game manager
void CGameStateLevel02::KeyboardEvent(CGameManager * pManager)
{
CGamePlayState::KeyboardEvent(pManager);
// go to Game Menu Windows
if(pManager->getKey(irr::KEY_ESCAPE))
ChangeState(pManager, CGameMenuState::Instance());
}
//! Initialization, loads data required for level
// Enter state function
void CGameStateLevel02::Init(CGameManager* pManager)
{
// load enemies icon and transparent key color
mEnemiesRemainingIcon = pManager->getDriver()->getTexture("media/hobgoblin/hobgoblinicon.png");
pManager->getDriver()->makeColorKeyTexture(mEnemiesRemainingIcon,core::position2d<s32>(0,0));
mEnemiesRemainingText = pManager->getGUIEnvironment()->addStaticText(L"", rect<int>(80, 585, 500, 800), false);
mEnemiesRemainingText->setOverrideColor(video::SColor(255,255,255,255));
mEnemiesRemainingText->setOverrideFont(pManager->getGUIEnvironment()->getFont("media/font_lucida.bmp"));
mBossIcon = pManager->getDriver()->getTexture("media/bossIcon.png");
pManager->getDriver()->makeColorKeyTexture(mBossIcon,core::position2d<s32>(0,0));
mBossLifeText = pManager->getGUIEnvironment()->addStaticText(L"", rect<int>(80, 515, 220, 570), false);
mBossLifeText->setOverrideColor(video::SColor(255,255,255,255));
mBossLifeText->setOverrideFont(pManager->getGUIEnvironment()->getFont("media/font_lucida.bmp"));
// perform generic initialization from parent
CGamePlayState::Init(pManager);
CGamePlayState::loadMap(pManager, "20kdm2.bsp", core::vector3df(-1300,-144,-1249), core::vector3df(112, -9, -115));
// AI Navigation Graph, try xml first
loadPathMap(pManager);
pManager->getWeaponManager()->addFPSWeapons(pManager);
pManager->getPlayer()->Init(pManager); // 100% Health & Ammo
// load in Enemy(s) NodeID and EnemyID must be the unique and the same,
// and within a range that indicates that it is an enemy, and therefore
// shootable. See CGameManager.h for ID_ENEMY_MIN & ID_ENEMY_MAX range.
for (u32 i=0; i < 6; i++)
{
scene::IAnimatedMeshSceneNode* enemyNode;
scene::IAnimatedMesh* enemyModel;
enemyModel = pManager->getSceneManager()->getMesh("media/hobgoblin/hobgoblin.md2");
CGameEnemy* enemy;
if (enemyModel)
{
enemyNode = pManager->getSceneManager()->addAnimatedMeshSceneNode(enemyModel);
enemyNode->setMaterialFlag(EMF_LIGHTING, false);
enemyNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/hobgoblin/hobgoblin.pcx") );
enemyNode->setRotation(core::vector3df(0,0,0));
enemyNode->setMD2Animation(scene::EMAT_STAND);
enemyNode->setScale(core::vector3df(2, 2, 2));
enemyNode->setID(ID_ENEMY_MIN + i);
//get waypoint from node list in case it changes
enemyNode->setPosition(pManager->getPathManager()->getWaypointAt(5+i));
enemy = new CGameEnemy(ID_ENEMY_MIN + i);
enemy->setMeshNode(enemyNode);
enemy->init(pManager);
enemy->setSpeed(1500);
enemy->setHealth(60);
enemy->setMaxHealth(60);
enemy->setAttackRating(4);
enemy->setAttackRegion(450);
// Play attack sound when the animation is at 75%
enemy->setAttackSoundFrame(195);
enemy->setShotSoundPath("media/hobgoblin/laserfire.wav");
if(i == 0)
enemy->setDeathSoundPath("media/goblin/death1.wav");
else if(i == 1)
enemy->setDeathSoundPath("media/goblin/death1.wav");
else if(i == 2)
enemy->setDeathSoundPath("media/goblin/death2.wav");
else if(i == 3)
enemy->setDeathSoundPath("media/goblin/death2.wav");
else if(i == 4)
enemy->setDeathSoundPath("media/goblin/death2.wav");
pManager->getSceneManager()->setShadowColor(video::SColor(150,0,0,0));
pManager->getEnemyManager()->AddEntity(enemy);
irr::scene::ITriangleSelector* enemySelector = pManager->getSceneManager()->
createTriangleSelectorFromBoundingBox(enemyNode);
if(enemySelector)
pManager->getMetaSelector()->addTriangleSelector(enemySelector);
}
scene::IAnimatedMesh* weapon = pManager->getSceneManager()->getMesh("media/hobgoblin/weapon.md2");
scene::IAnimatedMeshSceneNode* wepNode = pManager->getSceneManager()->addAnimatedMeshSceneNode( weapon );
wepNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/hobgoblin/weapon.pcx") );
wepNode->setMaterialFlag(EMF_LIGHTING, false);
wepNode->setMD2Animation(scene::EMAT_STAND);
wepNode->setParent(enemyNode);
}
// Load the Boss!!!!
scene::IAnimatedMeshSceneNode* enemyNode;
scene::IAnimatedMesh* enemyModel;
enemyModel = pManager->getSceneManager()->getMesh("media/goblin/tris.md2");
CGameEnemy* enemy;
if (enemyModel)
{
enemyNode = pManager->getSceneManager()->addAnimatedMeshSceneNode(enemyModel);
enemyNode->setMaterialFlag(EMF_LIGHTING, false);
enemyNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/goblin/deadburned.pcx") );
enemyNode->setRotation(core::vector3df(0,0,0));
enemyNode->setMD2Animation(scene::EMAT_STAND);
enemyNode->setScale(core::vector3df(3, 3, 3));
enemyNode->setID(ID_ENEMY_MIN + 6);
enemy = new CGameEnemy(ID_ENEMY_MIN + 6);
enemy->setSpeed(700);
enemy->setMeshNode(enemyNode);
enemy->setHealth(1000);
enemy->setMaxHealth(1000);
enemy->setAttackRating(8);
enemy->setShotSoundPath("media/goblin/hit.wav");
enemy->setDeathSoundPath("media/hobgoblin/death2.wav");
enemy->init(pManager);
enemy->setTriggerRegion(3000);
enemy->setAttackRegion(170);
pManager->getSceneManager()->setShadowColor(video::SColor(150,0,0,0));
pManager->getEnemyManager()->AddBoss(enemy);
pManager->getEnemyManager()->setBossMustAppear(false);
irr::scene::ITriangleSelector* enemySelector = pManager->getSceneManager()->
createTriangleSelectorFromBoundingBox(enemyNode);
if(enemySelector)
pManager->getMetaSelector()->addTriangleSelector(enemySelector);
scene::IAnimatedMesh* weapon = pManager->getSceneManager()->getMesh("media/goblin/weapon.md2");
scene::IAnimatedMeshSceneNode* wepNode = pManager->getSceneManager()->addAnimatedMeshSceneNode( weapon );
wepNode->setMaterialTexture( 0, pManager->getDriver()->getTexture("media/goblin/weapon.pcx") );
wepNode->setMaterialFlag(EMF_LIGHTING, false);
wepNode->setMD2Animation(scene::EMAT_STAND);
wepNode->setParent(enemyNode);
}
// Enemies Size
mEnemiesRemaining = 20;
// Finished counter
mLevelFinishedCounter = 0;
// Add items/effects to level
addHealthPickups(pManager);
// Set level
pManager->getEnemyManager()->setLevel(2);
}
//! Update, game loop for level, updates, moves and
//! displays all elements used by level
// Update state function
void CGameStateLevel02::Update(CGameManager * pManager)
{
// Begin and End Scene
pManager->getDriver()->beginScene(true, true, video::SColor(0,100,100,100));
// is boss time???
if(mEnemiesRemaining == 0)
{
pManager->getEnemyManager()->setBossMustAppear(true);
// Boss Time!!
mEnemiesRemaining = -1;
}
// perform generic update from parent
CGamePlayState::Update(pManager);
displayEnemiesRemaining(pManager);
// Display Boss Life
if(pManager->getEnemyManager()->bossMustAppear())
displayBossLife(pManager);
// This is the DEMO! We go to credits state
if(levelFinished(pManager))
ChangeState(pManager, CGameCreditsState::Instance());
pManager->getDriver()->endScene();
// If the main character dies, then I go to game credits state
if (pManager->getPlayer()->getHealth() <= 0)
{
if (pManager->getPlayer()->Death(pManager))
ChangeState(pManager, CGameCreditsState::Instance());
}
}
//! Clears or destroys resources used by level, clean up.
// Exit state function
void CGameStateLevel02::Clear(CGameManager* pManager)
{
// perform generic clean up from parent
CGamePlayState::Clear(pManager);
if(mEnemiesRemainingText)
mEnemiesRemainingText->remove();
if(mBossLifeText)
mBossLifeText->remove();
}
//! Add AMMO pickups to level
void CGameStateLevel02::addAmmoPickups(CGameManager* pManager)
{
// load in pickups, AMMO(s)
for (u32 i=0; i < 3; i++)
{
scene::IAnimatedMesh* ammoMesh = 0;
ammoMesh = pManager->getSceneManager()->getMesh("media/ammo.ms3d");
CGameItem* ammo = new CGameItem(GAME_ITEM_AMMO);
ammo->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(ammoMesh));
if (ammo->getMeshNode())
{
ammo->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/ammo.tga"));
ammo->getMeshNode()->setPosition(pManager->getPathManager()->getRandomWaypoint());
ammo->getMeshNode()->setScale(core::vector3df(1,1,1));
ammo->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
ammo->getMeshNode()->addShadowVolumeSceneNode();
ammo->getMeshNode()->setID(GAME_ITEM_AMMO); //OBJECT_PICKUP
// add rotation animator
scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));
ammo->getMeshNode()->addAnimator(anim);
anim->drop();
pManager->getItemManager()->AddItem(ammo);
}
}
}
//! Add HEALTH pickups to level
void CGameStateLevel02::addHealthPickups(CGameManager* pManager)
{
// load in pickups, HEALTH
for (u32 i=0; i < 2; i++)
{
scene::IAnimatedMesh* healthMesh = 0;
healthMesh = pManager->getSceneManager()->getMesh("media/health.ms3d");
CGameItem* health = new CGameItem(GAME_ITEM_HEALTH);
health->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(healthMesh));
if (health->getMeshNode())
{
health->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/health.jpg"));
health->getMeshNode()->setPosition(pManager->getPathManager()->getRandomWaypoint());
health->getMeshNode()->setScale(core::vector3df(3,3,3));
health->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
health->getMeshNode()->addShadowVolumeSceneNode();
health->getMeshNode()->setID(GAME_ITEM_HEALTH); //OBJECT_PICKUP
health->setTriggerRegion(70);//reduce radius due to model size
// add rotation animator
scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));
health->getMeshNode()->addAnimator(anim);
anim->drop();
pManager->getItemManager()->AddItem(health);
}
}
}
//! Add KEY pickups to level
void CGameStateLevel02::addKeyPickups(CGameManager* pManager)
{
// load in pickups, Key
scene::IAnimatedMesh* keyMesh = 0;
keyMesh = pManager->getSceneManager()->getMesh("media/key.ms3d");
CGameItem* key = new CGameItem(GAME_ITEM_KEY);
key->setMeshNode(pManager->getSceneManager()->addAnimatedMeshSceneNode(keyMesh));
if (key->getMeshNode())
{
key->getMeshNode()->setMaterialTexture(0, pManager->getDriver()->getTexture("media/key.jpg"));
key->getMeshNode()->setPosition(vector3df(0,-500,0)); // off screen
key->getMeshNode()->setScale(core::vector3df(1,1,1));
key->getMeshNode()->setMaterialFlag(video::EMF_LIGHTING, true);
key->getMeshNode()->addShadowVolumeSceneNode();
key->getMeshNode()->setID(GAME_ITEM_KEY); //OBJECT_PICKUP
key->setTriggerRegion(70);//reduce radius due to model size
// add rotation animator
scene::ISceneNodeAnimator* anim = pManager->getSceneManager()->createRotationAnimator(core::vector3df(0,3.0f,0));
key->getMeshNode()->addAnimator(anim);
anim->drop();
pManager->getItemManager()->AddItem(key);
}
}
// Decrement Enemies remaining
void CGameStateLevel02::decrementEnemiesRemaining(void)
{
if(mEnemiesRemaining > 0)
mEnemiesRemaining--;
}
//! We can create a new enemy only if enemies remaining - enemies actives > 0
bool CGameStateLevel02::acceptEnemyCreation(CGameManager * pManager)
{
// All the enemies actives except the enemy recently killed
return mEnemiesRemaining > pManager->getEnemyManager()->GetEntitySize()-1;
}
//! Define the Navigation Graph for this game level
void CGameStateLevel02::loadPathMap(CGameManager* pManager)
{
irr::f32 offset = -18; // height offset for model, taller model more offset required
pManager->getPathManager()->setWaypoint(irr::core::vector3df(110,-9+offset,86)); // node 00
pManager->getPathManager()->setWaypoint(irr::core::vector3df(105,-9+offset,275)); // node 01
pManager->getPathManager()->setWaypoint(irr::core::vector3df(111, 118+offset, 565)); // node 02
pManager->getPathManager()->setWaypoint(irr::core::vector3df(119, 118+offset, 867)); // node 03
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-92, 118+offset, 498)); // node 04
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, 471)); // node 05
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, 103)); // node 06
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-400, 118+offset, -286)); // node 07
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-72, 118+offset, -291)); // node 08
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-80, 118+offset, -469)); // node 09
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-85, 182+offset, -616)); // node 10
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-88, 182+offset, -829)); // node 11
pManager->getPathManager()->setWaypoint(irr::core::vector3df(292, 182+offset, -836)); // node 12
pManager->getPathManager()->setWaypoint(irr::core::vector3df(292, 182+offset, -611)); // node 13
pManager->getPathManager()->setWaypoint(irr::core::vector3df(301, 118+offset, -480)); // node 14
pManager->getPathManager()->setWaypoint(irr::core::vector3df(107, 118+offset, -361)); // node 15
pManager->getPathManager()->setWaypoint(irr::core::vector3df(112, -9+offset, -115)); // node 16
pManager->getPathManager()->setWaypoint(irr::core::vector3df(321, 118+offset, 473)); // node 17
pManager->getPathManager()->setWaypoint(irr::core::vector3df(616, 118+offset, 464)); // node 18
pManager->getPathManager()->setWaypoint(irr::core::vector3df(617, 118+offset, 89)); // node 19
pManager->getPathManager()->setWaypoint(irr::core::vector3df(610, 118+offset, -288)); // node 20
pManager->getPathManager()->setWaypoint(irr::core::vector3df(859, 118+offset, 473)); // node 21
pManager->getPathManager()->setWaypoint(irr::core::vector3df(1010, 150+offset, 531)); // node 22
pManager->getPathManager()->setWaypoint(irr::core::vector3df(1113, 182+offset, 672)); // node 23
pManager->getPathManager()->setWaypoint(irr::core::vector3df(1090, 214+offset, 889)); // node 24
pManager->getPathManager()->setWaypoint(irr::core::vector3df(871, 246+offset, 987)); // node 25
pManager->getPathManager()->setWaypoint(irr::core::vector3df(621, 246+offset, 1001)); // node 26
pManager->getPathManager()->setWaypoint(irr::core::vector3df(628, 342+offset, 755)); // node 27
pManager->getPathManager()->setWaypoint(irr::core::vector3df(619, 340+offset, 479)); // node 28
pManager->getPathManager()->setWaypoint(irr::core::vector3df(612, 340+offset, 92)); // node 29
pManager->getPathManager()->setWaypoint(irr::core::vector3df(622, 340+offset, -287)); // node 30
pManager->getPathManager()->setWaypoint(irr::core::vector3df(619, 342+offset, -517)); // node 31
pManager->getPathManager()->setWaypoint(irr::core::vector3df(613, 278+offset, -833)); // node 32
pManager->getPathManager()->setWaypoint(irr::core::vector3df(367, 342+offset, 97)); // node 33
pManager->getPathManager()->setWaypoint(irr::core::vector3df(181, 340+offset, 474)); // node 34
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, 476)); // node 35
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, 93)); // node 36
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-406, 340+offset, -107)); // node 37
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-162, 342+offset, 95)); // node 38
pManager->getPathManager()->setWaypoint(irr::core::vector3df(250, 118+offset, 970)); // node 39
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-88,-9+offset,90)); // node 40
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-350,-9+offset,90)); // node 41
pManager->getPathManager()->setWaypoint(irr::core::vector3df(-490,-9+offset,90)); // node 42
pManager->getPathManager()->setWaypoint(irr::core::vector3df(340,-9+offset,90)); // node 43
pManager->getPathManager()->setWaypoint(irr::core::vector3df(550,-9+offset,90)); // node 44
pManager->getPathManager()->setWaypoint(irr::core::vector3df(720,-9+offset,90)); // node 45
pManager->getPathManager()->setAdjacentNode(0, 1);
pManager->getPathManager()->setAdjacentNode(0, 16);
pManager->getPathManager()->setAdjacentNode(0, 40);
pManager->getPathManager()->setAdjacentNode(0, 43);
pManager->getPathManager()->setAdjacentNode(1, 0);
pManager->getPathManager()->setAdjacentNode(1, 2);
pManager->getPathManager()->setAdjacentNode(2, 1);
pManager->getPathManager()->setAdjacentNode(2, 3);
pManager->getPathManager()->setAdjacentNode(2, 4);
pManager->getPathManager()->setAdjacentNode(2, 17);
pManager->getPathManager()->setAdjacentNode(3, 2);
pManager->getPathManager()->setAdjacentNode(3, 39);
pManager->getPathManager()->setAdjacentNode(4, 2);
pManager->getPathManager()->setAdjacentNode(4, 5);
pManager->getPathManager()->setAdjacentNode(5, 4);
pManager->getPathManager()->setAdjacentNode(5, 6);
pManager->getPathManager()->setAdjacentNode(6, 5);
pManager->getPathManager()->setAdjacentNode(6, 7);
pManager->getPathManager()->setAdjacentNode(7, 6);
pManager->getPathManager()->setAdjacentNode(7, 8);
pManager->getPathManager()->setAdjacentNode(8, 7);
pManager->getPathManager()->setAdjacentNode(8, 9);
pManager->getPathManager()->setAdjacentNode(8, 15);
pManager->getPathManager()->setAdjacentNode(9, 8);
pManager->getPathManager()->setAdjacentNode(9, 10);
pManager->getPathManager()->setAdjacentNode(9, 15);
pManager->getPathManager()->setAdjacentNode(10, 9);
pManager->getPathManager()->setAdjacentNode(10, 11);
pManager->getPathManager()->setAdjacentNode(11, 10);
pManager->getPathManager()->setAdjacentNode(11, 12);
pManager->getPathManager()->setAdjacentNode(12, 11);
pManager->getPathManager()->setAdjacentNode(12, 13);
pManager->getPathManager()->setAdjacentNode(13, 12);
pManager->getPathManager()->setAdjacentNode(13, 14);
pManager->getPathManager()->setAdjacentNode(14, 13);
pManager->getPathManager()->setAdjacentNode(14, 15);
pManager->getPathManager()->setAdjacentNode(15, 8);
pManager->getPathManager()->setAdjacentNode(15, 9);
pManager->getPathManager()->setAdjacentNode(15, 14);
pManager->getPathManager()->setAdjacentNode(15, 16);
pManager->getPathManager()->setAdjacentNode(16, 15);
pManager->getPathManager()->setAdjacentNode(16, 0);
pManager->getPathManager()->setAdjacentNode(17, 2);
pManager->getPathManager()->setAdjacentNode(17, 18);
pManager->getPathManager()->setAdjacentNode(18, 17);
pManager->getPathManager()->setAdjacentNode(18, 19);
pManager->getPathManager()->setAdjacentNode(18, 21);
pManager->getPathManager()->setAdjacentNode(19, 18);
pManager->getPathManager()->setAdjacentNode(19, 20);
pManager->getPathManager()->setAdjacentNode(20, 19);
pManager->getPathManager()->setAdjacentNode(21, 18);
pManager->getPathManager()->setAdjacentNode(21, 22);
pManager->getPathManager()->setAdjacentNode(22, 21);
pManager->getPathManager()->setAdjacentNode(22, 23);
pManager->getPathManager()->setAdjacentNode(23, 22);
pManager->getPathManager()->setAdjacentNode(23, 24);
pManager->getPathManager()->setAdjacentNode(24, 23);
pManager->getPathManager()->setAdjacentNode(24, 25);
pManager->getPathManager()->setAdjacentNode(25, 24);
pManager->getPathManager()->setAdjacentNode(25, 26);
pManager->getPathManager()->setAdjacentNode(26, 25);
pManager->getPathManager()->setAdjacentNode(26, 27);
pManager->getPathManager()->setAdjacentNode(27, 26);
pManager->getPathManager()->setAdjacentNode(27, 28);
pManager->getPathManager()->setAdjacentNode(28, 27);
pManager->getPathManager()->setAdjacentNode(28, 29);
pManager->getPathManager()->setAdjacentNode(28, 34);
pManager->getPathManager()->setAdjacentNode(29, 28);
pManager->getPathManager()->setAdjacentNode(29, 30);
pManager->getPathManager()->setAdjacentNode(29, 33);
pManager->getPathManager()->setAdjacentNode(30, 29);
pManager->getPathManager()->setAdjacentNode(30, 31);
pManager->getPathManager()->setAdjacentNode(31, 30);
pManager->getPathManager()->setAdjacentNode(31, 32);
pManager->getPathManager()->setAdjacentNode(32, 31);
pManager->getPathManager()->setAdjacentNode(33, 29);
pManager->getPathManager()->setAdjacentNode(34, 28);
pManager->getPathManager()->setAdjacentNode(34, 35);
pManager->getPathManager()->setAdjacentNode(35, 34);
pManager->getPathManager()->setAdjacentNode(35, 36);
pManager->getPathManager()->setAdjacentNode(36, 35);
pManager->getPathManager()->setAdjacentNode(36, 37);
pManager->getPathManager()->setAdjacentNode(36, 38);
pManager->getPathManager()->setAdjacentNode(37, 36);
pManager->getPathManager()->setAdjacentNode(38, 36);
pManager->getPathManager()->setAdjacentNode(39, 3);
pManager->getPathManager()->setAdjacentNode(40, 0);
pManager->getPathManager()->setAdjacentNode(40, 41);
pManager->getPathManager()->setAdjacentNode(41, 40);
pManager->getPathManager()->setAdjacentNode(41, 42);
pManager->getPathManager()->setAdjacentNode(42, 41);
pManager->getPathManager()->setAdjacentNode(43, 0);
pManager->getPathManager()->setAdjacentNode(43, 44);
pManager->getPathManager()->setAdjacentNode(44, 43);
pManager->getPathManager()->setAdjacentNode(44, 45);
pManager->getPathManager()->setAdjacentNode(45, 44);
}
//! Display enemies remaining before Boss
void CGameStateLevel02::displayEnemiesRemaining(CGameManager* pManager)
{
pManager->getDriver()->draw2DImage(mEnemiesRemainingIcon, irr::core::position2d< irr::s32 >(20,570),
irr::core::rect< irr::s32 >(0, 0, mEnemiesRemainingIcon->getSize().Height, mEnemiesRemainingIcon->getSize().Width), 0,
irr::video::SColor(255, 255, 255, 255), true);
// Enemies remaining before boss
core::stringw str = "";
// There are Enemies to kill!
if(mEnemiesRemaining >= 0)
str += mEnemiesRemaining;
// BOSS TIME!!!
else if(pManager->getEnemyManager()->isBossKilled())
str += "Congratulations!!";
else
str += "It's Show Time!";
mEnemiesRemainingText->setText(str.c_str());
}
//! Display boss remaining life
void CGameStateLevel02::displayBossLife(CGameManager* pManager)
{
pManager->getDriver()->draw2DImage(mBossIcon, irr::core::position2d< irr::s32 >(20,500),
irr::core::rect< irr::s32 >(0, 0, mEnemiesRemainingIcon->getSize().Height, mEnemiesRemainingIcon->getSize().Width), 0,
irr::video::SColor(255, 255, 255, 255), true);
// Current boss health
core::stringw str = "";
str += pManager->getEnemyManager()->getBossEntity()->getHealth();
mBossLifeText->setText(str.c_str());
}
//! Returns true if it is the correct time to pass to the next level then you killed the boss
bool CGameStateLevel02::levelFinished(CGameManager* pManager)
{
// We increase the counter only if the boss is dead
if(pManager->getEnemyManager()->isBossKilled())
mLevelFinishedCounter++;
if(mLevelFinishedCounter > 500)
return true;
else
return false;
}