00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Ship.hpp"
00020 #include "Singletons.hpp"
00021 #include "Starfield.hpp"
00022 #include "Player.hpp"
00023 #include "PowerUp.hpp"
00024 #include "EnemyManager.hpp"
00025 #include "Enemy_Help.hpp"
00026 #include "Kampagne.hpp"
00027 #include "Mission.hpp"
00028 #include "Bitmapfont.hpp"
00029 #include "HUD-Manager.hpp"
00030 #include "Menu.hpp"
00031 #include "Briefing.hpp"
00032 #include "CreditsManager.hpp"
00033 #include "Init.hpp"
00034
00035 #include <cstdio>
00036 #include <cstdlib>
00037 #include <cstring>
00038 #include <clocale>
00039 #include <cmath>
00040 #include <vector>
00041 #include <list>
00042
00043 #include <SFML/System.hpp>
00044 #include <SFML/Window.hpp>
00045 #include <SFML/Window/Event.hpp>
00046
00047 #include <log4cxx/logger.h>
00048 #include <log4cxx/propertyconfigurator.h>
00049
00050 #include <libintl.h>
00051 #define _(string) gettext(string)
00052
00053 enum GameStatus
00054 {
00055 GAMESTATE_MENU,
00056 GAMESTATE_PLAY,
00057 GAMESTATE_BRIEF,
00058 GAMESTATE_CREDITS
00059 };
00060
00061 CStarfield Starfield;
00062 CPlayer Player;
00063 CEnemyManager EnemyManager;
00064 CKampagne Kampagne;
00065 CBitmapFont BitMapFont;
00066 CHUDManager HUD;
00067 CMenu Menu;
00068 CBriefing Briefing;
00069 CCreditsManager g_CreditsManager;
00070 AHUDPoll * LiveHUD;
00071
00072 std::list<SInfo*> g_Infos;
00073 bool g_Info_On;
00074
00075 std::string nowplay;
00076
00077
00078 std::string Weapon1;
00079 std::string Weapon2;
00080
00081 global_data_pointers datptrs;
00082
00083 int g_MouseX;
00084 int g_MouseY;
00085 bool g_MouseDown;
00086
00087
00088 bool g_IsPlaying = false;
00089
00090 bool g_FirstBrief = false;
00091
00092 void ResetAll()
00093 {
00094 Player.GetShip()->SetCurArmor(Player.GetShip()->GetMaxArmor());
00095 Player.GetShip()->SetPosition((SCREEN_X_SIZE - HUD_SIZE_X)/2,SCREEN_Y_SIZE - 100);
00096 Player.GetShip()->ClearProjectils();
00097 EnemyManager.clearPowerups();
00098 Starfield.RemovePlanets();
00099 }
00100
00101 bool StartCampaign(std::string KampagneName, GameStatus& state)
00102 {
00103 static log4cxx::LoggerPtr log_ (log4cxx::Logger::getLogger("main.StartCampaign"));
00104
00105 Kampagne.init(KampagneName);
00106
00107 ResetAll();
00108 Player.ResetWeapons();
00109
00110 Briefing.SetContent(Kampagne.get_Title(), Kampagne.get_Intro(), Kampagne.get_ImgFile(), BRIEF_BUTTON_START, Kampagne.getFramecount(), Kampagne.getFramedelay());
00111 Briefing.SetCampaign(KampagneName);
00112 Briefing.SetCurMission(0);
00113
00114 EnemyManager.reset();
00115
00117
00118 if (!EnemyManager.init(Kampagne.get_Mission()->get_ai_wave(), Kampagne.get_Mission()->get_ai_params(), datptrs, &Player, &g_Info_On, &g_Infos))
00119 {
00120 LOG4CXX_ERROR(log_, _("Error while initialising the Enemy Manager"));
00121 return false;
00122 }
00123
00124 sgl::get_clock().Reset();
00125
00126 Player.Init(Kampagne.get_Mission()->getPlayerShip());
00127 Player.SetLives(Kampagne.getLeben());
00128 LiveHUD->init(Player.GetShip()->GetMaxArmor(), Player.GetShip()->GetCurrentArmor());
00129
00130 state = GAMESTATE_BRIEF;
00131
00132 g_IsPlaying = true;
00133 g_FirstBrief = true;
00134
00135 return true;
00136 }
00137
00138 bool LoadSave(std::string SaveName, GameStatus& state)
00139 {
00140 static log4cxx::LoggerPtr log_ (log4cxx::Logger::getLogger("main.LoadSave"));
00141
00142 CSaveManager Manager;
00143 SaveData* Data = Manager.ReadSave(SaveName);
00144
00145 if(Data == NULL)
00146 {
00147 return false;
00148 }
00149
00150 StartCampaign(Data->KampagneName, state);
00151 Kampagne.set_MissionIndex(Data->Mission);
00152
00153 EnemyManager.reset();
00154 if (!EnemyManager.init(Kampagne.get_Mission()->get_ai_wave(), Kampagne.get_Mission()->get_ai_params(), datptrs, &Player, &g_Info_On, &g_Infos))
00155 {
00156 LOG4CXX_ERROR(log_, _("Error while initialising the Enemy Manager"));
00157 return false;
00158 }
00159
00160 if(Kampagne.get_Mission()->getPlayerShip() != "")
00161 {
00162 Player.Init(Kampagne.get_Mission()->getPlayerShip());
00163 LiveHUD->init(Player.GetShip()->GetMaxArmor(), Player.GetShip()->GetCurrentArmor());
00164 }
00165 Player.SetLives(Data->Lives);
00166
00167 Briefing.SetCurMission(Data->Mission);
00168 Briefing.SetContent(_("New Mission!"),Kampagne.get_Mission()->get_Beschreibung(),"",BRIEF_BUTTON_START);
00169
00170 return true;
00171 }
00172
00173
00174
00175
00176
00177 void init()
00178 {
00179 g_Info_On = false;
00180
00181 std::srand(42);
00182
00183 HUD.init(datptrs, &BitMapFont);
00184
00185 BitMapFont.Init();
00186
00187 Starfield.Init("data/background/BackgroundData.txt");
00188
00189 Player.Init("data/ships/Bummer.txt");
00190
00191 HUD.registerHUD(&g_Info_On, &g_Infos, &BitMapFont);
00192
00193 LiveHUD = (AHUDPoll*)HUD.registerHUD(Player.GetShip()->GetMaxArmor(), Player.GetShip()->GetCurrentArmor(), POLL_GRAFIK_HORZ, 884, 20, 130, 20);
00194
00195 HUD.registerHUD(&Weapon1, POLL_TEXT, 880, 80, &BitMapFont, 15);
00196
00197 HUD.registerHUD(&Weapon2, POLL_TEXT, 880, 140, &BitMapFont, 15, 138);
00198
00199 HUD.registerHUD(Player.GetLiveString(), POLL_TEXT, 880, 200, &BitMapFont, 15);
00200
00201 HUD.registerHUD(&nowplay, POLL_TEXT, 880, 600, &BitMapFont);
00202
00203 Menu.Init(&BitMapFont, &g_MouseX, &g_MouseY, &g_MouseDown);
00204 Briefing.Init(&BitMapFont, &g_MouseX, &g_MouseY, &g_MouseDown, &Player);
00205 Briefing.SetContent(Kampagne.get_Title(), Kampagne.get_Intro(),Kampagne.get_ImgFile());
00206
00208
00210 }
00211
00212 void play(GameStatus& state, log4cxx::LoggerPtr& log_)
00213 {
00214 sf::Sleep(0.01);
00215 Starfield.DrawBack();
00216 Weapon1 = Player.GetCurWeaponNameOfType(0);
00217 Weapon2 = Player.GetCurWeaponNameOfType(1);
00218
00219 EnemyManager.update();
00220
00221 Player.Draw();
00222 Player.Update();
00223 Starfield.DrawFront();
00224
00225 if(Player.CanBeRemoved() == true)
00226 {
00227 state = GAMESTATE_BRIEF;
00228
00229 Briefing.SetContent(_("Defeat"),Kampagne.get_Niederlage(),"",BRIEF_BUTTON_CANCEL);
00230 }
00231
00232 if (EnemyManager.hasWon())
00233 {
00234 if (Kampagne.nextMission())
00235 {
00236 EnemyManager.reset();
00237 if (!EnemyManager.init(Kampagne.get_Mission()->get_ai_wave(), Kampagne.get_Mission()->get_ai_params(), datptrs, &Player, &g_Info_On, &g_Infos))
00238 {
00239 LOG4CXX_ERROR(log_, _("Error while initialising the Enemy Manager"));
00240 std::exit(0);
00241 }
00242 sgl::get_clock().Reset();
00243
00244 if(Kampagne.get_Mission()->getNormalPlaylist() != "")
00245 {
00249 }
00250
00251 if(Kampagne.get_Mission()->getPlayerShip() != "")
00252 {
00253 Player.Init(Kampagne.get_Mission()->getPlayerShip());
00254 LiveHUD->init(Player.GetShip()->GetMaxArmor(), Player.GetShip()->GetCurrentArmor());
00255 }
00256
00257 state = GAMESTATE_BRIEF;
00258
00259 Starfield.RemovePlanets();
00260
00261 Briefing.IncCurMission();
00262 Briefing.SetContent(Kampagne.get_Mission()->get_Title(),Kampagne.get_Mission()->get_Beschreibung(),Kampagne.get_Mission()->getImage(),
00263 BRIEF_BUTTON_START, Kampagne.get_Mission()->getFramecount(), Kampagne.get_Mission()->getFramedelay());
00264 }
00265 else
00266 {
00267 state = GAMESTATE_BRIEF;
00268
00269 Briefing.SetContent(_("Victory"),Kampagne.get_Epilog(),"",BRIEF_BUTTON_FINISH);
00270 }
00271 }
00272
00273 HUD.draw();
00274 }
00275
00276 void update_world(GameStatus& state)
00277 {
00278 static log4cxx::LoggerPtr log_ (log4cxx::Logger::getLogger("main.update_world"));
00279
00280 std::string KampageName = "";
00281
00282
00283 switch (state)
00284 {
00285 case GAMESTATE_MENU:
00286 KampageName = Menu.Update();
00287
00288 switch (Menu.Close())
00289 {
00290 case MENU_CLOSE_START:
00291 if(StartCampaign(KampageName, state) == false)
00292 {
00293 std::exit(0);
00294 }
00295 break;
00296 case MENU_CLOSE_LOAD:
00297 if(LoadSave(KampageName, state) == false)
00298 {
00299 std::exit(0);
00300 }
00301 break;
00302 case MENU_CLOSE_CREDITS:
00303 g_CreditsManager.Init(&BitMapFont);
00304 Starfield.SetSpawnPlanets(false);
00305 Starfield.SetWidth(SCREEN_X_SIZE);
00306 state = GAMESTATE_CREDITS;
00307 break;
00308 }
00309 break;
00310 case GAMESTATE_BRIEF:
00311 Briefing.Update();
00312
00313 if(Briefing.Close() == true)
00314 {
00315 if(Briefing.GetButtonType() == BRIEF_BUTTON_CANCEL || Briefing.GetButtonType() == BRIEF_BUTTON_FINISH)
00316 {
00317 state = GAMESTATE_MENU;
00318 g_IsPlaying = false;
00319 }
00320 else
00321 {
00322 if(g_FirstBrief == true)
00323 {
00324 CMission* mis = Kampagne.get_Mission();
00325 Briefing.SetContent(mis->get_Title(),
00326 mis->get_Beschreibung(),
00327 mis->getImage(),
00328 BRIEF_BUTTON_START,
00329 mis->getFramecount(),
00330 mis->getFramedelay());
00331
00332 state = GAMESTATE_BRIEF;
00333 g_FirstBrief = false;
00334 }
00335 else
00336 {
00337 state = GAMESTATE_PLAY;
00338 ResetAll();
00339 }
00340 }
00341 sgl::get_clock().Reset();
00342 }
00343 break;
00344 case GAMESTATE_PLAY:
00345 play(state, log_);
00346 break;
00347 case GAMESTATE_CREDITS:
00348 Starfield.DrawBack();
00349 g_CreditsManager.Draw();
00350 Starfield.DrawFront();
00351
00352 if(g_CreditsManager.IsFinished())
00353 {
00354 Menu.SetSubMenu(MENU_SUB_START);
00355 state = GAMESTATE_MENU;
00356 Starfield.SetWidth(SCREEN_X_SIZE - HUD_SIZE_X);
00357 Starfield.SetSpawnPlanets(true);
00358 }
00359 break;
00360 }
00361 }
00362
00363
00364 int main(int argc, char** argv)
00365 {
00366
00367 std::setlocale(LC_ALL, "");
00368 std::setlocale(LC_NUMERIC, "C");
00369 textdomain ("sfml_space");
00370 bindtextdomain ("sfml_space", "l10n");
00371
00372 log4cxx::PropertyConfigurator::configure("logging.conf");
00373
00374 log4cxx::LoggerPtr log_ (log4cxx::Logger::getLogger("main"));
00375
00376 init();
00377
00378 GameStatus cur_game_state(GAMESTATE_MENU);
00379
00380 while (true)
00381 {
00382 sf::Event event;
00383 while (sgl::get_window().GetEvent(event))
00384 {
00385 switch (event.Type)
00386 {
00387 case sf::Event::Closed:
00388 std::exit(0);
00389 break;
00390 case sf::Event::KeyPressed:
00391 if (event.Key.Code == sf::Key::Escape)
00392 {
00393 if(cur_game_state == GAMESTATE_MENU)
00394 {
00395 sgl::get_clock().Reset();
00396 cur_game_state = GAMESTATE_PLAY;
00397 }
00398 else
00399 {
00400 Menu.SetSubMenu(MENU_SUB_START);
00401 cur_game_state = GAMESTATE_MENU;
00402 Starfield.SetWidth(SCREEN_X_SIZE - HUD_SIZE_X);
00403 Starfield.SetSpawnPlanets(true);
00404 }
00405 }
00406 break;
00407 case sf::Event::MouseMoved:
00408 g_MouseX = event.MouseMove.X;
00409 g_MouseY = event.MouseMove.Y;
00410 break;
00411 case sf::Event::MouseButtonPressed:
00412 if (event.MouseButton.Button == sf::Mouse::Left) g_MouseDown = true;
00413 break;
00414 case sf::Event::MouseButtonReleased:
00415 if (event.MouseButton.Button == sf::Mouse::Left) g_MouseDown = false;
00416 break;
00417 }
00418 }
00419 update_world(cur_game_state);
00420
00421 sgl::get_window().Display();
00422 }
00423 }