aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Quest.cpp54
-rw-r--r--src/gameplay.cpp17
-rw-r--r--src/inventory.cpp29
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);
}