diff options
Diffstat (limited to 'src/Quest.cpp')
-rw-r--r-- | src/Quest.cpp | 117 |
1 files changed, 49 insertions, 68 deletions
diff --git a/src/Quest.cpp b/src/Quest.cpp index f0be63c..535afc5 100644 --- a/src/Quest.cpp +++ b/src/Quest.cpp @@ -1,90 +1,71 @@ #include <Quest.h>
-/*const Quest QuestList[1] = {
- Quest("Not a quest","Stop",(struct item_t){0,0})
-};*/
+#include <entities.h>
+extern Player *player;
-/*Quest::Quest(const char *t,const char *d,struct item_t r){
- title = new char[strlen(t)+1];
- desc = new char[strlen(d)+1];
- strcpy(title,t);
- strcpy(desc,d);
- memcpy(&reward,&r,sizeof(struct item_t));
-}
+int QuestHandler::assign(std::string title,std::string desc,std::string req){
+ Quest tmp;
+ char *tok;
+
+ tmp.title = title;
+ tmp.desc = desc;
-Quest::~Quest(){
- delete[] title;
- delete[] desc;
- memset(&reward,0,sizeof(struct item_t));
-}*/
+ std::unique_ptr<char[]> buf (new char[req.size()]);
-int QuestHandler::assign(const char *t){
- /*unsigned char i;
- for(i=0;i<current.size();i++){ // Make sure we don't already have this quest
- if(!strcmp(current[i]->title,t)){
-#ifdef DEBUG
- DEBUG_printf("The QuestHandler already has this quest: %s\n",t);
-#endif // DEBUG
- return -2;
- }
+ 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,");
}
- for(i=0;i<0;i++){ // Add the quest (if it really exists)
- if(!strcmp(QuestList[i].title,t)){
- current.push_back(&QuestList[i]);
-#ifdef DEBUG
- DEBUG_printf("Added quest %s, now have %u active quests.\n",t,current.size());
-#endif // DEBUG
- return current.size();
- }
-#ifdef DEBUG
- DEBUG_printf("Finding quest: %s != %s\n",t,QuestList[i].title);
-#endif // DEBUG
- }
-#ifdef DEBUG
- DEBUG_printf("Quest %s does not exist.\n",t);
-#endif // DEBUG*/
- return strcmp(t,"h");
+
+ tmp.need.pop_back();
+ current.push_back(tmp);
+
+ return 0;
}
-int QuestHandler::drop(const char *t){
- /*unsigned char i;
- for(i=0;i<current.size();i++){
- if(!strcmp(current[i]->title,t)){
+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 current.size();
+ return 0;
}
- }*/
- return strcmp(t,"h");
+ }
+ return -1;
}
-int QuestHandler::finish(const char *t,void *completer){
- /*unsigned char i;
- for(i=0;i<current.size();i++){
- if(!strcmp(current[i]->title,t)){
-#ifdef DEBUG
- DEBUG_printf("Completing quest %s.\n",t);
-#endif // DEBUG
- ((Entity *)completer)->inv->addItem(current[i]->reward.id,current[i]->reward.count);
+int QuestHandler::finish(std::string t){
+ for(unsigned int i=0;i<current.size();i++){
+ if(current[i].title == t){
+ 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);
-#ifdef DEBUG
- DEBUG_printf("QuestHandler now has %u active quests.\n",current.size());
-#endif // DEBUG
- return 0;
+ return 1;
}
}
-#ifdef DEBUG
- DEBUG_printf("QuestHandler never had quest %s.\n",t);
-#endif // DEBUG*/
- return strncmp(t,(char *)completer,1);
+ return 0;
}
-bool QuestHandler::hasQuest(const char *t){
- unsigned int i;
- for(i=0;i<current.size();i++){
- if(!strcmp(current[i].title.c_str(),t)){
+bool QuestHandler::hasQuest(std::string t){
+ for(unsigned int i=0;i<current.size();i++){
+ if(current[i].title == t)
return true;
- }
}
return false;
}
|