From 5227bcfa382b914fff3f01e856a433a7f841b943 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sat, 9 Jan 2016 10:06:35 -0500 Subject: xml: dialog options --- src/gameplay.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++--------- src/ui.cpp | 5 +++-- 2 files changed, 52 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/gameplay.cpp b/src/gameplay.cpp index 6637d23..9cae698 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -37,13 +37,14 @@ typedef struct { unsigned int index; } NPCDialog; -std::vector npcd; -std::vector earthxml; -std::vector earth; +std::vector npcd; +std::vector earthxml; +std::vector earth; +std::vector dopt; int commonAIFunc(NPC *speaker){ XMLDocument xml; - XMLElement *exml; + XMLElement *exml,*oxml; unsigned int idx; for(auto &n : npcd){ @@ -56,13 +57,51 @@ int commonAIFunc(NPC *speaker){ for(auto &e : earthxml){ if(e.ptr == currentWorld){ xml.LoadFile(e.file); - exml = xml.FirstChildElement("Dialog")->FirstChildElement(); + + exml = xml.FirstChildElement("Dialog"); + while(strcmp(exml->Attribute("name"),speaker->name)) + exml = exml->NextSiblingElement(); + + exml = exml->FirstChildElement(); do{ if(!strcmp(exml->Name(),"text")){ - if(!strcmp(exml->Attribute("name"),speaker->name) && exml->UnsignedAttribute("id") == idx){ - ui::dialogBox(speaker->name,"",false,exml->GetText()); - ui::waitForDialog(); + if(/*!strcmp(exml->Attribute("name"),speaker->name) &&*/ exml->UnsignedAttribute("id") == idx){ + + if((oxml = exml->FirstChildElement("option"))){ + const char *op; + char *bp1 = new char[1],*bp2,*tmp; + unsigned int idx = 0; + bp1[0] = '\0'; + while(oxml){ + op = oxml->Attribute("text"); + + bp2 = new char[strlen(bp1) + strlen(op) + 2]; + strcpy(bp2,bp1); + + bp2[idx++] = ':'; + strcpy(bp2+idx,op); + idx += strlen(op); + + tmp = bp1; + bp1 = bp2; + delete[] tmp; + + dopt.push_back(oxml); + + oxml = oxml->NextSiblingElement(); + } + ui::dialogBox(speaker->name,bp1,false,exml->GetText()); + ui::waitForDialog(); + if(ui::dialogOptChosen){ + exml = dopt[ui::dialogOptChosen-1]; + } + while(!dopt.empty()) + dopt.pop_back(); + }else{ + ui::dialogBox(speaker->name,"",false,exml->GetText()); + ui::waitForDialog(); + } if(exml->QueryUnsignedAttribute("nextid",&idx) == XML_NO_ERROR){ for(auto &n : npcd){ if(n.npc == speaker){ @@ -98,7 +137,8 @@ void initEverything(void){ for(auto x : xmlFiles){ if(strncmp(x.c_str(),".",1) && strncmp(x.c_str(),"..",2)){ - file = new char[4 + x.size()]; + file = new char[5 + x.size()]; + memset(file,0,5 + x.size()); strncpy(file,"xml/",4); strcpy(file+4,x.c_str()); xml.LoadFile(file); diff --git a/src/ui.cpp b/src/ui.cpp index ead9d8c..6e33692 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -437,10 +437,11 @@ namespace ui { dialogOptCount--; }; - dialogOptChosen=0; + dialogOptCount = 0; + dialogOptChosen = 0; memset(&dialogOptLoc,0,sizeof(float)*12); - if(opt){ + if(opt != NULL){ soptbuf = new char[strlen(opt)+1]; strcpy(soptbuf,opt); -- cgit v1.2.3