00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Menu.hpp"
00020 #include "Singletons.hpp"
00021 #include <boost/filesystem.hpp>
00022
00023 #include <cstring>
00024 #include <cstdlib>
00025
00026 CMenu::CMenu()
00027 {
00029 m_MouseX = NULL;
00030 m_MouseY = NULL;
00031 m_MouseDown = NULL;
00032
00033 m_PushingStart = false;
00034 m_PushingLoad = false;
00035 m_PushingCredits = false;
00036 m_PushingExit = false;
00037
00038 m_Close = MENU_CLOSE_NONE;
00039
00040 m_CurSubMenu = MENU_SUB_START;
00041 }
00042
00043 CMenu::~CMenu()
00044 {}
00045
00046 void CMenu::Init(CBitmapFont* BitMapFont, int* MouseX, int* MouseY, bool* MouseDown)
00047 {
00048 if(MouseX == NULL || MouseY == NULL || MouseDown == NULL)
00049 {
00050 return;
00051 }
00052
00053 m_MouseX = MouseX;
00054 m_MouseY = MouseY;
00055
00056 m_MouseDown = MouseDown;
00057
00058 FILE* MenuFile = fopen("Menu.txt","r");
00059
00060 char strBuf[100];
00061 std::string HelpString;
00062 std::string OldString;
00063 std::string DataString;
00064
00065 std::string ListSelImage = "";
00066
00067
00068 while(std::feof(MenuFile) == 0)
00069 {
00070 std::fscanf(MenuFile,"%s",strBuf);
00071 HelpString = strBuf;
00072
00073 if(HelpString == "=")
00074 {
00075 if(OldString.compare("Background") == 0)
00076 {
00077 std::fscanf(MenuFile,"%s",strBuf);
00078 DataString = strBuf;
00079 m_BackSprite.SetImage(sgl::get_imagemgr().get_img(DataString));
00080 }
00081 else if(OldString.compare("TopImage") == 0)
00082 {
00083 std::fscanf(MenuFile,"%s",strBuf);
00084 DataString = strBuf;
00085 m_TopSprite.SetImage(sgl::get_imagemgr().get_img(DataString));
00086 m_TopSprite.SetPosition(SCREEN_X_SIZE / 2-300, 65);
00087 }
00088
00089 else if(OldString.compare("StartImageUp") == 0)
00090 {
00091 std::fscanf(MenuFile,"%s",strBuf);
00092 DataString = strBuf;
00093 m_StartSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00094 m_StartSpriteUp.SetPosition(30, 510);
00095 }
00096 else if(OldString.compare("StartImageDown") == 0)
00097 {
00098 std::fscanf(MenuFile,"%s",strBuf);
00099 DataString = strBuf;
00100 m_StartSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00101 m_StartSpriteDown.SetPosition(30, 510);
00102 }
00103
00104 else if(OldString.compare("LoadImageUp") == 0)
00105 {
00106 std::fscanf(MenuFile,"%s",strBuf);
00107 DataString = strBuf;
00108 m_LoadSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00109 m_LoadSpriteUp.SetPosition(30, 570);
00110 }
00111 else if(OldString.compare("LoadImageDown") == 0)
00112 {
00113 std::fscanf(MenuFile,"%s",strBuf);
00114 DataString = strBuf;
00115 m_LoadSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00116 m_LoadSpriteDown.SetPosition(30, 570);
00117 }
00118
00119 else if(OldString.compare("ExitImageUp") == 0)
00120 {
00121 std::fscanf(MenuFile,"%s",strBuf);
00122 DataString = strBuf;
00123 m_ExitSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00124 m_ExitSpriteUp.SetPosition(30, 690);
00125 }
00126 else if(OldString.compare("ExitImageDown") == 0)
00127 {
00128 std::fscanf(MenuFile,"%s",strBuf);
00129 DataString = strBuf;
00130 m_ExitSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00131 m_ExitSpriteDown.SetPosition(30, 690);
00132 }
00133
00134 else if(OldString.compare("CreditsImageUp") == 0)
00135 {
00136 std::fscanf(MenuFile,"%s",strBuf);
00137 DataString = strBuf;
00138 m_CreditsSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00139 m_CreditsSpriteUp.SetPosition(30, 630);
00140 }
00141 else if(OldString.compare("CreditsImageDown") == 0)
00142 {
00143 std::fscanf(MenuFile,"%s",strBuf);
00144 DataString = strBuf;
00145 m_CreditsSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00146 m_CreditsSpriteDown.SetPosition(30, 630);
00147 }
00148
00149 else if(OldString.compare("BackImageUp") == 0)
00150 {
00151 std::fscanf(MenuFile,"%s",strBuf);
00152 DataString = strBuf;
00153 m_BackSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00154 m_BackSpriteUp.SetPosition(30, 690);
00155 }
00156 else if(OldString.compare("BackImageDown") == 0)
00157 {
00158 std::fscanf(MenuFile,"%s",strBuf);
00159 DataString = strBuf;
00160 m_BackSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00161 m_BackSpriteDown.SetPosition(30, 690);
00162 }
00163
00164
00165 else if(OldString.compare("ListSelImage") == 0)
00166 {
00167 std::fscanf(MenuFile,"%s",strBuf);
00168 ListSelImage = strBuf;
00169 }
00170
00171 else if(OldString.compare("ListScrollUpImageDis") == 0)
00172 {
00173 std::fscanf(MenuFile,"%s",strBuf);
00174 DataString = strBuf;
00175 m_ScrollUpSpriteDis.SetImage(sgl::get_imagemgr().get_img(DataString));
00176 m_ScrollUpSpriteDis.SetPosition(960, 240);
00177 }
00178 else if(OldString.compare("ListScrollUpImageUp") == 0)
00179 {
00180 std::fscanf(MenuFile,"%s",strBuf);
00181 DataString = strBuf;
00182 m_ScrollUpSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00183 m_ScrollUpSpriteUp.SetPosition(960, 240);
00184 }
00185 else if(OldString.compare("ListScrollUpImageDown") == 0)
00186 {
00187 std::fscanf(MenuFile,"%s",strBuf);
00188 DataString = strBuf;
00189 m_ScrollUpSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00190 m_ScrollUpSpriteDown.SetPosition(960, 240);
00191 }
00192
00193 else if(OldString.compare("ListScrollDownImageDis") == 0)
00194 {
00195 std::fscanf(MenuFile,"%s",strBuf);
00196 DataString = strBuf;
00197 m_ScrollDownSpriteDis.SetImage(sgl::get_imagemgr().get_img(DataString));
00198 m_ScrollDownSpriteDis.SetPosition(960, 700);
00199 }
00200 else if(OldString.compare("ListScrollDownImageUp") == 0)
00201 {
00202 std::fscanf(MenuFile,"%s",strBuf);
00203 DataString = strBuf;
00204 m_ScrollDownSpriteUp.SetImage(sgl::get_imagemgr().get_img(DataString));
00205 m_ScrollDownSpriteUp.SetPosition(960, 700);
00206 }
00207 else if(OldString.compare("ListScrollDownImageDown") == 0)
00208 {
00209 std::fscanf(MenuFile,"%s",strBuf);
00210 DataString = strBuf;
00211 m_ScrollDownSpriteDown.SetImage(sgl::get_imagemgr().get_img(DataString));
00212 m_ScrollDownSpriteDown.SetPosition(960, 700);
00213 }
00214
00215 }
00216
00217 OldString = HelpString;
00218 }
00219
00220 std::fclose(MenuFile);
00221
00222 m_ListField.Init(BitMapFont, ListSelImage);
00223 m_ListField.SetSize(655,470);
00224 m_ListField.SetPosition(270,250);
00225
00226 m_SaveListField.Init(BitMapFont, ListSelImage);
00227 m_SaveListField.SetSize(655,470);
00228 m_SaveListField.SetPosition(270,250);
00229
00230 m_CreditsSprite.SetImage(sgl::get_imagemgr().get_img("data/gfx/Briefing/credits.png"));
00231 m_CreditsSprite.SetPosition(36,240);
00232
00233 ReadCampaignData();
00234 }
00235
00236 std::string CMenu::Update()
00237 {
00238
00239
00240 if(m_MouseX == NULL || m_MouseY == NULL || m_MouseDown == NULL)
00241 {
00242 return "";
00243 }
00244
00245 m_Close = UpdateAll();
00246
00247 if(m_Close == MENU_CLOSE_NONE)
00248 {
00249 RenderAll();
00250 }
00251
00252 std::string OutName;
00253
00254 if(m_CurSubMenu == MENU_SUB_START)
00255 {
00256 OutName = "data/kampagnen/";
00257 OutName += m_ListField.GetCurEntry();
00258 OutName += ".ssk";
00259 }
00260 else if(m_CurSubMenu == MENU_SUB_LOAD)
00261 {
00262 OutName = GetCurSaveName();
00263 }
00264
00265 return OutName;
00266 }
00267
00268 void CMenu::RenderAll()
00269 {
00270 sgl::get_window().Draw(m_BackSprite);
00271 sgl::get_window().Draw(m_TopSprite);
00272
00273 bool CanScrollUp = false;
00274 bool CanScrollDown = false;
00275
00276 if(m_CurSubMenu == MENU_SUB_START)
00277 {
00278 CanScrollUp = m_ListField.CanScrollUp();
00279 CanScrollDown = m_ListField.CanScrollDown();
00280 RenderStart();
00281 }
00282 else if(m_CurSubMenu == MENU_SUB_LOAD)
00283 {
00284 CanScrollUp = m_SaveListField.CanScrollUp();
00285 CanScrollDown = m_SaveListField.CanScrollDown();
00286 RenderLoad();
00287 }
00288
00289 if(CanScrollUp == true)
00290 {
00291 if(m_ScrollingUp == false)
00292 {
00293 sgl::get_window().Draw(m_ScrollUpSpriteUp);
00294 }
00295 else
00296 {
00297 sgl::get_window().Draw(m_ScrollUpSpriteDown);
00298 }
00299 }
00300 else
00301 {
00302 sgl::get_window().Draw(m_ScrollUpSpriteDis);
00303 }
00304
00305 if(CanScrollDown == true)
00306 {
00307 if(m_ScrollingDown == false)
00308 {
00309 sgl::get_window().Draw(m_ScrollDownSpriteUp);
00310 }
00311 else
00312 {
00313 sgl::get_window().Draw(m_ScrollDownSpriteDown);
00314 }
00315 }
00316 else
00317 {
00318 sgl::get_window().Draw(m_ScrollDownSpriteDis);
00319 }
00320
00321 sgl::get_window().Draw(m_CreditsSprite);
00322 }
00323
00324 void CMenu::RenderStart()
00325 {
00326 m_ListField.Draw();
00327
00328 if(m_PushingStart == false)
00329 {
00330 sgl::get_window().Draw(m_StartSpriteUp);
00331 }
00332 else
00333 {
00334 sgl::get_window().Draw(m_StartSpriteDown);
00335 }
00336
00337 if(m_PushingLoad == false)
00338 {
00339 sgl::get_window().Draw(m_LoadSpriteUp);
00340 }
00341 else
00342 {
00343 sgl::get_window().Draw(m_LoadSpriteDown);
00344 }
00345
00346 if(m_PushingCredits == false)
00347 {
00348 sgl::get_window().Draw(m_CreditsSpriteUp);
00349 }
00350 else
00351 {
00352 sgl::get_window().Draw(m_CreditsSpriteDown);
00353 }
00354
00355 if(m_PushingExit == false)
00356 {
00357 sgl::get_window().Draw(m_ExitSpriteUp);
00358 }
00359 else
00360 {
00361 sgl::get_window().Draw(m_ExitSpriteDown);
00362 }
00363 }
00364
00365 void CMenu::RenderLoad()
00366 {
00367 if(m_SaveListField.GetEntryCount() != 0)
00368 {
00369 m_SaveListField.Draw();
00370 }
00371
00372 if(m_PushingLoad == false)
00373 {
00374 sgl::get_window().Draw(m_LoadSpriteUp);
00375 }
00376 else
00377 {
00378 sgl::get_window().Draw(m_LoadSpriteDown);
00379 }
00380
00381
00382 if(m_PushingExit == false)
00383 {
00384 sgl::get_window().Draw(m_BackSpriteUp);
00385 }
00386 else
00387 {
00388 sgl::get_window().Draw(m_BackSpriteDown);
00389 }
00390 }
00391
00392 int CMenu::UpdateAll()
00393 {
00394 if((*m_MouseDown) == false)
00395 {
00396 m_ScrollingUp = false;
00397 m_ScrollingDown = false;
00398 m_HasHitMouse = false;
00399
00400 if(m_PushingStart == true && m_CurSubMenu == MENU_SUB_START)
00401 {
00402 m_PushingStart = false;
00403 return MENU_CLOSE_START;
00404 }
00405
00406 if(m_PushingLoad == true && m_CurSubMenu == MENU_SUB_START)
00407 {
00408 m_PushingLoad = false;
00409 ChangeSubMenuToLoad();
00410 }
00411 else if(m_PushingLoad == true)
00412 {
00413 m_PushingLoad = false;
00414 m_LoadSpriteUp.SetPosition(m_LoadSpriteUp.GetPosition().x, 570);
00415 m_LoadSpriteDown.SetPosition(m_LoadSpriteUp.GetPosition().x, m_LoadSpriteUp.GetPosition().y);
00416 return MENU_CLOSE_LOAD;
00417 }
00418
00419 if(m_PushingCredits == true && m_CurSubMenu == MENU_SUB_START)
00420 {
00421 m_PushingCredits = false;
00422 return MENU_CLOSE_CREDITS;
00423 }
00424
00425 if(m_PushingExit == true && m_CurSubMenu == MENU_SUB_START)
00426 {
00427 m_PushingExit = false;
00428 std::exit(0);
00429 return MENU_CLOSE_START;
00430 }
00431 else if(m_PushingExit == true && m_CurSubMenu == MENU_SUB_LOAD)
00432 {
00433 m_PushingExit = false;
00434 m_LoadSpriteUp.SetPosition(m_LoadSpriteUp.GetPosition().x, 570);
00435 m_LoadSpriteDown.SetPosition(m_LoadSpriteUp.GetPosition().x, m_LoadSpriteUp.GetPosition().y);
00436 m_CurSubMenu = MENU_SUB_START;
00437 }
00438
00439 m_PushingStart = false;
00440 m_PushingExit = false;
00441 return MENU_CLOSE_NONE;
00442 }
00443
00444 if(sgl::get_clock().GetElapsedTime()*1000 - m_HasHitMouseTime > MENU_BUTTON_HIT_DELAY)
00445 {
00446 m_HasHitMouse = false;
00447 m_HasHitMouseTime = sgl::get_clock().GetElapsedTime()*1000;
00448 }
00449
00450 int MouseX = (*m_MouseX);
00451 int MouseY = (*m_MouseY);
00452
00453 if(MouseX > 33 && MouseX < 33 + m_StartSpriteUp.GetSubRect().GetWidth() &&
00454 MouseY > 508 && MouseY < 508 + m_StartSpriteUp.GetSubRect().GetHeight())
00455 {
00456 m_PushingStart = true;
00457 }
00458 else
00459 {
00460 m_PushingStart = false;
00461 }
00462
00463
00464 int LoadY = 568;
00465 if(m_CurSubMenu == MENU_SUB_LOAD)
00466 {
00467 LoadY = 628;
00468 }
00469
00470 if(MouseX > 33 && MouseX < 33 + m_LoadSpriteUp.GetSubRect().GetWidth() &&
00471 MouseY > LoadY && MouseY < LoadY + m_LoadSpriteUp.GetSubRect().GetHeight())
00472 {
00473 m_PushingLoad = true;
00474 }
00475 else
00476 {
00477 m_PushingLoad = false;
00478 }
00479
00480
00481 if(MouseX > 31 && MouseX < 31 + m_CreditsSpriteUp.GetSubRect().GetWidth() &&
00482 MouseY > 628 && MouseY < 628 + m_CreditsSpriteUp.GetSubRect().GetHeight() && m_CurSubMenu == MENU_SUB_START)
00483 {
00484 m_PushingCredits = true;
00485 }
00486 else
00487 {
00488 m_PushingCredits = false;
00489 }
00490
00491
00492 if(MouseX > 31 && MouseX < 31 + m_ExitSpriteUp.GetSubRect().GetWidth() &&
00493 MouseY > 686 && MouseY < 686 + m_ExitSpriteUp.GetSubRect().GetHeight())
00494 {
00495 m_PushingExit = true;
00496 }
00497 else
00498 {
00499 m_PushingExit = false;
00500 }
00501
00502
00503 if(m_HasHitMouse == true)
00504 {
00505 return false;
00506 }
00507
00508 m_HasHitMouse = true;
00509 m_HasHitMouseTime = sgl::get_clock().GetElapsedTime()*1000;
00510
00511 int ScrollX = 950;
00512
00513 int ID = 0;
00514
00515 if(MouseX > m_ListField.GetXPosition() && MouseX < m_ListField.GetXPosition() + m_ListField.GetXSize() &&
00516 MouseY > m_ListField.GetYPosition() && MouseY < m_ListField.GetYPosition() + m_ListField.GetYSize() - 50)
00517 {
00518 ID = (MouseY - m_ListField.GetYPosition()) / 32;
00519 m_ListField.SelectEntryWithScroll(ID);
00520 m_SaveListField.SelectEntryWithScroll(ID);
00521 }
00522
00523 if(MouseX >= ScrollX && MouseX <= ScrollX + m_ScrollUpSpriteUp.GetSubRect().GetWidth() &&
00524 MouseY >= 255 && MouseY <= 255 + m_ScrollUpSpriteUp.GetSubRect().GetHeight())
00525 {
00526 m_ScrollingUp = true;
00527 m_ListField.Scroll(-1);
00528 m_SaveListField.Scroll(-1);
00529 }
00530 else
00531 {
00532 m_ScrollingUp = false;
00533 }
00534
00535 if(MouseX > ScrollX && MouseX < ScrollX + m_ScrollDownSpriteUp.GetSubRect().GetWidth() &&
00536 MouseY > 691 && MouseY < 691 + m_ScrollDownSpriteUp.GetSubRect().GetHeight())
00537 {
00538 m_ScrollingDown = true;
00539 m_ListField.Scroll(1);
00540 m_SaveListField.Scroll(1);
00541 }
00542 else
00543 {
00544 m_ScrollingDown = false;
00545 }
00546
00547 return false;
00548 }
00549
00550
00551 void CMenu::ReadCampaignData()
00552 {
00553 long pos = 0;
00554 const long MaxLength = 200;
00555 std::string CampaignName;
00556
00557 m_ListField.Clear();
00558
00559 char Direction[MaxLength*3];
00560 char DataFile[MaxLength*3];
00561 std::memset(Direction,'\0',MaxLength*3);
00562 std::memset(DataFile,'\0',MaxLength*3);
00563 std::strcpy(Direction,"data/kampagnen/*.ssk");
00564 std::string Folder = "data/kampagnen";
00565
00566 boost::filesystem::directory_iterator end;
00567
00568 for (boost::filesystem::directory_iterator it =
00569 boost::filesystem::directory_iterator(boost::filesystem::path(Folder) );
00570 it != end;
00571 it++)
00572 {
00573 if (it->path().leaf().find(".ssk") == std::string::npos)
00574 continue;
00575
00576 CampaignName = it->path().leaf();
00577 CampaignName.erase(CampaignName.length() - 4,4);
00578
00579 m_ListField.AddEntry(CampaignName);
00580 }
00581 }
00582
00583
00584 void CMenu::ChangeSubMenuToLoad()
00585 {
00586 m_CurSubMenu = MENU_SUB_LOAD;
00587
00588 m_SaveListField.Clear();
00589 m_SaveListField.SetScroll(0);
00590
00591 CSaveManager Manager;
00592 Manager.ReadSavesFromFolder("saves");
00593
00594 m_LoadSpriteUp.SetPosition(m_LoadSpriteUp.GetPosition().x, 630);
00595 m_LoadSpriteDown.SetPosition(m_LoadSpriteUp.GetPosition().x, m_LoadSpriteUp.GetPosition().y);
00596
00597
00598 sf::Sprite m_CreditsSpriteUp;
00599 sf::Sprite m_CreditsSpriteDown;
00600
00601 std::size_t CurSave = 0;
00602
00603 SaveData* Data;
00604
00605 for(CurSave = 0; CurSave < Manager.GetSaveCount(); CurSave++)
00606 {
00607 Data = Manager.GetSaveData(CurSave);
00608 if(Data == NULL)
00609 {
00610 continue;
00611 }
00612
00613 m_SaveListField.AddEntry(Data->ListName);
00614 }
00615 }
00616
00617 std::string CMenu::GetCurSaveName()
00618 {
00619 CSaveManager Manager;
00620 Manager.ReadSavesFromFolder("saves");
00621
00622 int CurSave = m_SaveListField.GetCurSelectIndex();
00623
00624 SaveData* Data;
00625 Data = Manager.GetSaveData(CurSave);
00626
00627 if(Data == NULL)
00628 {
00629 return "";
00630 }
00631
00632 return Data->SaveFile;
00633 }