/** ******************************************************************************* @file /gui/engine/BuildingControllers.cpp @brief Kontrolery na ovladani budov @author Vajicek @version 0.1 ******************************************************************************/ #include #include "gui/engine/BuildingControllers.h" // #include "gui/engine/SceneScripts.h" #include "gui/model/guiUnit.h" #include "gui/model/guiBuilding.h" #include "gui/common/mymath_ext.h" #include "common/Log.h" #include "common/exc.h" //----------------------------------------------------------------------------- namespace gui{ #define DESTRUCTION_DUR 10000 #define DESTRUCTION_SMOKE_DUR 20000 void TBuildingController::destruction(int startAt){ TSheduledAction* sa; // sa = createAction(bcaDestruction, NULL, startAt, DESTRUCTION_DUR); // if(startAt>0) insertAction(sa); else linkActionAfterLast(sa); // if(!iActived)activate(KTime(), 0); } void TBuildingController::script(TSceneScript* c, int startAt){ TSheduledAction* sa; // removeActions(bcaScript); // sa = createAction(bcaScript, c, startAt, 0); // if(startAt>0) insertAction(sa); else linkActionAfterLast(sa); // if(!iActived)activate(KTime(), 0); } void TBuildingController::remove(int startAt){ TSheduledAction* sa; // sa = createAction(bcaRemove, NULL, startAt, 0); // if(startAt>0) insertAction(sa); else linkActionAfterLast(sa); // if(!iActived)activate(KTime(), 0); } TSheduledAction* TBuildingController::createAction(int act, void* data, int start, int dur){ TSheduledAction* ac = TScheduler::createAction(act, data, start, dur); if(ac->iAction == bcaScript) ((TSceneScript*)ac->pData)->getRef(); return ac; } void TBuildingController::disposeAction(TSheduledAction* ac){ if(ac->iAction == bcaScript) ((TSceneScript*)ac->pData)->ungetRef(); TScheduler::disposeAction(ac); } int TBuildingController::updateAction(int rtime, TSheduledAction* sa){ TBuilding* building = (TBuilding*)data; // float t; if(sa->iDuration) t = float(rtime)/sa->iDuration; else t = 1; //out-of range if(t > 1) t = 1; if(t < 0) t = 0; //PRUBEH akce podle typu switch(sa->iAction){ //scenar pro zniceni budovy case bcaDestruction:{ if(!sa->iStarted){ sa->iStarted = 1; iLastTime = rtime; //vybuch TSceneBuildingObject* sco = building->getMainStructure(); float expsize = TVector(sco->aabbDim).len()*0.7f; P3F scpos = TVector( TVector(sco->aabbCenter) - TVector(0,0,sco->aabbDim.z/4) ).toP3F(); // building->selectable = false; // TDestruction* des = TDestruction::installDestruction(&scpos, DESTRUCTION_DUR, expsize, KTime()); des->setTimeRatio(fTimeRatio, 0); } //pokles budovy for(vbuildingobjs::iterator it = building->objs.begin(); it != building->objs.end(); it++) { P3F pos, incr; (*it)->getPosition(&pos); incr.x = RAND(-5,5); incr.y = RAND(-5,5); incr.z = -(*it)->aabbDim.z * 2 *((float)(rtime-iLastTime))/sa->iDuration; pos.x += incr.x; pos.y += incr.y; pos.z += incr.z; (*it)->setPosition(&pos); } iLastTime = rtime; }break; case bcaScript:{ ((TSceneScript*)sa->pData)->decision((TScriptedObject*)building); }break; }//switch //KONEC akce if(t == 1){ //finalizace akce switch(sa->iAction){ case bcaDestruction:{ //koure TSceneBuildingObject* sco = building->getMainStructure(); P3F pos; float rang; TSmoke* smoke; float dim = SizeV2(sco->aabbDim.p)/2; TIME ktime = KTime(); for(int i=0; i<5; i++){ rang = RAND(0, (float)(2*M_PI)); SETV3(pos.p, sco->aabbCenter.x+sin(rang)*dim, sco->aabbCenter.y+cos(rang)*dim, sco->aabbCenter.z-sco->aabbDim.z/2); smoke = TSmoke::installSmoke(&pos, (int)(ktime + RAND(0, 5000)), DESTRUCTION_SMOKE_DUR); smoke->setTimeRatio(fTimeRatio, 0); } }break; case bcaRemove:{ //odstran ze sceny gui::TBuilding::uninstallBuilding(building->map, building->guibiInfo.livingbuilding); return 0;//okamzite prerusit zpracovani zprav }break; } }//if t==1 return 1; } TBuildingController::TBuildingController(TBuilding* b){ RTTID("bldgctrl"); data = b; iLastTime = 0; } }//namespace /*****************************************************************************/