00001 #include <game.h>
00002
00007
00008 interface::interface() : base("interface")
00009 {
00010 inv = new std::vector<inventaire*>;
00011 }
00012
00013 interface::~interface()
00014 {
00015 delete inv;
00016 }
00017
00018 int interface::init(coeur *c,IGUIEnvironment *e,IXMLReader* xmlInterface,bool cl)
00019 {
00020 base::init(0,c);
00021 env = e;
00022
00023 classic=cl;
00024
00025 log(stringc("Interface xml loading ..."));
00026
00027 while(xmlInterface && xmlInterface->read())
00028 {
00029 if (xmlInterface->getNodeType()==EXN_ELEMENT)
00030 {
00031 if (core::stringw("interface") == xmlInterface->getNodeName())
00032 inv->reserve(xmlInterface->getAttributeValueAsInt(L"nbrinv"));
00033 else if (core::stringw("inventaire") == xmlInterface->getNodeName())
00034 {
00035 addInventaire(xmlInterface->getAttributeValueAsInt(L"id"),xmlInterface->getAttributeValue(L"image"),xmlInterface->getAttributeValueAsInt(L"v"),INVENTAIRE_POS(xmlInterface->getAttributeValueAsInt(L"pos")),stringc(xmlInterface->getAttributeValue(L"void")));
00036 log( stringc("Add inventaire : id:") + xmlInterface->getAttributeValue(L"v") + ", image:\"" + xmlInterface->getAttributeValue(L"image") + "\", v:" + xmlInterface->getAttributeValue(L"v") + ", Pos:" + xmlInterface->getAttributeValue(L"pos"));
00037
00038 }
00039 else if (core::stringw("cursor") == xmlInterface->getNodeName())
00040 {
00041 curDefault = stringc(xmlInterface->getAttributeValue(L"default"));
00042 curTake = stringc(xmlInterface->getAttributeValue(L"take"));
00043 curLook = stringc(xmlInterface->getAttributeValue(L"look"));
00044 curAction = stringc(xmlInterface->getAttributeValue(L"action"));
00045 log( stringc("Load cursor image : default:\"") + xmlInterface->getAttributeValue(L"default") + ", take:\"" + xmlInterface->getAttributeValue(L"take") + ", look:\"" + xmlInterface->getAttributeValue(L"look") + ", action:\"" + xmlInterface->getAttributeValue(L"action") + "\"");
00046 }
00047 else if (core::stringw("font") == xmlInterface->getNodeName())
00048 {
00049
00050 mainFont = env->getFont(stringc(xmlInterface->getAttributeValue(L"main")).c_str());
00051 log( stringc("Load font : main:\"") + xmlInterface->getAttributeValue(L"main") + "\"");
00052 }
00053 else if (core::stringw("sound") == xmlInterface->getNodeName())
00054 {
00055 soundFind = stringc(xmlInterface->getAttributeValue(L"find")).c_str();
00056 log( stringc("Load sound : find:\"") + xmlInterface->getAttributeValue(L"find") + "\"");
00057 }
00058 }
00059 }
00060
00061 env->getSkin()->setFont(mainFont);
00062 log("Main font put on");
00063 if (classic)
00064 {
00065 image = env->addImage(mycore->getTexture(curDefault),position2d<s32>(0,0));
00066 }
00067 else
00068 {
00069 psCur = mycore->addParticleSystem();
00070 psCur->setParticleSize(dimension2d<f32>(2.0f, 2.0f));
00071
00072 emCur = psCur->createPointEmitter (
00073 vector3df(0,0,0.01),
00074 200, 200,
00075 SColor(255, 255, 255, 255), SColor(255, 255, 255, 255),
00076 500,1000,
00077 0,
00078 dimension2df(2.0f, 2.0f),dimension2df(2.0f, 2.0f)
00079 );
00080 psCur->setEmitter(emCur);
00081 emCur->drop();
00082
00083 pafCur = psCur->createAttractionAffector (vector3df(0,0,0),150);
00084 psCur->addAffector(pafCur);
00085 pafCur->drop();
00086 psCur->setMaterialFlag(EMF_LIGHTING, false);
00087 psCur->setMaterialTexture(0, mycore->getTexture("texture/particle.png"));
00088 psCur->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL);
00089 }
00090
00091 log("Cursor image added");
00092 txt = env->addStaticText(L"",rect<s32>(200,c->getDim().Height-140,c->getDim().Width-200,c->getDim().Height-100));
00093 txt->setTextAlignment(EGUIA_CENTER,EGUIA_CENTER);
00094 log("Txt added");
00095
00096 handle=item();
00097 selectedInv = -1;
00098 selectedItem = -1;
00099 pselectedInv = -1;
00100 pselectedItem = -1;
00101
00102 afficherInventaire(false);
00103 log("hide the inventaire");
00104
00105 return 1;
00106 }
00107
00108 int interface::update()
00109 {
00110 if ( (mycore->getCurPos().X<100)||
00111 (mycore->getCurPos().Y<100)||
00112 (mycore->getCurPos().X > mycore->getDim().Width-100)||
00113 (mycore->getCurPos().Y > mycore->getDim().Height-100)){
00114 afficherInventaire(true);
00115 }else
00116 {
00117 afficherInventaire(false);
00118 }
00119 for (unsigned int i=0;i<inv->size();i++)
00120 inv->at(i)->update();
00121 env->getRootGUIElement()->bringToFront(image);
00122
00123 selectedInv = -1;
00124 selectedItem = -1;
00125 for (unsigned int i=0;i<inv->size();i++)
00126 {
00127 if ( inv->at(i)->getImage()->isPointInside( mycore->getCurPos() ) )
00128 {
00129 selectedInv = i;
00130 selectedItem = inv->at(selectedInv)->getNumItem(mycore->getCurPos());
00131 break;
00132 }
00133 }
00134
00135 if (classic)
00136 {
00137 setImagePosition(mycore->getCurPos()-position2d<s32>(20,20));
00138 setImage(curDefault);
00139 if ( (mycore->getSelectedAction()) && !v)
00140 {
00141 if (mycore->getSelectedAction()->getAction()==ACTION_OBSERVER)
00142 setImage(curLook);
00143 else if (mycore->getSelectedAction()->getAction()==ACTION_PRENDRE)
00144 setImage(curTake);
00145 else if (mycore->getSelectedAction()->getAction()==ACTION_ANIMATE)
00146 setImage(curAction);
00147 }
00148 }
00149 else
00150 {
00151 psCur->setPosition(mycore->cam->getPosition()+vector3df(0,-5,0));
00152 emCur->setDirection((mycore->cam->getTarget()-mycore->cam->getPosition())/ 10000);
00153 vector3df p;
00154 triangle3df t;
00155 if (mycore->getSelectedAction())
00156 mycore->smgr->getSceneCollisionManager()->getCollisionPoint(mycore->smgr->getSceneCollisionManager()->getRayFromScreenCoordinates(mycore->getCurPos()),mycore->getSelectedAction()->getNode()->getTriangleSelector(),p,t);
00157 else
00158 p = mycore->cam->getTarget();
00159 pafCur->setPoint(p);
00160 if (mycore->getSelectedAction())
00161 {
00162 emCur->setMinStartColor(mycore->getSelectedAction()->getColor());
00163 emCur->setMaxStartColor(mycore->getSelectedAction()->getColor());
00164 }
00165 else
00166 {
00167 emCur->setMinStartColor(SColor(255,255,255,255));
00168 emCur->setMaxStartColor(SColor(255,255,255,255));
00169 }
00170 }
00171
00172 if ((selectedItem!=-1)&& (inv->at(selectedInv)->getItem(selectedItem).getId()!=-1))
00173 setImage(curTake);
00174
00175 if (handle.getId()!=-1)
00176 setImage(handle.getTexture());
00177
00178 if (time < mycore->getTime())
00179 txt->setText(L"");
00180
00181 return 1;
00182 }
00183
00184 int interface::close()
00185 {
00186 log("Deleting inv");
00187 while (!inv->empty())
00188 {
00189 log(stringc("Deleting inventaire ") + stringc(inv->back()->getId()));
00190 inv->back()->close();
00191 inv->pop_back();
00192 }
00193 base::close();
00194 return 1;
00195 }
00196
00197 int interface::setImage(stringc tex)
00198 {
00199 image->setImage(mycore->getTexture(tex));
00200 return 1;
00201 }
00202
00203 int interface::afficherInventaire(bool a)
00204 {
00205 v=a;
00206 for (unsigned int i=0;i<inv->size();i++)
00207 {
00208 inv->at(i)->afficher(a);
00209 }
00210 return 1;
00211 }
00212
00213 int interface::addInventaire(int i,stringc path,int v,INVENTAIRE_POS p,stringc pathvoid)
00214 {
00215 inventaire* inve = new inventaire;
00216 rect<int> pos = rect<int>(0,0,0,0);
00217 switch (p)
00218 {
00219 case INVENTAIRE_POS_GAUCHE:
00220 pos = rect<int>(0,0,100,mycore->getDim().Height);
00221 break;
00222 case INVENTAIRE_POS_DROITE:
00223 pos = rect<int>(mycore->getDim().Width-100,0,mycore->getDim().Width,mycore->getDim().Height);
00224 break;
00225 case INVENTAIRE_POS_BAS:
00226 pos = rect<int>(0,mycore->getDim().Height-100,mycore->getDim().Width,mycore->getDim().Height);
00227 break;
00228 case INVENTAIRE_POS_HAUT:
00229 pos = rect<int>(0,0,mycore->getDim().Width,100);
00230 break;
00231 }
00232 inve->init(i,mycore,env,path,pos,v,p,pathvoid);
00233 inv->push_back(inve);
00234 log("Inventaire added");
00235 return 1;
00236 }
00237
00238 int interface::setImagePosition(position2d<s32> pos)
00239 {
00240 image->setRelativePosition(rect<s32>(pos,dimension2d<s32>(80,80)));
00241 return 1;
00242 }
00243
00244 int interface::addItemInventaire(item m)
00245 {
00246 log(stringc("Item ") + stringc(m.getId()) + " added");
00247 return inv->at(selectedInv)->addItem(selectedItem,m);
00248 }
00249
00250
00251 bool interface::OnEvent(const SEvent& event)
00252 {
00253 if (event.EventType!=EET_MOUSE_INPUT_EVENT)
00254 return false;
00255
00256 switch (event.MouseInput.Event)
00257 {
00258 case EMIE_LMOUSE_PRESSED_DOWN:
00259 if (selectedItem!=-1)
00260 {
00261 handle = inv->at(selectedInv)->getItem(selectedItem);
00262 inv->at(selectedInv)->removeItem(selectedItem);
00263 pselectedInv=selectedInv;
00264 pselectedItem=selectedItem;
00265 log(stringc("Handle item ") + stringc(handle.getId()) + " from inventaire " + stringc(selectedInv));
00266 }
00267 return true;
00268
00269 case EMIE_LMOUSE_LEFT_UP:
00270 if (mycore->getSelectedAction())
00271 {
00272 if ( ( (handle.getId() == -1) && (mycore->getSelectedAction()->getCombi()==-1)) || (mycore->getSelectedAction()->getCombi()==handle.getId()))
00273 {
00274 if (mycore->getSelectedAction()->getAction()==ACTION_ANIMATE)
00275 {
00276 animateMesh* mesh = (animateMesh*) mycore->getSelectedAction();
00277 if (mycore->anim(mesh->getAnim(),mesh->getBegin(),mesh->getEnd())==1)
00278 log(stringc("Set animation of ") + stringc(mesh->getAnim()) + " from animMesh " + stringc(mesh->getId()));
00279 else
00280 log(stringc("Can't find actionMesh ") + stringc(mesh->getAnim()) + " for animMesh " + stringc(mesh->getId()));
00281 }
00282 else if ( (handle.getId() == -1) && (mycore->getSelectedAction()->getAction()==ACTION_PRENDRE))
00283 {
00284 selectedInv = getFreePlace();
00285 selectedItem = inv->at(selectedInv)->getFreePlace();
00286 log(stringc("Put item ") + stringc(((prendreMesh*) mycore->getSelectedAction())->getItem()) + " in default position : inventaire " + stringc(selectedInv) + " at place " + stringc(selectedItem) );
00287 addItemInventaire(mycore->getItem(((prendreMesh*) mycore->getSelectedAction())->getItem()));
00288 mycore->getSelectedAction()->getNode()->setVisible(false);
00289 }
00290 }else
00291 {
00292 speak(mycore->getCombinaison());
00293 }
00294 }
00295
00296 if (handle.getId() == -1)
00297 return true;
00298
00299 if (selectedItem!=-1)
00300 {
00301 item it = inv->at(selectedInv)->getItem(selectedItem);
00302 if (it.getId()!=-1)
00303 {
00304 if ((handle.getCombi()!=-1)&&(handle.getCombi()==it.getId()))
00305 {
00306 mycore->play(soundFind);
00307 inv->at(selectedInv)->removeItem(selectedItem);
00308 log(stringc("Combinaison de") + stringc(handle.getId()) + " et de " + stringc(handle.getCombi()) + " qui donne : " + stringc(handle.getCombiResult()));
00309 addItemInventaire( mycore->getItem( handle.getCombiResult() ));
00310 }
00311 else
00312 {
00313 speak(mycore->getCombinaison());
00314 selectedInv=pselectedInv;
00315 selectedItem=pselectedItem;
00316 log(stringc("Put handle in previous position : inventaire ") + stringc(selectedInv) + " at place " + stringc(selectedItem) );
00317 addItemInventaire(handle);
00318 }
00319 }else
00320 {
00321 log(stringc("Put handle in inventaire ") + stringc(selectedInv) + " at place " + stringc(selectedItem) );
00322 addItemInventaire(handle);
00323 }
00324
00325 }else
00326 {
00327 selectedInv=pselectedInv;
00328 selectedItem=pselectedItem;
00329 log(stringc("Put handle in previous position : inventaire ") + stringc(selectedInv) + " at place " + stringc(selectedItem) );
00330 addItemInventaire(handle);
00331 }
00332 handle=item();
00333 return true;
00334
00335 case EMIE_RMOUSE_PRESSED_DOWN:
00336 if (selectedItem!=-1)
00337 {
00338 speak( mycore->getObservationItem( inv->at(selectedInv)->getItem(selectedItem).getId() ) );
00339 log(stringc("Look item ") + stringc( inv->at(selectedInv)->getItem(selectedItem).getId()) );
00340 }
00341 else if (mycore->getSelectedAction())
00342 {
00343 if ((mycore->getSelectedAction()->getAction()==ACTION_OBSERVER)||(mycore->getSelectedAction()->getAction()==ACTION_PRENDRE)||(mycore->getSelectedAction()->getAction()==ACTION_ANIMATE))
00344 {
00345 speak( mycore->getObservationMesh( mycore->getSelectedAction()->getId() ) );
00346 log(stringc("Look observationMesh ") + stringc(mycore->getSelectedAction()->getId()) );
00347 }
00348 }
00349 return true;
00350 default:
00351 break;
00352 }
00353 return false;
00354 }
00355
00356 int interface::getFreePlace()
00357 {
00358 for (unsigned int i=0;i<inv->size();i++)
00359 {
00360 if ( inv->at(i)->getFreePlace() != -1 )
00361 return i;
00362 }
00363 return -1;
00364 }
00365
00366 int interface::speak(localItem* loc)
00367 {
00368 txt->setText(loc->getText().c_str());
00369 mycore->play(loc->getPath().c_str());
00370 time = mycore->getTime() + 3000;
00371 return 1;
00372 }
00373
00374