예제 #1
0
void EnemySpawner:: SpawnBoss()
{
	Enemy* lEnemy;
	lEnemy = dynamic_cast<Enemy*>(_Game->Spawn(new Enemy(), _Game->_Settings->EnemyBossTexture, true, nullptr));
	lEnemy->SetHealth(_Game->_Settings->EnemyBossHealth);
	lEnemy->SetSpeed(_Game->_Settings->EnemyBossSpeed);
	lEnemy->Activate();
	lEnemy->SetText("");
}
예제 #2
0
void EnemySpawner:: SpawnEnemy()
{
	Enemy* lEnemy;

	if (Wave == 1)
	{
		lEnemy = dynamic_cast<Enemy*>(_Game->Spawn(new Enemy(), _Game->_Settings->Enemy1Texture, true, nullptr));
		lEnemy->SetHealth(_Game->_Settings->Enemy1Health);
		lEnemy->SetSpeed(_Game->_Settings->Enemy1Speed);
		lEnemy->SetSound(_Game->_Settings->EnemyDeathSound);
	}

	if (Wave >= 2)
	{
		lEnemy = dynamic_cast<Enemy*>(_Game->Spawn(new Enemy(), _Game->_Settings->Enemy2Texture, true, nullptr));
		lEnemy->SetHealth(_Game->_Settings->Enemy2Health);
		lEnemy->SetSpeed(_Game->_Settings->Enemy2Speed);
		lEnemy->SetSound(_Game->_Settings->EnemyDeathSound);
	}

	lEnemy->Activate();
}
예제 #3
0
void Stage_Stage3::Init()
{
	stageOverTimer = 0;
	boatTimer = 0;
	stageClearTimer = 0;
	bulletCount = 0;
	GameStateManager::GetSingleton().Init();
	Entity *newEntity;

#pragma region Texture
	TextureManager& tm = TextureManager::GetSingleton();
	tm.Add(T_BACKGROUND_1);
	tm.Add(T_BACKGROUND_2);
	tm.Add(T_BACKGROUND_3);
	tm.Add(T_BACKGROUND_4);
	tm.Add(T_BACKGROUND_5);
	tm.Add(T_ENEMY_1);
	tm.Add(T_ENEMY_2);
	tm.Add(T_ENEMY_3);
	tm.Add(T_ENEMY_BOAT);
	tm.Add(T_ENEMY_BOSS);
	tm.Add(T_EXPLOSION);
	tm.Add(T_EXPLOSION_BIG);
	tm.Add(T_PLAYER);
	tm.Add(T_PLAYER_BOAT);
	tm.Add(T_PLAYER_ADDON);
	tm.Add(T_BULLET);
	tm.Add(T_BOAT_BULLET);
	tm.Add(T_BULLET_2);
	tm.Add(T_BULLET2_EXPLOSION);
	tm.Add(T_BULLET_SHELL);
	tm.Add(T_BULLET_EXPLOSION);
	tm.Add(T_UI_BACKGROUND_1);
	tm.Add(T_UI_BACKGROUND_2);
	tm.Add(T_UI_BAR_HEALTH);
	tm.Add(T_UI_BAR_EXP);
	tm.Add(T_UI_SHOP_POWER);
	tm.Add(T_UI_SHOP_MORESPEED);
	tm.Add(T_UI_SHOP_SPEED);
	tm.Add(T_UI_SHOP_ADDON);
	tm.Add(T_UI_SHOP_WEAPON);
	tm.Add(T_UI_BAR_BOSS);
	tm.Add(T_UI_GAMEOVER);
	tm.Add(T_UI_BAR_BOSS_BG);
	tm.Add(T_UI_BAR_BOSS_BG_BLACK);
	tm.Add(T_UI_CLEAR);
	tm.Add(T_DOKDO);
	tm.Add(T_HP);
	tm.Init();
#pragma endregion Texture
#pragma region Background
	newEntity = new Entity(T_BACKGROUND_1, 800, 600);
	newEntity->SetPos(0, 0);
	entities.push_back(newEntity);

	newEntity = new Entity(T_DOKDO, 454, 209);
	newEntity->SetPos(200, 300);
	newEntity->Params["Name"] = "Dokdo";
	newEntity->SetSpeed(-30, 0, 0, 0);
	entities.push_back(newEntity);

	newEntity = new Entity(T_BACKGROUND_2, 1600, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["Type"] = "ScrollingBackground";
	newEntity->SetSpeed(-150, 0, 0, 0);
	entities.push_back(newEntity);

	newEntity = new Entity(T_BACKGROUND_3, 1600, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["Type"] = "ScrollingBackground";
	newEntity->SetSpeed(-200, 0, 0, 0);
	entities.push_back(newEntity);

	newEntity = new Entity(T_BACKGROUND_4, 1600, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["Type"] = "ScrollingBackground";
	newEntity->SetSpeed(-250, 0, 0, 0);
	entities.push_back(newEntity);

	newEntity = new Entity(T_BACKGROUND_5, 1600, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["Type"] = "ScrollingBackground";
	newEntity->SetSpeed(-300, 0, 0, 0);
	entities.push_back(newEntity);
#pragma endregion Background
#pragma region Player
	AddNewPlayer();
	AddNewPlayerBoat();

	Animation *newAddon = new Animation(T_PLAYER_ADDON, 150, 17, 1, 6);
	newAddon->Params["Type"] = "PlayerAddon";
	newAddon->Params["Name"] = "AddonUpper";
	newAddon->Play(30.0f, true);
	entities.push_back(newAddon);

	newAddon = new Animation(T_PLAYER_ADDON, 150, 17, 1, 6);
	newAddon->Params["Type"] = "PlayerAddon";
	newAddon->Params["Name"] = "AddonLower";
	newAddon->Play(30.0f, true);
	entities.push_back(newAddon);
#pragma endregion Player
#pragma region Enemy
	NpcManager& npcManager = NpcManager::GetSingleton();
	npcManager.RespawnTime = 2.5;
	npcManager.Init(&entities);
	Enemy *newEnemy = new Enemy(T_ENEMY_1, 503, 115, 2, 6);
	newEnemy->SetSpeed(-100, 0, 0, 0);
	newEnemy->Params["Name"] = "EnemyPlane";
	newEnemy->Params["EnemyType"] = "1";
	newEnemy->Params["Collide"] = "Player";
	SetRect(&newEnemy->HitMod, 0, -20, 0, 20);
	npcManager.Add(newEnemy);

	newEnemy = new Enemy(T_ENEMY_2, 503, 115, 2, 6);
	newEnemy->SetSpeed(-100, 0, 0, 0);
	newEnemy->Params["Name"] = "EnemyPlane";
	newEnemy->Params["EnemyType"] = "2";
	newEnemy->Params["Collide"] = "Player";
	SetRect(&newEnemy->HitMod, 0, -20, 0, 20);
	npcManager.Add(newEnemy);
#pragma endregion Enemy
#pragma region Animation
	AnimationAdder &animAddr = AnimationAdder::GetSingleton();
	animAddr.Init(&entities);

	Animation *newAnimation = new Animation(T_BULLET, 80, 20, 1, 4);
	newAnimation->Params["Type"] = "Player";
	newAnimation->Params["Name"] = "PlayerBullet";
	newAnimation->Play(20.0f, false);
	newAnimation->SetSpeed(280, 0, 0, 0);
	newAnimation->Health = 1;
	newAnimation->Power = 25;
	newAnimation->AutoRemove = true;
	animAddr.Add("PlayerBullet", newAnimation);

	newAnimation = new Animation(T_BOAT_BULLET, 13, 42, 1, 1);
	newAnimation->Params["Type"] = "Player";
	newAnimation->Params["Name"] = "PlayerBullet";
	newAnimation->SetSpeed(0, -300, 0, -20);
	newAnimation->Health = 1;
	newAnimation->Power = 50;
	newAnimation->AutoRemove = true;
	animAddr.Add("PlayerBoatBullet", newAnimation);

	newAnimation = new Animation(T_BULLET, 80, 20, 1, 4);
	newAnimation->Params["Type"] = "Player";
	newAnimation->Params["Name"] = "PlayerAddonBullet";
	newAnimation->Play(20.0f, false);
	newAnimation->SetSpeed(280, 0, 0, 0);
	newAnimation->Health = 1;
	newAnimation->Power = 10;
	newAnimation->AutoRemove = true;
	animAddr.Add("PlayerAddonBullet", newAnimation);

	newAnimation = new Animation(T_BULLET_2, 100, 20, 1, 5);
	newAnimation->Params["Type"] = "Player";
	newAnimation->Params["Name"] = "PlayerBullet2";
	newAnimation->Play(20.0f, false);
	newAnimation->SetSpeed(300, 0, 0, 0);
	newAnimation->Health = 1;
	newAnimation->Power = 50;
	newAnimation->AutoRemove = true;
	animAddr.Add("PlayerBullet2", newAnimation);

	newAnimation = new Animation(T_BULLET, 80, 20, 1, 4);
	newAnimation->Params["Collide"] = "Player";
	newAnimation->Params["Name"] = "EnemyBullet";
	newAnimation->Play(20.0f, false);
	newAnimation->Health = 15;
	newAnimation->Power = 25;
	newAnimation->AutoRemove = true;
	animAddr.Add("EnemyBullet", newAnimation);

	newAnimation = new Animation(T_BULLET_EXPLOSION, 90, 30, 1, 3);
	newAnimation->Play(20.0f, false);
	newAnimation->Params["DeleteWhenEnds"] = "True";
	animAddr.Add("BulletCrash", newAnimation);

	newAnimation = new Animation(T_BULLET2_EXPLOSION, 90, 30, 1, 3);
	newAnimation->Play(20.0f, false);
	newAnimation->Params["DeleteWhenEnds"] = "True";
	animAddr.Add("BulletCrash2", newAnimation);


	newAnimation = new Animation(T_EXPLOSION_BIG, 1500, 150, 1, 5);
	newAnimation->Play(10.0f, false);
	newAnimation->Params["DeleteWhenEnds"] = "True";
	animAddr.Add("Explosion_Big", newAnimation);

	newAnimation = new Animation(T_EXPLOSION, 1200, 200, 1, 6);
	newAnimation->Play(20.0f, false);
	newAnimation->Params["DeleteWhenEnds"] = "True";
	animAddr.Add("Explosion", newAnimation);

#pragma endregion Animation
#pragma region Particle
	ParticleAdder& particleAdder = ParticleAdder::GetSingleton();
	particleAdder.Init(&entities);
	Particle *newParticle = new Particle(T_BULLET_SHELL, 15, 5);
	particleAdder.Add("BulletShell", newParticle);
#pragma endregion Particle
#pragma region UI
	newEntity = new Entity(T_UI_BACKGROUND_1, 800, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_BAR_HEALTH, 160, 19);
	newEntity->SetPos(30, 530);
	newEntity->Params["Name"] = "Bar_Health";
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_BAR_EXP, 160, 19);
	newEntity->SetPos(30, 556);
	newEntity->Params["Name"] = "Bar_Exp";
	newEntity->Params["DrawLater"] = "True";
	newEntity->Width = 0;
	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_BAR_BOSS_BG_BLACK, 800, 600);
	newEntity->SetPos(800, 0);
	newEntity->Params["Name"] = "Bar_Boss_BG";
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_BAR_BOSS, 709, 21);
	newEntity->SetPos(845, 80);
	newEntity->Params["Name"] = "Bar_Boss";
	newEntity->Params["DrawLater"] = "True";

	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_BAR_BOSS_BG, 800, 600);
	newEntity->SetPos(800, 0);
	newEntity->Params["Name"] = "Bar_Boss_BG";
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newAnimation = new Animation(T_UI_SHOP_POWER, 600, 50, 1, 6);
	newAnimation->SetPos(335, 528);
	newAnimation->Params["Type"] = "ShopItem";
	newAnimation->Params["Name"] = "Shop_Power";
	newAnimation->Params["DrawLater"] = "True";
	entities.push_back(newAnimation);

	newAnimation = new Animation(T_UI_SHOP_SPEED, 600, 50, 1, 6);
	newAnimation->SetPos(430, 528);
	newAnimation->Params["Type"] = "ShopItem";
	newAnimation->Params["Name"] = "Shop_Speed";
	newAnimation->Params["DrawLater"] = "True";
	entities.push_back(newAnimation);

	newAnimation = new Animation(T_UI_SHOP_MORESPEED, 600, 50, 1, 6);
	newAnimation->SetPos(516, 528);
	newAnimation->Params["Type"] = "ShopItem";
	newAnimation->Params["Name"] = "Shop_MoreSpeed";
	newAnimation->Params["DrawLater"] = "True";
	entities.push_back(newAnimation);

	newAnimation = new Animation(T_UI_SHOP_ADDON, 600, 50, 1, 6);
	newAnimation->SetPos(602, 528);
	newAnimation->Params["Type"] = "ShopItem";
	newAnimation->Params["Name"] = "Shop_Addon";
	newAnimation->Params["DrawLater"] = "True";
	entities.push_back(newAnimation);

	newAnimation = new Animation(T_UI_SHOP_WEAPON, 600, 50, 1, 6);
	newAnimation->SetPos(694, 528);
	newAnimation->Params["Type"] = "ShopItem";
	newAnimation->Params["Name"] = "Shop_Weapon";
	newAnimation->Params["DrawLater"] = "True";
	entities.push_back(newAnimation);

	newEntity = new Entity(T_UI_BACKGROUND_2, 800, 600);
	newEntity->SetPos(0, 0);
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	Font *newFont = new Font(L"Candara", 190, 40, 40, 15, FW_BOLD, false);
	newFont->SetPos(90, -3);
	newFont->Params["DrawLater"] = "True";
	newFont->Params["Name"] = "Text_Score";
	newFont->SetColor(D3DCOLOR_ARGB(255, 255, 0, 0));
	entities.push_back(newFont);

	newFont = new Font(L"Candara", 35, 40, 40, 15, FW_BOLD, false);
	newFont->SetPos(260, 540);
	newFont->Params["DrawLater"] = "True";
	newFont->Params["Name"] = "Text_Level";
	newFont->SetColor(D3DCOLOR_ARGB(255, 255, 255, 0));
	entities.push_back(newFont);

	newEntity = new Entity(T_HP, 42, 33);
	newEntity->SetPos(10, 470);
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newFont = new Font(L"Candara", 40, 40, 40, 15, FW_BOLD, false);
	newFont->SetPos(60, 465);
	newFont->Params["DrawLater"] = "True";
	newFont->Params["Text"] = "x";
	newFont->SetColor(D3DCOLOR_ARGB(255, 255, 0, 0));
	entities.push_back(newFont);

	newFont = new Font(L"Candara", 40, 40, 40, 15, FW_BOLD, false);
	newFont->SetPos(80, 465);
	newFont->Params["DrawLater"] = "True";
	newFont->Params["Name"] = "Text_Life";
	newFont->SetColor(D3DCOLOR_ARGB(255, 255, 0, 0));
	entities.push_back(newFont);

	newEntity = new Entity(T_UI_CLEAR, 800, 600);
	newEntity->SetPos(800, 0);
	newEntity->Params["Name"] = "Text_Clear";
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);

	newEntity = new Entity(T_UI_GAMEOVER, 800, 600);
	newEntity->SetPos(800, 0);
	newEntity->Params["Name"] = "Text_Over";
	newEntity->Params["DrawLater"] = "True";
	entities.push_back(newEntity);
