diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gameplay.cpp | 94 | ||||
-rw-r--r-- | src/ui.cpp | 10 | ||||
-rw-r--r-- | src/world.cpp | 23 |
3 files changed, 101 insertions, 26 deletions
diff --git a/src/gameplay.cpp b/src/gameplay.cpp index 6637d23..a257ad3 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -32,19 +32,22 @@ typedef struct { char *file; } WorldXML; + typedef struct { NPC *npc; unsigned int index; } NPCDialog; -std::vector<NPCDialog> npcd; -std::vector<WorldXML> earthxml; -std::vector<World *> earth; +std::vector<NPCDialog> npcd; +std::vector<WorldXML> earthxml; +std::vector<World *> earth; +std::vector<XMLElement *> dopt; int commonAIFunc(NPC *speaker){ XMLDocument xml; - XMLElement *exml; + XMLElement *exml,*oxml; unsigned int idx; + bool stop = false; for(auto &n : npcd){ if(n.npc == speaker){ @@ -56,13 +59,67 @@ 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->Attribute("call")){ + for(auto &n : currentWorld->npc){ + if(!strcmp(n->name,exml->Attribute("call"))){ + if(exml->QueryUnsignedAttribute("callid",&idx) == XML_NO_ERROR){ + for(auto &n2 : npcd){ + if(n2.npc == n){ + n2.index = idx; + break; + } + } + } + n->addAIFunc(commonAIFunc,false); + break; + } + } + } if(exml->QueryUnsignedAttribute("nextid",&idx) == XML_NO_ERROR){ for(auto &n : npcd){ if(n.npc == speaker){ @@ -70,7 +127,11 @@ int commonAIFunc(NPC *speaker){ break; } } - return 1; + if(exml->QueryBoolAttribute("stop",&stop) == XML_NO_ERROR && stop) + return 0; + else if(exml->QueryBoolAttribute("pause",&stop) == XML_NO_ERROR && stop) + return 1; + else return commonAIFunc(speaker); } return 0; } @@ -88,6 +149,7 @@ void initEverything(void){ std::vector<std::string> xmlFiles; static char *file; bool dialog; + float spawnx; XMLDocument xml; XMLElement *wxml; @@ -98,7 +160,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); @@ -118,9 +181,16 @@ void initEverything(void){ earth.back()->generate(wxml->UnsignedAttribute("width")); } }else if(!strcmp(name,"mob")){ - earth.back()->addMob(wxml->UnsignedAttribute("type"),wxml->FloatAttribute("x"),wxml->FloatAttribute("y")); + if(wxml->QueryFloatAttribute("x",&spawnx) != XML_NO_ERROR) + earth.back()->addMob(wxml->UnsignedAttribute("type"),getRand() % earth.back()->getTheWidth() / 2,100); + else + earth.back()->addMob(wxml->UnsignedAttribute("type"),wxml->FloatAttribute("x"),wxml->FloatAttribute("y")); }else if(!strcmp(name,"npc")){ - earth.back()->addNPC(wxml->FloatAttribute("x"),wxml->FloatAttribute("y")); + if(wxml->QueryFloatAttribute("x",&spawnx) != XML_NO_ERROR) + earth.back()->addNPC(getRand() % earth.back()->getTheWidth() / 2.0f,100); + else + earth.back()->addNPC(wxml->FloatAttribute("x"),wxml->FloatAttribute("y")); + if(wxml->Attribute("name")){ delete[] earth.back()->npc.back()->name; earth.back()->npc.back()->name = new char[strlen(wxml->Attribute("name"))+1]; @@ -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); @@ -815,9 +816,12 @@ DONE: case SDLK_RIGHT: player->inv->sel++; break; - case SDLK_f: + case SDLK_l: player->light^=true; break; + case SDLK_f: + currentWorld->addLight({player->loc.x + SCREEN_WIDTH/2, player->loc.y},{1.0f,1.0f,1.0f}); + break; default: break; } diff --git a/src/world.cpp b/src/world.cpp index e97ec56..e66fb0d 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -669,7 +669,7 @@ LOOP2: glActiveTexture(GL_TEXTURE0); bgTex->bindNext(); - GLfloat pointArray[light.size()][2]; + GLfloat pointArray[light.size() + (int)p->light][2]; for(uint w = 0; w < light.size(); w++){ pointArray[w][0] = light[w].loc.x - offset.x; pointArray[w][1] = light[w].loc.y; @@ -680,15 +680,18 @@ LOOP2: glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); glUniform1f(glGetUniformLocation(shaderProgram, "amb"), float(shade+50.0f)/100.0f); if(p->light){ - glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 1); - glUniform2f(glGetUniformLocation(shaderProgram, "lightLocation"), p->loc.x - offset.x+SCREEN_WIDTH/2, p->loc.y); - glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); - }else if(!light.size()){ + //glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 1); + //glUniform2f(glGetUniformLocation(shaderProgram, "lightLocation"), p->loc.x - offset.x+SCREEN_WIDTH/2, p->loc.y); + //glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + pointArray[light.size()+1][0] = (float)(p->loc.x + SCREEN_WIDTH/2); + pointArray[light.size()+1][1] = (float)(p->loc.y); + } + if(light.size()+(int)p->light == 0){ glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 0); }else{ - glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), light.size()); - glUniform2fv(glGetUniformLocation(shaderProgram, "lightLocation"), light.size(), (GLfloat *)&pointArray); - glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + glUniform1i (glGetUniformLocation(shaderProgram, "numLight"), light.size()+(int)p->light); + glUniform2fv(glGetUniformLocation(shaderProgram, "lightLocation"), light.size()+(int)p->light, (GLfloat *)&pointArray); + glUniform3f (glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); } glBegin(GL_QUADS); @@ -770,11 +773,9 @@ LOOP2: cline[i].y-=(yoff-DRAW_Y_OFFSET); } //glEnd(); - //glUseProgram(0); + glUseProgram(0); glDisable(GL_TEXTURE_2D); - //glUseProgram(0); - /* * Draw non-structure entities. */ |