00001 #include <game.h>
00002
00003 #include <startmenu.h>
00004
00005 #include <iostream>
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 startmenu::startmenu()
00023 {
00024 dr = EDT_SOFTWARE;
00025 dim = dimension2d<s32>(640, 480);
00026 bits = 8;
00027 fullscreen = false;
00028 stencilbuffer = false;
00029 vsync = false;
00030
00031 lang = 0;
00032
00033 menus = new std::vector<IGUIButton*>;
00034 menusOut = new std::vector<ITexture*>;
00035 menusIn = new std::vector<ITexture*>;
00036 starting_txt = new std::vector<stringw>;
00037
00038 progressing=0;
00039 }
00040
00041 startmenu::~startmenu()
00042 {
00043 delete menus;
00044 delete menusIn;
00045 delete menusOut;
00046 delete starting_txt;
00047 }
00048
00049 int startmenu::init(stringc p, stringc la)
00050 {
00051 log(stringc("Main Folder : ") + p);
00052 log(stringc("Language menu : ") + la);
00053
00054 device = createDevice(dr,dim,bits,fullscreen,stencilbuffer,vsync);
00055 log("Device created");
00056
00057 driver = device->getVideoDriver();
00058 smgr = device->getSceneManager();
00059 env = device->getGUIEnvironment();
00060
00061 #ifdef AUDIO
00062 engine = createIrrKlangDevice();
00063 #endif
00064
00065 langMenu=la;
00066
00067 path = p;
00068 pathStart = "";
00069 pathConfig = path + "config.xml";
00070 pathMain = "";
00071
00072 device->getFileSystem()->changeWorkingDirectoryTo(path.c_str());
00073
00074 IXMLReader* xmlConfig = device->getFileSystem()->createXMLReader(pathConfig.c_str());
00075
00076 if (xmlConfig)
00077 log(stringc("Finded config file ") + pathConfig + " reading it...");
00078 else
00079 {
00080 log(stringc("Can't find config file ") + pathConfig + " quitting...");
00081 return 1;
00082 }
00083
00084 while(xmlConfig && xmlConfig->read())
00085 {
00086 if (xmlConfig->getNodeType()==EXN_ELEMENT)
00087 {
00088 if (core::stringw("device") == xmlConfig->getNodeName())
00089 {
00090 dr = E_DRIVER_TYPE(xmlConfig->getAttributeValueAsInt(L"driver"));
00091 bits = xmlConfig->getAttributeValueAsInt(L"bits");
00092 fullscreen = xmlConfig->getAttributeValueAsInt(L"fs");
00093 stencilbuffer = xmlConfig->getAttributeValueAsInt(L"sb");
00094 vsync = xmlConfig->getAttributeValueAsInt(L"vs");
00095 }
00096 else if (core::stringw("dimension") == xmlConfig->getNodeName())
00097 {
00098 dim = dimension2d<s32>(xmlConfig->getAttributeValueAsInt(L"width"),xmlConfig->getAttributeValueAsInt(L"height"));
00099 }
00100 else if (core::stringw("local") == xmlConfig->getNodeName())
00101 {
00102 lang = xmlConfig->getAttributeValueAsInt(L"lang");
00103 }
00104 else if (core::stringw("main") == xmlConfig->getNodeName())
00105 {
00106 pathMain = xmlConfig->getAttributeValue(L"file");
00107 }
00108 else if (core::stringw("startmenu") == xmlConfig->getNodeName())
00109 {
00110 log(stringc("startmenu ") + xmlConfig->getAttributeValue(L"file"));
00111 pathStart = xmlConfig->getAttributeValue(L"file");
00112 }
00113 }
00114 }
00115
00116 xmlConfig->drop();
00117
00118 xmlConfig = device->getFileSystem()->createXMLReader(pathStart.c_str());
00119
00120 if (xmlConfig)
00121 log(stringc("Finded startmenu main file ") + pathStart + " reading it...");
00122 else
00123 {
00124 log(stringc("Can't find startmenu main file ") + pathStart + " quitting...");
00125 return 2;
00126 }
00127
00128 stringc pathLocal="";
00129
00130 while(xmlConfig && xmlConfig->read())
00131 {
00132 if ( (xmlConfig->getNodeType()==EXN_ELEMENT) &&
00133 (core::stringw("file") == xmlConfig->getNodeName()) &&
00134 (stringc(xmlConfig->getAttributeValue(L"lang")) == langMenu) )
00135 pathLocal = xmlConfig->getAttributeValue(L"path");
00136 }
00137
00138 xmlConfig->drop();
00139
00140 xmlConfig = device->getFileSystem()->createXMLReader(pathLocal.c_str());
00141
00142 if (xmlConfig)
00143 log(stringc("Finded startmenu local file ") + pathLocal + " reading it...");
00144 else
00145 {
00146 log(stringc("Can't find startmenu local file ") + pathLocal + " quitting...");
00147 return 2;
00148 }
00149
00150 IGUIElement* element = 0;
00151 IGUIComboBox* combo = 0;
00152 stringc path = "./";
00153 position2d<int> actPos = position2d<int>(0,0);
00154 dimension2d<int> actDim = dimension2d<int>(0,0);
00155
00156 while(xmlConfig && xmlConfig->read())
00157 {
00158 if (xmlConfig->getNodeType()==EXN_ELEMENT)
00159 {
00160 if (core::stringw("startmenu") == xmlConfig->getNodeName())
00161 device->setWindowCaption(xmlConfig->getAttributeValue(L"caption"));
00162 if (core::stringw("skin") == xmlConfig->getNodeName())
00163 env->getSkin()->setFont(env->getFont(stringc(xmlConfig->getAttributeValue(L"font")).c_str()));
00164 else if (core::stringw("main") == xmlConfig->getNodeName())
00165 element = env->addImage(driver->getTexture(stringc(xmlConfig->getAttributeValue(L"fond")).c_str()),
00166 position2d<int>(0,0),true,0,xmlConfig->getAttributeValueAsInt(L"id"));
00167 else if (core::stringw("color") == xmlConfig->getNodeName())
00168 {
00169 SColor col = SColor(xmlConfig->getAttributeValueAsInt(L"text"));
00170 col.setAlpha(255);
00171 env->getSkin()->setColor(EGDC_BUTTON_TEXT,col);
00172 }
00173 else if (core::stringw("general") == xmlConfig->getNodeName())
00174 {
00175 if (xmlConfig->getAttributeValue(L"path"))
00176 path = xmlConfig->getAttributeValue(L"path");
00177 if (xmlConfig->getAttributeValueAsInt(L"x"))
00178 actPos = position2d<int>(xmlConfig->getAttributeValueAsInt(L"x"),actPos.Y);
00179 if (xmlConfig->getAttributeValueAsInt(L"y"))
00180 actPos = position2d<int>(actPos.X,xmlConfig->getAttributeValueAsInt(L"y"));
00181 if (xmlConfig->getAttributeValueAsInt(L"w"))
00182 actDim = dimension2d<int>(xmlConfig->getAttributeValueAsInt(L"w"),actDim.Height);
00183 if (xmlConfig->getAttributeValueAsInt(L"h"))
00184 actDim = dimension2d<int>(actDim.Width,xmlConfig->getAttributeValueAsInt(L"h"));
00185 }
00186 else if (core::stringw("button") == xmlConfig->getNodeName())
00187 {
00188 menusOut->push_back(driver->getTexture((path + xmlConfig->getAttributeValue(L"out")).c_str()));
00189 menusIn->push_back(driver->getTexture((path + xmlConfig->getAttributeValue(L"in")).c_str()));
00190 IGUIButton *but = env->addButton(rect<s32>(actPos,actDim),element,xmlConfig->getAttributeValueAsInt(L"id"),L"");
00191 but->setImage(menusIn->back());
00192 but->setUseAlphaChannel (true);
00193 but->setDrawBorder (false);
00194
00195 menus->push_back(but);
00196 }
00197 else if (core::stringw("combo") == xmlConfig->getNodeName())
00198 {
00199 env->addStaticText(xmlConfig->getAttributeValue(L"text"), rect<s32>(actPos,actDim),false,true,element,-1);
00200 combo = env->addComboBox(rect<s32>(actPos+position2d<int>(actDim.Width,0),actDim),
00201 element,xmlConfig->getAttributeValueAsInt(L"id"));
00202 }
00203 else if (core::stringw("item") == xmlConfig->getNodeName())
00204 combo->addItem(xmlConfig->getAttributeValue(L"txt"));
00205 else if (core::stringw("checkBox") == xmlConfig->getNodeName())
00206 {
00207 env->addStaticText(xmlConfig->getAttributeValue(L"text"), rect<s32>(actPos,actDim),false,true,element,-1);
00208 env->addCheckBox (false,rect<s32>(actPos+position2d<int>(actDim.Width,0),actDim),
00209 element, xmlConfig->getAttributeValueAsInt(L"id"));
00210 }
00211 else if (core::stringw("edit") == xmlConfig->getNodeName())
00212 env->addEditBox(xmlConfig->getAttributeValue(L"text"),rect<s32>(actPos,actDim),true,
00213 element,xmlConfig->getAttributeValueAsInt(L"id"));
00214 else if (core::stringw("static") == xmlConfig->getNodeName())
00215 env->addStaticText(xmlConfig->getAttributeValue(L"text"), rect<s32>(actPos,actDim),false,true,
00216 element,xmlConfig->getAttributeValueAsInt(L"id"));
00217 else if (core::stringw("image") == xmlConfig->getNodeName())
00218 {
00219 IGUIImage *image = env->addImage(rect<s32>(actPos,actDim),
00220 element,xmlConfig->getAttributeValueAsInt(L"id"));
00221 std::cout << actPos.X << " " << actPos.Y << " " << "\n";
00222 if (xmlConfig->getAttributeValue(L"path"))
00223 image->setImage(driver->getTexture(stringc(path + xmlConfig->getAttributeValue(L"path")).c_str()));
00224 }
00225 else if (core::stringw("launch") == xmlConfig->getNodeName())
00226 starting_txt->push_back(stringw(xmlConfig->getAttributeValue(L"text")));
00227 }
00228 else if (xmlConfig->getNodeType()==EXN_ELEMENT_END)
00229 {
00230 combo=0;
00231 if (core::stringw("combo") == xmlConfig->getNodeName())
00232 continue;
00233 actPos = position2d<int>(0,0);
00234 actDim = dimension2d<int>(0,0);
00235 path = "./";
00236 element=0;
00237 }
00238 }
00239
00240 xmlConfig->drop();
00241
00242 start=false;
00243
00244 welcome = (IGUIImage*) env->getRootGUIElement()->getElementFromId(100);
00245 if (!welcome)
00246 ;
00247
00248 game = (IGUIImage*) env->getRootGUIElement()->getElementFromId(200);
00249 if (!game)
00250 ;
00251
00252 options = (IGUIImage*) env->getRootGUIElement()->getElementFromId(300);
00253 if (!options)
00254 ;
00255
00256 starting = (IGUIImage*) env->getRootGUIElement()->getElementFromId(400);
00257 if (!starting)
00258 ;
00259
00260 game_path = (IGUIEditBox*) game->getElementFromId(201);
00261 if (game_path)
00262 game_path->setText(stringw(pathMain).c_str());
00263 else
00264 ;
00265
00266 game_img = (IGUIImage*) game->getElementFromId(203);
00267 if (!game_img)
00268 ;
00269
00270 game_name = (IGUIStaticText*) game->getElementFromId(204);
00271 if (!game_name)
00272 ;
00273
00274 game_text = (IGUIStaticText*) game->getElementFromId(205);
00275 if (!game_text)
00276 ;
00277
00278 options_dv = (IGUIComboBox*) options->getElementFromId(301);
00279 if (options_dv)
00280 options_dv->setSelected(dr);
00281 else
00282 ;
00283
00284 options_res = (IGUIComboBox*) options->getElementFromId(302);
00285 if (options_res)
00286 for (unsigned int i=0;i<options_res->getItemCount();i++)
00287 {
00288 if ( ( stringw( options_res->getItem(i) ).find( stringw(dim.Height).c_str() )!=-1)
00289 && ( stringw( options_res->getItem(i) ).find( stringw(dim.Width).c_str() ) !=-1))
00290 options_res->setSelected(i);
00291 }
00292 else
00293 ;
00294
00295 options_fs = (IGUICheckBox*) options->getElementFromId(303);
00296 if (options_fs)
00297 options_fs->setChecked(fullscreen);
00298 else
00299 ;
00300
00301 options_lang = (IGUIComboBox*) options->getElementFromId(304);
00302 if (options_lang)
00303 options_lang->setSelected(lang);
00304 else
00305 ;
00306
00307 starting_bar = (IGUIImage*) starting->getElementFromId(401);
00308 if (! starting_bar)
00309 ;
00310
00311 starting_text = (IGUIStaticText*) starting->getElementFromId(402);
00312 if (! starting_text)
00313 ;
00314
00315 welcome->setVisible(true);
00316 game->setVisible(false);
00317 options->setVisible(false);
00318 starting->setVisible(false);
00319
00320 device->setEventReceiver(this);
00321
00322 return 0;
00323 }
00324
00325 int startmenu::update()
00326 {
00327 int r = device->run();
00328 if (r && device->isWindowActive())
00329 {
00330 curPos=device->getCursorControl()->getPosition();
00331
00332 for (unsigned int i=0;i<menus->size();i++)
00333 {
00334 if (menus->at(i)->isPointInside (curPos))
00335 menus->at(i)->setImage(menusIn->at(i));
00336 else
00337 menus->at(i)->setImage(menusOut->at(i));
00338 }
00339
00340 driver->beginScene(true, true, SColor(0,0,0,0));
00341
00342 env->drawAll();
00343
00344 driver->endScene();
00345 if (q)
00346 {
00347 log("Quitting");
00348 close();
00349 return 0;
00350 }
00351
00352 if (start)
00353 {
00354 start = false;
00355 startCoeur();
00356 return 0;
00357 }
00358 }
00359 return r;
00360 }
00361
00362 int startmenu::close()
00363 {
00364 device->drop();
00365 log("Irrlicht device drop");
00366 #ifdef AUDIO
00367 engine->drop();
00368 log("Irrklang engine drop");
00369 #endif
00370 log("startmenu is closed");
00371 return 1;
00372 }
00373
00374 position2d<s32> startmenu::getCurPos()
00375 {
00376 return curPos;
00377 }
00378
00379 u32 startmenu::getTime()
00380 {
00381 return device->getTimer()->getRealTime();
00382 }
00383
00384 bool startmenu::OnEvent(const SEvent& event)
00385 {
00386 if (event.EventType==EET_KEY_INPUT_EVENT)
00387 {
00388 if (event.KeyInput.PressedDown)
00389 {
00390 switch(event.KeyInput.Key)
00391 {
00392 case KEY_KEY_Q:
00393 q = true;
00394 return true;
00395 default:
00396 break;
00397 }
00398 }
00399 }else if(event.EventType==EET_GUI_EVENT)
00400 {
00401 int id = event.GUIEvent.Caller->getID();
00402 switch (event.GUIEvent.EventType)
00403 {
00404 case EGET_BUTTON_CLICKED:
00405 switch (id)
00406 {
00407 case 101:
00408 start=true;
00409 return true;
00410 case 102:
00411 return true;
00412 case 103:
00413 welcome->setVisible(false);
00414 game->setVisible(true);
00415 loadDesc();
00416 return true;
00417 case 104:
00418 welcome->setVisible(false);
00419 options->setVisible(true);
00420 return true;
00421 case 105:
00422 q = true;
00423 break;
00424 case 299:
00425 game->setVisible(false);
00426 welcome->setVisible(true);
00427 saveConfig();
00428 break;
00429 case 202:
00430 env->addFileOpenDialog (L"", true, 0, 221);
00431 break;
00432 case 399:
00433 options->setVisible(false);
00434 welcome->setVisible(true);
00435 saveConfig();
00436 break;
00437 default:
00438
00439 break;
00440 }
00441 break;
00442 case EGET_FILE_SELECTED:
00443 if (!id==221)
00444 break;
00445 game_path->setText( ((IGUIFileOpenDialog*) event.GUIEvent.Caller)->getFileName() );
00446 device->getFileSystem()->changeWorkingDirectoryTo(path.c_str());
00447 loadDesc();
00448 break;
00449 case EGET_EDITBOX_ENTER:
00450 if (!id==201)
00451 break;
00452 if (!device->getFileSystem()->existFile(game_path->getText()))
00453 break;
00454 loadDesc();
00455 break;
00456 case EGET_COMBO_BOX_CHANGED:
00457 if (id==301)
00458 dr = E_DRIVER_TYPE(options_dv->getSelected());
00459 else if (id==302)
00460 {
00461 stringc temp = options_res->getItem (options_res->getSelected());
00462 int t = temp.find(L"x");
00463 dim = dimension2d<int>(fast_atof(temp.subString(0,t).c_str()),fast_atof(temp.subString(t+1,temp.size()-t).c_str()));
00464 }
00465 else if (id==304)
00466 lang = options_lang->getSelected();
00467 break;
00468 case EGET_CHECKBOX_CHANGED:
00469 if (id==303)
00470 fullscreen = options_fs->isChecked();
00471 break;
00472 default:
00473
00474 break;
00475 }
00476 }
00477 return false;
00478 }
00479
00480 stringc startmenu::getVersion()
00481 {
00482 return stringc(VERSION);
00483 }
00484
00485 int startmenu::setCaption(stringw caption)
00486 {
00487 device->setWindowCaption(caption.c_str());
00488 log(stringc("Change window caption to ") + caption.c_str());
00489 return 1;
00490 }
00491
00492 int startmenu::startCoeur()
00493 {
00494 welcome->setVisible(false);
00495 game->setVisible(false);
00496 options->setVisible(false);
00497 starting->setVisible(true);
00498
00499 log("Starting coeur");
00500 c = new coeur;
00501 if (c->init(this))
00502 {
00503 log("error initialising core");
00504 goto end;
00505 }
00506 log("Closing startmenu...");
00507 close();
00508 log("Coeur started");
00509 while(c->update());
00510 end:
00511 log("Coeur ended");
00512 c->close();
00513 log("Coeur closed");
00514 delete c;
00515 log("Coeur deleted");
00516
00517 return 1;
00518 }
00519
00520 int startmenu::log(stringc text)
00521 {
00522 std::cout << text.c_str() << "\n";
00523 return 1;
00524 }
00525
00526 int startmenu::loadDesc()
00527 {
00528 pathMain = game_path->getText();
00529 IXMLReader* xmlMain = device->getFileSystem()->createXMLReader(pathMain.c_str());
00530
00531 game_img->setImage(0);
00532 game_name->setText(L"");
00533 game_text->setText(L"");
00534
00535 stringc actualLang="";
00536
00537 if (!xmlMain)
00538 return 1;
00539
00540 while(xmlMain && xmlMain->read())
00541 {
00542 if (xmlMain->getNodeType()==EXN_ELEMENT)
00543 {
00544 if (core::stringw("description") == xmlMain->getNodeName())
00545 {
00546 actualLang = xmlMain->getAttributeValue(L"lang");
00547 if (langMenu == actualLang)
00548 {
00549 game_img->setImage(driver->getTexture(xmlMain->getAttributeValue(L"image")));
00550 game_name->setText(xmlMain->getAttributeValue(L"name"));
00551 }
00552 }
00553 }else if ( (xmlMain->getNodeType()==EXN_TEXT) && (langMenu==actualLang))
00554 {
00555 game_text->setText(xmlMain->getNodeData());
00556 }else if (xmlMain->getNodeType()==EXN_ELEMENT_END)
00557 {
00558 actualLang = "";
00559 }
00560 }
00561
00562 xmlMain->drop();
00563 return 0;
00564 }
00565
00566 int startmenu::saveConfig()
00567 {
00568 IXMLWriter* xmlConfig = device->getFileSystem()->createXMLWriter(pathConfig.c_str());
00569
00570 if (!xmlConfig)
00571 return 1;
00572
00573 xmlConfig->writeXMLHeader();
00574
00575 xmlConfig->writeElement(L"config");
00576 xmlConfig->writeLineBreak();
00577 xmlConfig->writeElement (L"device", true, L"driver", stringw(dr).c_str(),
00578 L"bits", stringw(bits).c_str(),
00579 L"fs", stringw(fullscreen).c_str(),
00580 L"sb", stringw(stencilbuffer).c_str(),
00581 L"vs", stringw(vsync).c_str()
00582 );
00583
00584 xmlConfig->writeLineBreak();
00585 xmlConfig->writeElement (L"dimension", true, L"width", stringw(dim.Width).c_str(), L"height", stringw(dim.Height).c_str());
00586 xmlConfig->writeLineBreak();
00587 xmlConfig->writeLineBreak();
00588
00589 xmlConfig->writeElement (L"main", true, L"file", stringw(pathMain).c_str());
00590 xmlConfig->writeLineBreak();
00591
00592 xmlConfig->writeElement (L"local", true, L"lang", stringw(lang).c_str());
00593 xmlConfig->writeLineBreak();
00594 xmlConfig->writeLineBreak();
00595
00596 xmlConfig->writeElement (L"startmenu", true, L"file", stringw(pathStart).c_str());
00597 xmlConfig->writeLineBreak();
00598
00599 xmlConfig->writeClosingTag(L"config");
00600 xmlConfig->writeLineBreak();
00601 xmlConfig->writeLineBreak();
00602
00603 xmlConfig->drop();
00604
00605 return 1;
00606 }
00607
00608 int startmenu::progress()
00609 {
00610 log("progress");
00611 if (progressing>=starting_txt->size())
00612 return -1;
00613 starting_bar->setRelativePosition(
00614 rect<s32>(
00615 starting_bar->getRelativePosition().UpperLeftCorner,
00616 dimension2d<s32>( progressing*(560/starting_txt->size()) , 40 )
00617 )
00618 );
00619 starting_text->setText( ( stringw(int(100*progressing/starting_txt->size())) + stringw("% - ") + starting_txt->at(progressing)).c_str());
00620 progressing++;
00621 update();
00622 return 1;
00623 }
00624
00625 IFileSystem* startmenu::getFileSystem()
00626 {
00627 return device->getFileSystem();
00628 }
00629