Classic game with redesigned graphics that retain most of the original gameplay mechanics. Players defend a city from incoming bombs using a limited supply of ammunition. The game provides a fresh visual experience while preserving the core essence of the classic game.
The menu options are as follows:
"Continue" starts the game from the highest ever reached level,
"New Game" starts a fresh game, from the very first level,
"Help" provides information about game objects,
"Exit" allows you to leave the game.
Gameplay is based around shooting fast missiles at incoming bombs that create explosions damaging bombs. Bombs can be destroyed creating explosions and potentially damaging other bombs.
It is important to note that explosions are harmful to the city's infrastructure. If any structure on the surface gets destroyed player has his points cut by a significant amount,
which can make winning the game difficult. Even if no structure gets damaged player still gains minus points for letting any bomb hit the ground. Destroying bombs in the air awards positive points.
It is possible to pause the game at any time (after initial introduction) by pressing Esc key. Resuming the game is also done by pressing the same key. From the pause menu there is an option to go back to the menu (left button), replay the level from the beginning (middle button) or go to the next level, if it has been unlocked in the past by beating the current level (right button).
Threads used in the whole application:
std::thread gameThread = std::thread(Game::Run, diff); - Handles the game loop
std::thread thread = std::thread(AnimateButton, std::ref(topLeft), std::ref(hovered)); - Animates the button upon hovering
std::thread missilesThread(HandleMissiles); - Handles missiles
std::thread explosionsThread(HandleExplosions); - Handles explosions
std::thread bombsThread(HandleBombs); - Handles bombs
std::thread flashesThread(HandleFlashes); - Handles flashes after every missile shot
std::thread destructionsThread(HandleDestructions); - Handles destructions (structure collapse)
std::thread thread = std::thread(&Intro::AnimateIntro, this); - Animates the introduction at the start of every level
std::thread soundThread(filepath() {PlaySoundA(filepath.c_str(), NULL, SND_FILENAME | SND_ASYNC);}); - Handles playing of the audio file
std::thread waitingThread = std::thread(WaitForReady); - Waits for the value change
Mutexes:
std::mutex launcherMutex; - Locks the launcher object
std::mutex buildingsMutex; - Locks the list of buildings
std::mutex missilesMutex; - Locks the list of missiles
std::mutex bombsMutex; - Locks the list of bombs
std::mutex explosionsMutex; - Locks the list of explosions
std::mutex destructionsMutex; - Locks the list of destructions (structure collapse)
std::mutex flashesMutex; - Locks the list of flashes after every missile shot



