diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Quest.cpp | 54 | ||||
-rw-r--r-- | src/gameplay.cpp | 17 | ||||
-rw-r--r-- | src/inventory.cpp | 29 |
3 files changed, 75 insertions, 25 deletions
diff --git a/src/Quest.cpp b/src/Quest.cpp index ac18021..535afc5 100644 --- a/src/Quest.cpp +++ b/src/Quest.cpp @@ -4,21 +4,59 @@ extern Player *player;
-int QuestHandler::assign(const char *t){
- return strcmp(t,"h");
+int QuestHandler::assign(std::string title,std::string desc,std::string req){
+ Quest tmp;
+ char *tok;
+
+ tmp.title = title;
+ tmp.desc = desc;
+
+ std::unique_ptr<char[]> buf (new char[req.size()]);
+
+ strcpy(buf.get(),req.c_str());
+ tok = strtok(buf.get(),"\n\r\t,");
+ tmp.need.push_back({"\0",0});
+
+ while(tok){
+ if(tmp.need.back().name != "\0"){
+ tmp.need.back().n = atoi(tok);
+ tmp.need.push_back({"\0",0});
+ }else
+ tmp.need.back().name = tok;
+
+ tok = strtok(NULL,"\n\r\t,");
+ }
+
+ tmp.need.pop_back();
+ current.push_back(tmp);
+
+ return 0;
}
-int QuestHandler::drop(const char *t){
- return strcmp(t,"h");
+int QuestHandler::drop(std::string title){
+ for(unsigned int i=0;i<current.size();i++){
+ if(current[i].title == title){
+ current.erase(current.begin()+i);
+ return 0;
+ }
+ }
+ return -1;
}
int QuestHandler::finish(std::string t){
for(unsigned int i=0;i<current.size();i++){
if(current[i].title == t){
- if(!player->inv->takeItem(current[i].need.back(),1)){
- current.erase(current.begin()+i);
- return 1;
- }else return 0;
+ for(auto &n : current[i].need){
+ if(player->inv->hasItem(n.name) < n.n)
+ return 0;
+ }
+
+ for(auto &n : current[i].need){
+ player->inv->takeItem(n.name,n.n);
+ }
+
+ current.erase(current.begin()+i);
+ return 1;
}
}
return 0;
diff --git a/src/gameplay.cpp b/src/gameplay.cpp index bceb811..e252c26 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -69,21 +69,12 @@ int commonAIFunc(NPC *speaker){ if((oxml = exml->FirstChildElement("quest"))){ const char *qname; - Quest tmp; + while(oxml){ - if((qname = oxml->Attribute("assign"))){ - tmp.title = qname; - tmp.desc = "None"; - tmp.reward = (struct item_t){0,0}; - - if(oxml->GetText()){ - tmp.need.push_back(oxml->GetText()); - } - - player->qh.current.push_back(tmp); - }else if((qname = oxml->Attribute("check"))){ + if((qname = oxml->Attribute("assign"))) + player->qh.assign(qname,"None",(std::string)oxml->GetText()); + else if((qname = oxml->Attribute("check"))){ if(player->qh.hasQuest(qname) && player->qh.finish(qname)){ - player->qh.finish(qname); goto CONT; }else{ oldidx = speaker->dialogIndex; diff --git a/src/inventory.cpp b/src/inventory.cpp index d52dbe8..b32b56f 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -13,7 +13,7 @@ static bool swing = false; static vec2 itemLoc; Mix_Chunk* swordSwing; -std::vector<Item *> itemMap; +static std::vector<Item *> itemMap; void items(void){ XMLDocument xml; @@ -32,7 +32,7 @@ void items(void){ itemMap.back()->texloc = exml->Attribute("sprite"); exml = exml->NextSiblingElement(); - } + } } int Inventory::addItem(std::string name,uint count){ @@ -44,7 +44,7 @@ int Inventory::addItem(std::string name,uint count){ return 0; } } - items.push_back((item_t){i,count}); + items.push_back((item_t){count,i}); return 0; } } @@ -87,6 +87,27 @@ int Inventory::takeItem(std::string name,uint count){ return -2; } +int Inventory::hasItem(std::string name){ + unsigned int id = 999999; + + for(unsigned int i=0;i<itemMap.size();i++){ + if(itemMap[i]->name == name){ + id = i; + break; + } + } + + if(id == 999999) + return 0; + + for(auto &i : items){ + if(i.id == id) + return i.count; + } + + return 0; +} + static GLuint *itemtex; void itemDraw(Player *p,uint id); @@ -227,7 +248,7 @@ void Inventory::draw(void){ } glEnd(); glDisable(GL_TEXTURE_2D); - ui::putText(r.end.x-(itemWide/2),r.end.y-(itemWide*.9),"%s",itemMap[items[a].id]->name); + ui::putText(r.end.x-(itemWide/2),r.end.y-(itemWide*.9),"%s",itemMap[items[a].id]->name.c_str()); ui::putText(r.end.x-(itemWide/2)+(itemWide*.85),r.end.y-(itemWide/2),"%d",items[a].count); } |