#pragma endregion UI
}
예제 #4
0
void Stage_Stage3::Update(float deltaTime)
{
	SoundManager::GetSingleton().PlayLoop("BGM3");
	NpcManager& npcManager = NpcManager::GetSingleton();
	GameStateManager& gameState = GameStateManager::GetSingleton();
	KeyboardManager& keyboard = KeyboardManager::GetSingleton();


	if ( gameState.State["Level"] == 3 || gameState.State["Level"] == 6 || gameState.State["Level"] == 12 || gameState.State["Level"] == 15 )
	{
		gameState.State["AirPanic"] = 1;
	}
	else
	{
		gameState.State["AirPanic"] = 0;
	}
	if ( boatTimer <= 0 && !gameState.State["AirPanic"] && !entities.empty() )
	{
		boatTimer = 450;
		Enemy *newEnemy = new Enemy(T_ENEMY_BOAT, 100, 36, 1, 1);
		newEnemy->SetPos(800, 420);
		newEnemy->SetSpeed(-100, 0, 0, 0);
		newEnemy->Health = 100;
		newEnemy->Params["Name"] = "EnemyPlane";
		newEnemy->Params["EnemyType"] = "1";
		newEnemy->Params["Collide"] = "Player";
		newEnemy->AutoRemove = true;
		entities.push_back(newEnemy);
	}
	else
	{
		boatTimer -= deltaTime;
	}


	if ( keyboard.IsKeyPressedN(VK_SPACE) )
	{
		gameState.State["PlayerMode"] = !gameState.State["PlayerMode"];
	}

	if ( keyboard.IsKeyPressedN(VK_ESCAPE) )
	{
		StageManager::GetSingleton().NextStage = "Menu";
	}
#pragma region Debug Keys
	else if ( keyboard.IsKeyPressedN(VK_F1) )
	{
		gameState.State["Exp"] = gameState.State["NextExp"];
	}
	else if ( keyboard.IsKeyPressedN(VK_F2) )
	{
		gameState.State["Score"]+=100000;
	}
#pragma endregion Debug Keys
#pragma region Shop System
	if ( keyboard.IsKeyPressedN('1') && gameState.State["Score"] >= gameState.State["Shop_Power"] && gameState.State["Power"] != 1)
	{
		gameState.State["Score"] -= gameState.State["Shop_Power"];
		gameState.State["Power"]++;
	}
	else if ( keyboard.IsKeyPressedN('2') && gameState.State["Score"] >= gameState.State["Shop_Speed"] )
	{
		gameState.State["Score"] -= gameState.State["Shop_Speed"];
		gameState.State["Speed"]++;
	}
	else if ( keyboard.IsKeyPressedN('3') && gameState.State["Score"] >= gameState.State["Shop_MoreSpeed"] )
	{
		gameState.State["Score"] -= gameState.State["Shop_MoreSpeed"];
		gameState.State["Speed"] += 5;
	}
	else if ( keyboard.IsKeyPressedN('4') && gameState.State["Score"] >= gameState.State["Shop_Addon"] && gameState.State["Addon"] != 2 )
	{
		gameState.State["Score"] -= gameState.State["Shop_Addon"];
		gameState.State["Addon"]++;
	}
	else if ( keyboard.IsKeyPressedN('5') && gameState.State["Score"] >= gameState.State["Shop_Weapon"] && gameState.State["Weapon"] != 1 )
	{
		gameState.State["Score"] -= gameState.State["Shop_Weapon"];
		gameState.State["Power"] = 0;
		gameState.State["Weapon"]++;
	}
#pragma endregion Shop System
#pragma region Solid State Squad
	if ( gameState.State["Clear"] == 1 )
	{
		stageClearTimer += deltaTime;
		NpcManager::GetSingleton().RespawnTime = 99999;
		if ( stageClearTimer > 5 )
			StageManager::GetSingleton().NextStage = "Ending";
	}
	if ( gameState.State["GameOver"] == 1 )
	{
		stageOverTimer += deltaTime;
		NpcManager::GetSingleton().RespawnTime = 99999;
		if ( stageOverTimer > 5 )
			keyboard.Update(VK_ESCAPE, true);
	}
	if ( gameState.State["1up"] == 1 )
	{
		Enemy *newEnemy;
		newEnemy = new Enemy(T_ENEMY_3, 503, 115, 2, 6);
		newEnemy->SetSpeed(-100, 0, 0, 0);
		newEnemy->SetPos(800.0f, Helper::Random(0, 45) * 10.0f);
		newEnemy->Health = 200;
		newEnemy->Params["Name"] = "EnemyPlane";
		newEnemy->Params["EnemyType"] = "3";
		newEnemy->Params["Collide"] = "Player";
		SetRect(&newEnemy->HitMod, 0, -20, 0, 20);
		entities.push_back(newEnemy);
		gameState.State["1up"] = 0;
	}
	if ( gameState.State["Level"] == 16 && gameState.State["Boss"] != 1 )
	{
		EnemyBoss *bossTest = new EnemyBoss(T_ENEMY_BOSS, 436, 166, 1, 1);
		bossTest->SetPos(800, 150);
		bossTest->Params["Name"] = "Boss";
		bossTest->Params["BossType"] = "1";
		bossTest->Params["Collide"] = "Player";
		bossTest->Health = 3000;
		bossTest->Power = 10000;
		SetRect(&bossTest->HitMod, -20, 0, 0, 0);
		entities.push_back(bossTest);
		npcManager.RespawnTime = 5;
		gameState.State["Boss"] = 1;
	}
#pragma endregion LED

	npcManager.RespawnTimeMod = gameState.State["Level"] * 0.12f;
	if ( gameState.State["AirPanic"] )
	{
		npcManager.RespawnTime = 0.3;
		npcManager.RespawnTimeMod = 0;
	}
	else
	{
		npcManager.RespawnTime = 2.5;
	}
	npcManager.Update(deltaTime);
	gameState.Update(deltaTime);
	Stage::Update(deltaTime);
}
/**
* Update cycle
*
* Checks for keypresses:
*   - Esc - Quits the game
*   - Left - Rotates ship left
*   - Right - Rotates ship right
*   - Up - Accelerates the ship
*   - Down - Deccelerates the ship
*
* Also calls Update() on all the ships in the universe
*/
bool Application::Update()
{
	float timedelta = hge_->Timer_GetDelta();
	if (bulletShootTimer < S_BULLET_SHOOT_INTERVAL)
	{
		bulletShootTimer += timedelta;
	}
	if (missileShootTimer < S_MISSILE_SHOOT_INTERVAL)
	{
		missileShootTimer += timedelta;
	}

	ships_.at(0)->SetAngularVelocity(0.0f);

	// Lab 13 Task 4 : Add a key to shoot missiles
	/*if (hge_->Input_GetKeyState(HGEK_ENTER))
	{
		if (!keydown_enter)
		{
			CreateMissile(ships_.at(0)->GetX(), ships_.at(0)->GetY(), ships_.at(0)->GetW(), ships_.at(0)->GetID());
			keydown_enter = true;
		}
	}
	else
	{
		if (keydown_enter)
		{
			keydown_enter = false;
		}
	}*/

	static const float MAX_ENTER_TIMER = 0.5f;
	static float enterTimer;

	if (enterTimer < MAX_ENTER_TIMER)
	{
		enterTimer += timedelta;
	}

	// Chat
	if (chatMode)
	{
		char input = hge_->Input_GetKey();

		if (input == HGEK_ESCAPE)
		{
			chatMode = false;
			typingMsg = "";
		}
		else if (input == HGEK_ENTER && enterTimer >= MAX_ENTER_TIMER)
		{
			// Send
			if (typingMsg != "")
			{
				RakNet::BitStream chatBS;
				chatBS.Write((unsigned char)ID_CHAT_SEND);
				chatBS.Write(typingMsg.c_str());
				rakpeer_->Send(&chatBS, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
				chatList.push_back(typingMsg);
			}

			// Reset
			chatMode = false;
			typingMsg = "";
			enterTimer = 0.f;
			chatShowTimer = 5.f;
		}
		else if (input >= 32 && input <= 126)
		{
			typingMsg += input;
		}
	}
	else
	{
		if (chatShowTimer > 0.f)
		{
			chatShowTimer -= timedelta;
		}

		if (hge_->Input_GetKeyState(HGEK_ENTER) && enterTimer >= MAX_ENTER_TIMER)
		{
			chatMode = true;
			enterTimer = 0.f;
		}

		// Ship controls
		if (hge_->Input_GetKeyState(HGEK_LEFT))
		{
			ships_.at(0)->SetAngularVelocity(ships_.at(0)->GetAngularVelocity() - DEFAULT_ANGULAR_VELOCITY);
		}

		if (hge_->Input_GetKeyState(HGEK_RIGHT))
		{
			ships_.at(0)->SetAngularVelocity(ships_.at(0)->GetAngularVelocity() + DEFAULT_ANGULAR_VELOCITY);
		}

		if (hge_->Input_GetKeyState(HGEK_UP))
		{
			ships_.at(0)->Accelerate(DEFAULT_ACCELERATION, timedelta);
		}

		if (hge_->Input_GetKeyState(HGEK_DOWN))
		{
			ships_.at(0)->Accelerate(-DEFAULT_ACCELERATION, timedelta);
		}

		// Shooting
		if (hge_->Input_GetKeyState(HGEK_1))
		{
			if (missileShootTimer >= S_MISSILE_SHOOT_INTERVAL)
			{
				Shoot(Projectile::PROJ_SEEKING_MISSLE);
			}
		}
		if (hge_->Input_GetKeyState(HGEK_2))
		{
			if (bulletShootTimer >= S_BULLET_SHOOT_INTERVAL)
			{
				Shoot(Projectile::PROJ_BULLET);
			}
		}

		if (hge_->Input_GetKeyState(HGEK_ESCAPE))
		{
			return true;
		}
	}

	// Update all ships
	for (ShipList::iterator ship = ships_.begin();
	ship != ships_.end(); ship++)
	{
		(*ship)->Update(timedelta);

		//collisions
		/*if ((*ship) == ships_.at(0))
			checkCollisions((*ship));*/
	}

	// Lab 13 Task 5 : Updating the missile
	/*if (mymissile)
	{
		if (mymissile->Update(ships_, timedelta))
		{
			//havecollision
			delete mymissile;
			mymissile = 0;
		}
	}*/

	// Lab 13 Task 13 : Update network missiles
	/*for (MissileList::iterator missile = missiles_.begin(); missile != missiles_.end(); missile++)
	{
		if ((*missile)->Update(ships_, timedelta))
		{
			//havecollision
			delete*missile;
			missiles_.erase(missile);
			break;
		}
	}*/

	// Update enemies
	/*for (vector<Enemy*>::iterator it = enemyList.begin(); it != enemyList.end(); ++it)
	{
		Enemy* e = *it;
		if (e->GetActive())
		{
			bool reset = e->Update(timedelta);
			if (reset)
			{
				RakNet::BitStream bs;
				bs.Write((unsigned char)ID_DESTROY_ENEMY);
				bs.Write(e->GetID());
				rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
			}
		}
	}*/

	// Update projectile
	for (vector<Projectile*>::iterator it = projectileList.begin(); it != projectileList.end(); ++it)
	{
		Projectile* p = *it;
		if (/*p->GetOwner() == ships_.at(0) && */p->GetActive()) // Only update your own projectile
		{
			bool reset = p->Update(timedelta);
			RakNet::BitStream bs;
			if (reset)
			{
				DestroyProjectile(p);
				bs.Write((unsigned char)ID_DESTROY_PROJECTILE);
				bs.Write(p->GetID());
				rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
			}
			else
			{
				for (vector<Enemy*>::iterator it2 = enemyList.begin(); it2 != enemyList.end(); ++it2)
				{
					Enemy* e = *it2;
					if (e->GetActive())
					{
						bool collision = p->CollideWith(e);
						if (collision)
						{
							int newHP = e->Injure(p->GetDamage());
							if (newHP <= 0)
							{
								RakNet::BitStream bs;
								// Add score to player
								p->GetOwner()->AddScore(100);

								bs.Write((unsigned char)ID_UPDATE_SCORE);
								bs.Write(p->GetOwner()->GetID());
								bs.Write(p->GetOwner()->GetScore());
								rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);

								// Destroy enemy
								DestroyEnemy(e);

								// Send to server to destroy enemy
								bs.ResetWritePointer();
								bs.Write((unsigned char)ID_DESTROY_ENEMY);
								bs.Write(e->GetID());
								rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
							}
							else
							{
								// Send to server to injure enemy
								RakNet::BitStream bs;
								bs.ResetWritePointer();
								bs.Write((unsigned char)ID_INJURE_ENEMY);
								bs.Write(e->GetID());
								bs.Write(e->GetHP());
								rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
							}

							// Reset projectile
							DestroyProjectile(p);
							bs.ResetWritePointer();
							bs.Write((unsigned char)ID_DESTROY_PROJECTILE);
							bs.Write(p->GetID());
							rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
						}
					}
				}
				/*int max = projectileUpdateList.size();
				int count = 0;
				for (vector<Projectile*>::iterator it2 = projectileUpdateList.begin(); it2 != projectileUpdateList.end(); ++it2)
				{
					Projectile* p2 = *it2;
					if (p == p2)
					{
						break;
					}
					else
					{
						++count;
					}
				}
				if (count == max)
				{
					projectileUpdateList.push_back(p);
				}*/
				/*bs.Write((unsigned char)ID_UPDATE_PROJECTILE);
				bs.Write(p->GetID());
				bs.Write(p->GetActive());
				bs.Write(p->GetType());
				bs.Write(p->GetX());
				bs.Write(p->GetY());
				bs.Write(p->GetVelocityX());
				bs.Write(p->GetVelocityY());
				bs.Write(p->GetSpeed());
				bs.Write(p->GetDamage());
				bs.Write(p->GetOwner()->GetID());
				// Send target id if available
				if (p->GetTarget())
				{
					bs.Write(p->GetTarget()->GetID());
				}
				else
				{
					bs.Write(-1);
				}
				rakpeer_->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);*/
			}
		}
	}

	// Update explosions
	for (vector<Explosion*>::iterator it = explosionList.begin(); it != explosionList.end(); ++it)
	{
		Explosion* e = *it;
		if ( e->isActive())
		{
			e->Update(timedelta);
		}
	}

	// Update boom
	for (vector<Boom*>::iterator it = boomList.begin(); it != boomList.end(); ++it)
	{
		Boom* b = *it;
		if (b->isActive())
		{
			b->Update(timedelta);
		}
	}

	// Packet receive
	if (Packet* packet = rakpeer_->Receive())
	{
		RakNet::BitStream bs(packet->data, packet->length, false);
		
		unsigned char msgid = 0;
		RakNetTime timestamp = 0;

		bs.Read(msgid);

		if (msgid == ID_TIMESTAMP)
		{
			bs.Read(timestamp);
			bs.Read(msgid);
		}

		switch(msgid)
		{
		case ID_CONNECTION_REQUEST_ACCEPTED:
			{
				std::cout << "Connected to Server" << std::endl;
				SendScreenSize();
				InitEnemyList();
				InitExplosionList();
				InitBoomList();
				InitProjectileList();
				InitBackground();
				InitBase();
				InitScore();
				chatMsg = new hgeFont("font1.fnt");
				chatMsg->SetScale(1);
				
			}
			break;

		case ID_NO_FREE_INCOMING_CONNECTIONS:
		case ID_CONNECTION_LOST:
		case ID_DISCONNECTION_NOTIFICATION:
			std::cout << "Lost Connection to Server" << std::endl;
			rakpeer_->DeallocatePacket(packet);
			return true;

		case ID_WELCOME:
			{
				unsigned int shipcount, id;
				float x_, y_;
				int type_;
				std::string temp;
				char chartemp[5];

				bs.Read(id);
				ships_.at(0)->setID( id );
				bs.Read(shipcount);

				for (unsigned int i = 0; i < shipcount; ++ i)
				{
					bs.Read(id);
					bs.Read(x_);
					bs.Read(y_);
					bs.Read(type_);
					std::cout << "New Ship pos" << x_ << " " << y_ << std::endl;
					Ship* ship = new Ship(type_, x_, y_ ); 
					temp = "Ship ";
					temp += _itoa(id, chartemp, 10);
					ship->SetName(temp.c_str());
					ship->setID( id );
					ships_.push_back(ship);
				}

				for (vector<Enemy*>::iterator it = enemyList.begin(); it != enemyList.end(); ++it)
				{
					int id, hp;
					bool active;
					Enemy::ENEMY_TYPE type;
					float x, y, vel_x, vel_y, speed;
					bs.Read(id);
					bs.Read(active);
					bs.Read(type);
					bs.Read(x);
					bs.Read(y);
					bs.Read(vel_x);
					bs.Read(vel_y);
					bs.Read(speed);
					bs.Read(hp);
					Enemy* e = FindEnemyByID(id);
					if (e)
					{
						float w = CalcW(Vector2(vel_x, vel_y));
						/*if (speed != 0)
						{
							w = acosf(vel_x / speed);
						}
						else
						{
							w = 0.f;
						}*/
						e->Init(type, x, y, w, active);
						e->SetVelocityX(vel_x);
						e->SetVelocityY(vel_y);
						e->SetSpeed(speed);
						e->SetHP(hp);
					}
				}
				
				// Base hp
				bs.Read(base_hp);

				SendInitialPosition();
			}
			break;
		case ID_REJECT_PLAYER:
			{
				std::cout << "Rejected player" << std::endl;
				return true;
			}
			break;

		case ID_NEWSHIP:
			{
				unsigned int id;
				bs.Read(id);

				if( id == ships_.at(0)->GetID() )
				{
					// if it is me
					break;
				}
				else
				{
					float x_, y_;
					int type_;
					std::string temp;
					char chartemp[5];

					bs.Read( x_ );
					bs.Read( y_ );
					bs.Read( type_ );
					std::cout << "New Ship pos" << x_ << " " << y_ << std::endl;
					Ship* ship = new Ship(type_, x_, y_);
					temp = "Ship "; 
					temp += _itoa(id, chartemp, 10);
					ship->SetName(temp.c_str());
					ship->setID( id );
					ships_.push_back(ship);
				}

			}
			break;

		case ID_LOSTSHIP:
			{
				unsigned int shipid;
				bs.Read(shipid);
				for (ShipList::iterator itr = ships_.begin(); itr != ships_.end(); ++itr)
				{
					if ((*itr)->GetID() == shipid)
					{
						delete *itr;
						ships_.erase(itr);
						break;
					}
				}
			}
			break;

		case ID_INITIALPOS:
			break;

		case ID_MOVEMENT:
			{
				unsigned int shipid;
				float temp;
				float x,y,w;
				bs.Read(shipid);
				for (ShipList::iterator itr = ships_.begin(); itr != ships_.end(); ++itr)
				{
					if ((*itr)->GetID() == shipid)
					{
						// this portion needs to be changed for it to work
#ifdef INTERPOLATEMOVEMENT
						bs.Read(x);
						bs.Read(y);
						bs.Read(w);

						(*itr)->SetServerLocation( x, y, w ); 

						bs.Read(temp);
						(*itr)->SetServerVelocityX( temp );
						bs.Read(temp);
						(*itr)->SetServerVelocityY( temp );
						bs.Read(temp);
						(*itr)->SetAngularVelocity( temp );

						(*itr)->DoInterpolateUpdate();
#else
						bs.Read(x);
						bs.Read(y);
						bs.Read(w);
						(*itr)->setLocation( x, y, w ); 

						// Lab 7 Task 1 : Read Extrapolation Data velocity x, velocity y & angular velocity
						bs.Read(temp);
						(*itr)->SetVelocityX( temp );
						bs.Read(temp);
						(*itr)->SetVelocityY( temp );
						bs.Read(temp);
						(*itr)->SetAngularVelocity( temp );
#endif

						break;
					}
				}
			}
			break;

		case ID_COLLIDE:
			{
				unsigned int shipid;
				float x, y;
				bs.Read(shipid);
				
				if( shipid == ships_.at(0)->GetID() )
				{
					std::cout << "collided with someone!" << std::endl;
					bs.Read(x);
					bs.Read(y);
					ships_.at(0)->SetX( x );
					ships_.at(0)->SetY( y );
					bs.Read(x);
					bs.Read(y);
					ships_.at(0)->SetVelocityX( x );
					ships_.at(0)->SetVelocityY( y );
#ifdef INTERPOLATEMOVEMENT
					bs.Read(x);
					bs.Read(y);
					ships_.at(0)->SetServerVelocityX( x );
					ships_.at(0)->SetServerVelocityY( y );
#endif	
				}
			}
			break;


		// Lab 13 Task 10 : new cases to handle missile on application side
		case ID_NEWMISSILE:
			{
				float x, y, w;
				int id;
				bs.Read(id);
				bs.Read(x);
				bs.Read(y);
				bs.Read(w);
				missiles_.push_back(new Missile("missile.png", x, y, w, id));
			}
			break;
		case ID_UPDATEMISSILE:
			{
				float x, y, w;
				int id;
				char deleted;
				bs.Read(id);
				bs.Read(deleted);
				for (MissileList::iterator itr = missiles_.begin(); itr !=
					missiles_.end(); ++itr)
				{
					if ((*itr)->GetOwnerID() == id)
					{
						if (deleted == 1)
						{
							delete*itr;
							missiles_.erase(itr);
						}
						else
						{
							bs.Read(x);
							bs.Read(y);
							bs.Read(w);
							(*itr)->UpdateLoc(x, y, w);
							bs.Read(x);
							(*itr)->SetVelocityX(x);
							bs.Read(y);
							(*itr)->SetVelocityY(y);
						}
						break;
					}
				}
			}
			break;
		case ID_NEW_ENEMY:
			{
				int id, hp;
				Enemy::ENEMY_TYPE type;
				float x, y, vel_x, vel_y, speed;
				bs.Read(id);
				bs.Read(type);
				bs.Read(x);
				bs.Read(y);
				bs.Read(vel_x);
				bs.Read(vel_y);
				bs.Read(speed);
				bs.Read(hp);
				Enemy* e = FindEnemyByID(id);
				if (e)
				{
					float w = CalcW(Vector2(vel_x, vel_y));
					e->Init(type, x, y, w);
					e->SetVelocityX(vel_x);
					e->SetVelocityY(vel_y);
					e->SetSpeed(speed);
					e->SetHP(hp);
				}
			}
			break;
		case ID_UPDATE_ENEMY:
			{
				int id;
				bs.Read(id);
				Enemy* e = FindEnemyByID(id);
				if (e)
				{
					float x, y;
					bs.Read(x);
					bs.Read(y);
					e->SetX(x);
					e->SetY(y);
				}
			}
			break;
		case ID_INJURE_ENEMY:
			{
				int id, hp;
				bs.Read(id);
				Enemy* e = FindEnemyByID(id);
				if (e && e->GetActive())
				{
					bs.Read(hp);
					e->SetHP(hp);
				}
			}
			break;
		case ID_DESTROY_ENEMY:
			{
				int id;
				bs.Read(id);
				Enemy* e = FindEnemyByID(id);

				DestroyEnemy(e);
			}
			break;
		case ID_SHOOT:
			{
				int id, damage, owner, target;
				Projectile::PROJECTILE_TYPE type;
				float x, y, w, vel_x, vel_y, speed;
				bs.Read(id);

				Projectile* p = FindProjectileByID(id);
				if (p)
				{
					bs.Read(type);
					bs.Read(x);
					bs.Read(y);
					bs.Read(w);
					bs.Read(vel_x);
					bs.Read(vel_y);
					bs.Read(speed);
					bs.Read(damage);
					bs.Read(owner);
					bs.Read(target);
					
					Ship* sOwner = FindShipByID(owner);
					if (sOwner)
					{
						p->Init(sOwner, type, x, y, w);
						p->SetVelocityX(vel_x);
						p->SetVelocityY(vel_y);
						p->SetSpeed(speed);
						p->SetDamage(damage);
						if (target != -1)
						{
							Enemy* sTarget = FindEnemyByID(target);
							if (sTarget)
							{
								p->SetTarget(sTarget);
							}
						}
					}
				}
			}
			break;
		case ID_UPDATE_PROJECTILE:
			{
				int id, damage, owner, target;
				Projectile::PROJECTILE_TYPE type;
				float x, y, vel_x, vel_y, speed;
				bool active;
				bs.Read(id);

				Projectile* p = FindProjectileByID(id);
				if (p)
				{
					bs.Read(active);
					bs.Read(type);
					bs.Read(x);
					bs.Read(y);
					bs.Read(vel_x);
					bs.Read(vel_y);
					bs.Read(speed);
					bs.Read(damage);
					bs.Read(owner);
					bs.Read(target);

					Ship* sOwner = FindShipByID(owner);
					if (sOwner)
					{
						p->SetOwner(sOwner);
						p->SetType(type);
						p->SetX(x);
						p->SetY(y);
						p->SetActive(active);
						p->SetVelocityX(vel_x);
						p->SetVelocityY(vel_y);
						p->SetSpeed(speed);
						p->SetDamage(damage);
						if (target != -1)
						{
							Enemy* sTarget = FindEnemyByID(target);
							if (sTarget)
							{
								p->SetTarget(sTarget);
							}
						}
					}
				}
			}
			break;
		case ID_DESTROY_PROJECTILE:
			{
				int id;
				bs.Read(id);
				Projectile* p = FindProjectileByID(id);
				if (p && p->GetActive())
				{
					// Reset projectile
					//DestroyProjectile(p);
					p->Reset();
				}
			}
			break;
		case ID_UPDATE_BASE:
			{
				bs.Read(base_hp);
			}
			break;
		case ID_UPDATE_SCORE:
			{
				int id, score;
				bs.Read(id);
				Ship* s = FindShipByID(id);
				if (s)
				{
					bs.Read(score);
					s->SetScore(score);
				}
			}
			break;
		case ID_CHAT_SEND:
			{
				char cMsg[256];
				bs.Read(cMsg);
				chatList.push_back(cMsg);
				chatShowTimer = 5.f;
			}
			break;

		default:
			std::cout << "Unhandled Message Identifier: " << (int)msgid << std::endl;

		}
		rakpeer_->DeallocatePacket(packet);
	}

	if (base_hp <= 0)
	{
		return true;
	}

	// Send projectile updates
	/*static const int SYNCS_PER_SEC = 24;
	static const float TIME_PER_SYNC = 1 / SYNCS_PER_SEC;
	static float projSendTimer = TIME_PER_SYNC;
	if (projSendTimer < TIME_PER_SYNC)
	{
		projSendTimer += timedelta;
	}
	else
	{
		for (vector<Projectile*>::iterator it = projectileList.begin(); it != projectileList.end(); ++it)
		{
			Projectile* p = *it;
			if (p->GetActive() && p->GetOwner() == ships_.at(0))
			{
				RakNet::BitStream sendProj;
				sendProj.Write((unsigned char)ID_UPDATE_PROJECTILE);
				sendProj.Write(p->GetID());
				sendProj.Write(p->GetActive());
				sendProj.Write(p->GetType());
				sendProj.Write(p->GetX());
				sendProj.Write(p->GetY());
				sendProj.Write(p->GetVelocityX());
				sendProj.Write(p->GetVelocityY());
				sendProj.Write(p->GetSpeed());
				sendProj.Write(p->GetDamage());
				sendProj.Write(p->GetOwner()->GetID());
				// Send target id if available
				if (p->GetTarget())
				{
					sendProj.Write(p->GetTarget()->GetID());
				}
				else
				{
					sendProj.Write(-1);
				}
				rakpeer_->Send(&sendProj, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
				std::cout << p->GetX() << " | " << p->GetY() << std::endl;
			}
		}
		projSendTimer = 0.f;
	}*/

	// Send data
	float timeToSync = 1000 / 24; // Sync 24 times in a second (Millisecond)
	if (RakNet::GetTime() - timer_ > timeToSync)
	{
		timer_ = RakNet::GetTime(); // Store previous time
		RakNet::BitStream bs2;
		unsigned char msgid = ID_MOVEMENT;
		bs2.Write(msgid);

#ifdef INTERPOLATEMOVEMENT
		bs2.Write(ships_.at(0)->GetID());
		bs2.Write(ships_.at(0)->GetServerX());
		bs2.Write(ships_.at(0)->GetServerY());
		bs2.Write(ships_.at(0)->GetServerW());
		bs2.Write(ships_.at(0)->GetServerVelocityX());
		bs2.Write(ships_.at(0)->GetServerVelocityY());
		bs2.Write(ships_.at(0)->GetAngularVelocity());

#else
		bs2.Write(ships_.at(0)->GetID());
		bs2.Write(ships_.at(0)->GetX());
		bs2.Write(ships_.at(0)->GetY());
		bs2.Write(ships_.at(0)->GetW());
		// Lab 7 Task 1 : Add Extrapolation Data velocity x, velocity y & angular velocity
		bs2.Write(ships_.at(0)->GetVelocityX());
		bs2.Write(ships_.at(0)->GetVelocityY());
		bs2.Write(ships_.at(0)->GetAngularVelocity());
#endif

		rakpeer_->Send(&bs2, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true);


		// Lab 13 Task 11 : send missile update 
		/*if (mymissile)
		{
			RakNet::BitStream bs3;
			unsigned char msgid2 = ID_UPDATEMISSILE;
			unsigned char deleted = 0;
			bs3.Write(msgid2);
			bs3.Write(mymissile->GetOwnerID());
			bs3.Write(deleted);
			bs3.Write(mymissile->GetX());
			bs3.Write(mymissile->GetY());
			bs3.Write(mymissile->GetW());
			bs3.Write(mymissile->GetVelocityX());
			bs3.Write(mymissile->GetVelocityY());
			rakpeer_->Send(&bs3, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
		}*/

		// Send update projectile
		/*for (int i = 0; i < projectileUpdateList.size(); ++i)
		{
			Projectile* p = projectileList[i];
			if (p && p->GetActive())
			{
				RakNet::BitStream sendProj;
				sendProj.Write((unsigned char)ID_UPDATE_PROJECTILE);
				sendProj.Write(p->GetID());
				sendProj.Write(p->GetActive());
				sendProj.Write(p->GetType());
				sendProj.Write(p->GetX());
				sendProj.Write(p->GetY());
				sendProj.Write(p->GetVelocityX());
				sendProj.Write(p->GetVelocityY());
				sendProj.Write(p->GetSpeed());
				sendProj.Write(p->GetDamage());
				sendProj.Write(p->GetOwner()->GetID());
				// Send target id if available
				if (p->GetTarget())
				{
					sendProj.Write(p->GetTarget()->GetID());
				}
				else
				{
					sendProj.Write(-1);
				}
				rakpeer_->Send(&sendProj, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
			}
		}
		projectileUpdateList.clear();*/
	}

	return false;
}