void Attack(Map *ThisMap, Player *ThisPlayer, short AttackDir) { COORD HitPos; HitPos = ThisPlayer->PlayerPos; Direction(&HitPos, AttackDir); if(ThisMap->MapTile[HitPos.X][HitPos.Y].TileMob) { PlayerHit(ThisMap->MapTile[HitPos.X][HitPos.Y].TileMob, ThisPlayer); if(ThisMap->MapTile[HitPos.X][HitPos.Y].TileMob->CurrHealth <= 0) { MonsterDeath(ThisMap, HitPos); mvprintw(MSGPOSX, MSGPOSY, "You killed it!"); }; } else { mvprintw(MSGPOSX, MSGPOSY, "Nothing to hit!"); }; }
void Game::Update() { display->Clear(0.1f, 0.1f, 0.1f, 1.0f); if (controller.isClosing()) { timer->Pause(); state = MENU; menu->SetState(MenuState::PAUSE); } timer->Update(); totalTime = timer->GetTotalTime(); elapsedTime = timer->GetElapsedTime(); controller.Update(elapsedTime); while (SDL_PollEvent(&e)) controller.HandleInput(e); switch (state) { case(GameState::MENU) : menu->Update(elapsedTime, totalTime); switch (menu->GetState()) { case(MenuState::START) : Restart(); break; case(MenuState::RESUME) : timer->Resume(); state = GameState::RUNNING; break; case(MenuState::QUIT) : End(); break; case(MenuState::RETRY) : Restart(); break; } break; case(GameState::RUNNING) : UpdateBackground(elapsedTime, totalTime); UseBomb(); Shoot(); UpdateBomb(elapsedTime, totalTime); UpdatePlayerBullets(elapsedTime, totalTime); UpdatePlayer(elapsedTime, totalTime); if (player->IsHit()) PlayerHit(); enemyHandler->Update(elapsedTime, totalTime, &playerbullets, bomb); if (!enemyHandler->EnemiesLeft()) Won(); if (player->GetState() == GameObject::DEAD) Lost(); UpdateOverlay(elapsedTime, totalTime); break; } display->Update(); }
//performs clipping each frame void Clipping(void) { LIST * cur1; LIST * cur2; LIST * next; for(cur1 = g_asteroid_list; cur1; cur1 = next) { next = cur1->next; if(g_ships && !g_player.wait_time && (((ASTEROID *)cur1->d)->region & g_player.region) && PolyInCircle(&g_player.clip_poly, &(((ASTEROID *)cur1->d)->clip_circle))) //if the player hits the asteroid { PlayerHit(); AsteroidHit(cur1, 0); continue; } for(cur2 = g_alien_list; cur2; cur2 = cur2->next) { if((((ASTEROID *)cur1->d)->region & ((ALIEN *)cur2->d)->region) && (PolyInCircle(&(((ALIEN *)cur2->d)->clip_poly/*s[0]*/), &(((ASTEROID *)cur1->d)->clip_circle)) /*|| PolyInCircle(&(((ALIEN *)cur2->d)->clip_polys[1]), &(((ASTEROID *)cur1->d)->clip_circle)) || PolyInCircle(&(((ALIEN *)cur2->d)->clip_polys[2]), &(((ASTEROID *)cur1->d)->clip_circle))*/)) { AlienHit(cur2, 0); AsteroidHit(cur1, 0); break; } } if(cur2) //if we broke early from the loop continue; for(cur2 = g_shot_list; cur2; cur2 = cur2->next) { if((((ASTEROID *)cur1->d)->region & ((SHOT *)cur2->d)->region) && PointInCircle(&(((SHOT *)cur2->d)->pos), &(((ASTEROID *)cur1->d)->clip_circle))) //if any shot hits the asteroid { AsteroidHit(cur1, ((SHOT *)cur2->d)->player_owned); RemoveNode(cur2, &g_shot_list); break; } } if(cur2) //if we broke early from the loop continue; } for(cur1 = g_shot_list; cur1; cur1 = next) { next = cur1->next; if(!((SHOT *)cur1->d)->player_owned && g_ships && !g_player.wait_time && (g_player.region & ((SHOT *)cur1->d)->region) && PointInPoly(&(((SHOT *)cur1->d)->pos), &g_player.clip_poly)) //if the alien shot is inside player { RemoveNode(cur1, &g_shot_list); PlayerHit(); continue; } if(((SHOT *)cur1->d)->player_owned) { for(cur2 = g_alien_list; cur2; cur2 = cur2->next) { if((((SHOT *)cur1->d)->region & ((ALIEN *)cur2->d)->region) && (PointInPoly(&(((SHOT *)cur1->d)->pos), &(((ALIEN *)cur2->d)->clip_poly/*s[0]*/)) /*|| PointInPoly(&(((SHOT *)cur1->d)->pos), &(((ALIEN *)cur2->d)->clip_polys[1])) || PointInPoly(&(((SHOT *)cur1->d)->pos), &(((ALIEN *)cur2->d)->clip_polys[2]))*/)) { RemoveNode(cur1, &g_shot_list); AlienHit(cur2, 1); break; } } if(cur2) continue; } for(cur2 = g_powerup_list; cur2; cur2 = cur2->next) { if((((SHOT *)cur1->d)->region & ((POWERUP *)cur2->d)->region) && PointInCircle(&(((SHOT *)cur1->d)->pos), &(((POWERUP *)cur2->d)->clip_circle))) { PowerupHit(cur2, ((SHOT *)cur1->d)->player_owned); RemoveNode(cur1, &g_shot_list); break; } } if(cur2) continue; } if(g_ships && !g_player.wait_time) { for(cur1 = g_alien_list; cur1; cur1 = cur1->next) { if((g_player.region & ((ALIEN *)cur1->d)->region) && (PolyInPoly(&g_player.clip_poly, &(((ALIEN *)cur1->d)->clip_poly/*s[0]*/)) /*|| PolyInPoly(&g_player.clip_poly, &(((ALIEN *)cur1->d)->clip_polys[1])) || PolyInPoly(&g_player.clip_poly, &(((ALIEN *)cur1->d)->clip_polys[2]))*/)) { PlayerHit(); AlienHit(cur1, 0); break; } } } if(g_ships) { for(cur1 = g_powerup_list; cur1; cur1 = next) { next = cur1->next; if((g_player.region & ((POWERUP *)cur1->d)->region) && PolyInCircle(&g_player.clip_poly, &(((POWERUP *)cur1->d)->clip_circle))) { GetPowerup(cur1); continue; } } } }