CWeaponDefHandler::CWeaponDefHandler() { std::vector<std::string> tafiles = CFileHandler::FindFiles("weapons/", "*.tdf"); //std::cout << " getting files from weapons/*.tdf ... " << std::endl; TdfParser tasunparser; for(unsigned int i=0; i<tafiles.size(); i++) { try { tasunparser.LoadFile(tafiles[i]); }catch( TdfParser::parse_error const& e) { std::cout << "Exception:" << e.what() << std::endl; } catch(...) { std::cout << "Unknown exception in parse process of " << tafiles[i] <<" caught." << std::endl; } } std::vector<std::string> weaponlist = tasunparser.GetSectionList(""); weaponDefs = SAFE_NEW WeaponDef[weaponlist.size()+1]; for(std::size_t taid=0; taid<weaponlist.size(); taid++) { ParseTAWeapon(&tasunparser, weaponlist[taid], taid); } }
void CUnitDefHandler::FindTABuildOpt() { TdfParser tdfparser; tdfparser.LoadFile("gamedata/SIDEDATA.TDF"); std::vector<std::string> sideunits = tdfparser.GetSectionList("CANBUILD"); for(unsigned int i=0; i<sideunits.size(); i++) { std::map<std::string, std::string>::iterator it; UnitDef *builder=NULL; std::transform(sideunits[i].begin(), sideunits[i].end(), sideunits[i].begin(), (int (*)(int))std::tolower); std::map<std::string, int>::iterator it1 = unitID.find(sideunits[i]); if(it1!= unitID.end()) builder = &unitDefs[it1->second]; if(builder) { std::map<std::string, std::string> buildoptlist = tdfparser.GetAllValues("CANBUILD\\" + sideunits[i]); for(it=buildoptlist.begin(); it!=buildoptlist.end(); it++) { UnitDef *buildopt=0; std::transform(it->second.begin(),it->second.end(), it->second.begin(), (int (*)(int))std::tolower); if(unitID.find(it->second)!= unitID.end()){ int num=atoi(it->first.substr(8).c_str()); builder->buildOptions[num]=it->second; } } } } std::vector<std::string> files = CFileHandler::FindFiles("download/*.tdf"); for(unsigned int i=0; i<files.size(); i++) { TdfParser dparser(files[i]); std::vector<std::string> sectionlist = dparser.GetSectionList(""); for(unsigned int j=0; j<sectionlist.size(); j++) { UnitDef *builder=NULL; std::string un1 = dparser.SGetValueDef("", sectionlist[j] + "\\UNITMENU"); std::transform(un1.begin(), un1.end(), un1.begin(), (int (*)(int))std::tolower); std::map<std::string, int>::iterator it1 = unitID.find(un1); if(it1!= unitID.end()) builder = &unitDefs[it1->second]; if(builder) { UnitDef *buildopt=NULL; string un2 = dparser.SGetValueDef("", sectionlist[j] + "\\UNITNAME"); std::transform(un2.begin(), un2.end(), un2.begin(), (int (*)(int))std::tolower); if(unitID.find(un2)!= unitID.end()){ int menu=atoi(dparser.SGetValueDef("", sectionlist[j] + "\\MENU").c_str()); int button=atoi(dparser.SGetValueDef("", sectionlist[j] + "\\BUTTON").c_str()); int num=(menu-2)*6+button+1; builder->buildOptions[num]=un2; } else { info->AddLine("couldnt find unit %s",un2.c_str()); } } } } }
// this function recursively constructs the view hierarchy from a suitable tdf. void GUIdialogController::CreateUIElement(TdfParser & parser, GUIframe* parent, const string& path) { GUIframe *frame=NULL; // get properties string type=parser.SGetValueDef("none", path+"\\type"); string identifier=parser.SGetValueDef("", path+"\\id"); string tooltip=parser.SGetValueDef("", path+"\\tooltip"); float x=atof(parser.SGetValueDef("-1", path+"\\x").c_str()); float y=atof(parser.SGetValueDef("-1", path+"\\y").c_str()); float w=atof(parser.SGetValueDef("-1", path+"\\w").c_str()); float h=atof(parser.SGetValueDef("-1", path+"\\h").c_str()); float x2=atof(parser.SGetValueDef("-1", path+"\\x2").c_str()); float y2=atof(parser.SGetValueDef("-1", path+"\\y2").c_str()); string caption=parser.SGetValueDef("No Caption", path+"\\caption"); // scale the frame { #define ScaleX(a) if(a<=1.0&&a>=0.0) a*=parent->w; #define ScaleY(a) if(a<=1.0&&a>=0.0) a*=parent->h; ScaleX(x); ScaleX(x2); ScaleX(w); ScaleY(y); ScaleY(y2); ScaleY(h); if(x<0) { // x is not set, require w and x2 x=parent->w-x2-w; } else if (w<0) { if(x2>=0) w=parent->w-x2-x; // w is not set but x2 is else w=0; // neither w nor x2 are set; may happen for autosizing buttons } if(y<0) { // y is not set, require h and y2 y=parent->h-y2-h; } else if (h<0) { if(y2>=0) h=parent->h-y2-y; // w is not set but x2 is else h=0; // neither w nor x2 are set } } // create respective control if(type=="none") { frame=parent; } else if(type=="buildmenu") { GUIbuildMenu *bm=new GUIbuildMenu((int)x, (int)y, (int)w, (int)h, makeFunctor((Functor1<UnitDef*>*)0, *this, &GUIdialogController::BuildMenuClicked)); float num=atof(parser.SGetValueDef("64", path+"\\buildpicsize").c_str()); ScaleX(num); bm->SetBuildPicSize((int)num); frame=bm; } else if(type=="centerbuildmenu") { GUIbuildMenu *bm=new GUIcenterBuildMenu((int)x, (int)y, (int)w, (int)h, makeFunctor((Functor1<UnitDef*>*)0, *this, &GUIdialogController::BuildMenuClicked)); float num=atof(parser.SGetValueDef("64", path+"\\buildpicsize").c_str()); ScaleX(num); bm->SetBuildPicSize((int)num); frame=bm; } else if(type=="frame") { frame=new GUIframe((int)x, (int)y, (int)w, (int)h); } else if(type=="minimap") { frame=new GUIminimap(); } else if(type=="tab") { frame=new GUItab((int)x, (int)y, (int)w, (int)h); } else if(type=="table") { GUItable *table=new GUItable((int)x, (int)y, (int)w, (int)h, NULL, makeFunctor((Functor3<GUItable*, int, int>*)0, *this, &GUIdialogController::TableSelection)); frame=table; } else if(type=="pane") { GUIpane *pane=new GUIpane((int)x, (int)y, (int)w, (int)h); pane->SetDraggable(parser.SGetValueDef("no", path+"\\draggable")=="yes"); pane->SetFrame(parser.SGetValueDef("yes", path+"\\frame")=="yes"); pane->SetResizeable(parser.SGetValueDef("no", path+"\\resizeable")=="yes"); frame=pane; } else if(type=="button") { GUIbutton* b=new GUIbutton((int)x, (int)y, caption, makeFunctor((Functor1<GUIbutton*>*)0, *this, &GUIdialogController::ButtonPressed)); b->SetSize((int)w, (int)h); frame=b; } else if(type=="switchbar") { frame=new GUIswitchBar(); } else if(type=="image") { frame=new GUIimage((int)x, (int)y, (int)w, (int)h, caption); } else if(type=="label") { frame=new GUIlabel((int)x, (int)y, (int)w, (int)h, caption); } else if(type=="state") { vector<string> options; map<string, string> vals=parser.GetAllValues(path + "\\states"); map<string, string>::iterator i=vals.begin(); map<string, string>::iterator e=vals.end(); for(; i!=e; i++) options.push_back(i->second); frame = new GUIstateButton((int)x, (int)y, (int)w, options, makeFunctor((Functor2<GUIstateButton*, int>*)0, *this, &GUIdialogController::StateChanged)); } else if(type=="input") { GUIinput *input=new GUIinput((int)x, (int)y, (int)w, (int)h, makeFunctor((Functor1<const string&>*)0, *this, &GUIdialogController::ConsoleInput)); input->SetCaption(caption); frame=input; } else if(type=="resourcebar") { GUIpane *pane=new GUIresourceBar((int)x, (int)y, (int)w, (int)h); pane->SetDraggable(parser.SGetValueDef("no", path+"\\draggable")=="yes"); pane->SetFrame(parser.SGetValueDef("yes", path+"\\frame")=="yes"); pane->SetResizeable(parser.SGetValueDef("no", path+"\\resizeable")=="yes"); frame=pane; } else if(type=="allyresourcebar") { GUIpane *pane=new GUIallyResourceBar((int)x, (int)y, (int)w, (int)h); pane->SetDraggable(parser.SGetValueDef("no", path+"\\draggable")=="yes"); pane->SetFrame(parser.SGetValueDef("yes", path+"\\frame")=="yes"); frame=pane; } else if(type=="infoselection") { GUIinfoSelection *infoSelection=new GUIinfoSelection((int)x, (int)y, (int)w, (int)h); infoSelection->SetDraggable(parser.SGetValueDef("no", path+"\\draggable")=="yes"); infoSelection->SetFrame(parser.SGetValueDef("yes", path+"\\frame")=="yes"); infoSelection->SetResizeable(parser.SGetValueDef("no", path+"\\resizeable")=="no"); float num=atof(parser.SGetValueDef("64", path+"\\buildpicsize").c_str()); ScaleX(num); infoSelection->SetBuildPicSize((int)num); frame=infoSelection; } if(!frame) frame=CreateControl(type, (int)x, (int)y, (int)w, (int)h, parser); if(!frame) { printf("unknown control definition %s\n", type.c_str()); return; } if(parser.SGetValueDef("no", path+"\\hidden")=="yes") frame->ToggleHidden(); if(!tooltip.empty()) frame->SetTooltip(tooltip); if(frame!=parent) { frame->SetIdentifier(identifier); // add to parent GUIswitchBar *bar=dynamic_cast<GUIswitchBar*>(parent); if(bar) { // if it's a switchbar, look if child has a title for switchbars string switchName=parser.SGetValueDef(caption, path+"\\switch"); bar->AddSwitchableChild(frame, switchName); } else { parent->AddChild(frame); } if(identifier!="") controls[identifier]=frame; } // add children vector<string> sects=parser.GetSectionList(path); for(int i=0; i<sects.size(); i++) { printf("found section %s\n", sects[i].c_str()); if(!sects[i].compare(0, 6, "gadget")) CreateUIElement(parser, frame, path+"\\"+sects[i]); if(!sects[i].compare(0, 6, "dialog")) { string id=parser.SGetValueDef("", path+"\\"+sects[i]+"\\id"); GUIdialogController *controller=dialogControllers[id]; if(controller) controller->CreateUIElement(parser, frame, path+"\\"+sects[i]); } } }