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(""); }
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(); }
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 }
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; }