diff options
-rw-r--r-- | Changelog | 7 | ||||
-rw-r--r-- | config/items.xml | 2 | ||||
-rw-r--r-- | include/Quest.h | 4 | ||||
-rw-r--r-- | src/Quest.cpp | 24 | ||||
-rw-r--r-- | src/gameplay.cpp | 17 | ||||
-rw-r--r-- | src/inventory.cpp | 22 | ||||
-rw-r--r-- | src/ui.cpp | 29 | ||||
-rw-r--r-- | xml/playerSpawnHill1.xml | 6 | ||||
-rw-r--r-- | xml/playerSpawnHill1_Building1.xml | 9 |
9 files changed, 79 insertions, 41 deletions
@@ -632,3 +632,10 @@ - partially fixed text drawing - XML'd quest checking, working on quest requirements - worked on XML'ing villages + +2/9/2016: +========= + + - quests can require one item for completion + - better-er text drawing + - can set world themes through XML diff --git a/config/items.xml b/config/items.xml index 02d199e..02382d6 100644 --- a/config/items.xml +++ b/config/items.xml @@ -1,7 +1,7 @@ <?xml version="1.0"?> <item name="Debug" type="Tool" maxStackSize="1" width="1" height="1" sprite="assets/items/ITEM_TEST.png" /> -<item name="Dank Maymay" type="Tool" maxStackSize="420" width="10" height="10" sprite="assets/items/ITEM_TEST.png" /> +<item name="Dank MayMay" type="Tool" maxStackSize="420" width="10" height="10" sprite="assets/items/ITEM_TEST.png" /> <item name="Your Bag" type="Equip" maxStackSize="1" width="5" height="5" sprite="assets/items/ITEM_TEST.png" /> <item name="Flashlight" type="Tool" maxStackSize="1" width="4" height="8" sprite="assets/items/flashlight_off.png" /> <item name="Wood Sword" type="Sword" maxStackSize="1" width="4" height="10" sprite="assets/items/SWORD_WOOD.png" /> diff --git a/include/Quest.h b/include/Quest.h index 7ba77c8..388b14d 100644 --- a/include/Quest.h +++ b/include/Quest.h @@ -55,13 +55,13 @@ public: * that gave the quest originally.
*/
- int finish(const char *t,void *completer);
+ int finish(std::string t);
/**
* Returns true if this handler is currently taking the quest.
*/
- bool hasQuest(const char *t);
+ bool hasQuest(std::string t);
};
#endif // QUEST_H
diff --git a/src/Quest.cpp b/src/Quest.cpp index 0151706..ac18021 100644 --- a/src/Quest.cpp +++ b/src/Quest.cpp @@ -1,5 +1,9 @@ #include <Quest.h>
+#include <entities.h>
+
+extern Player *player;
+
int QuestHandler::assign(const char *t){
return strcmp(t,"h");
}
@@ -8,16 +12,22 @@ int QuestHandler::drop(const char *t){ return strcmp(t,"h");
}
-int QuestHandler::finish(const char *t,void *completer){
- return strncmp(t,(char *)completer,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;
+ }
+ }
+ 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;
}
diff --git a/src/gameplay.cpp b/src/gameplay.cpp index 5633eb8..bceb811 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -82,10 +82,9 @@ int commonAIFunc(NPC *speaker){ player->qh.current.push_back(tmp); }else if((qname = oxml->Attribute("check"))){ - if(player->qh.hasQuest(qname)){ - ui::dialogBox(speaker->name,NULL,false,"Nice meme"); - ui::waitForDialog(); - return 0; + if(player->qh.hasQuest(qname) && player->qh.finish(qname)){ + player->qh.finish(qname); + goto CONT; }else{ oldidx = speaker->dialogIndex; speaker->dialogIndex = oxml->UnsignedAttribute("fail"); @@ -96,7 +95,9 @@ int commonAIFunc(NPC *speaker){ oxml = oxml->NextSiblingElement(); } } - + +CONT: + /* * Handle any 'give' requests. */ @@ -152,7 +153,7 @@ int commonAIFunc(NPC *speaker){ * Get the player's choice, then set the XMLElement to the option's block. */ - ui::dialogBox(speaker->name,optstr.c_str(),false,exml->GetText()); + ui::dialogBox(speaker->name,optstr.c_str(),false,exml->GetText()+1); ui::waitForDialog(); if(ui::dialogOptChosen) @@ -161,12 +162,12 @@ int commonAIFunc(NPC *speaker){ while(!dopt.empty()) dopt.pop_back(); }else{ - + /* * No options - simply print the text. */ - ui::dialogBox(speaker->name,"",false,exml->GetText()); + ui::dialogBox(speaker->name,NULL,false,exml->GetText()); ui::waitForDialog(); } diff --git a/src/inventory.cpp b/src/inventory.cpp index 93bdeb6..d52dbe8 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -53,22 +53,38 @@ int Inventory::addItem(std::string name,uint count){ int Inventory::takeItem(std::string name,uint count){ unsigned int id = 999999; + + /* + * Name to ID lookup + */ + for(unsigned int i=0;i<itemMap.size();i++){ if(itemMap[i]->name == name){ id = i; break; } } + + if(id == 999999) + return -1; + + /* + * Inventory lookup + */ + for(unsigned int i=0;i<items.size();i++){ if(items[i].id == id){ if(count > items[i].count) - items.erase(items.begin()+i); - else + return -(items[i].count - count); + else{ items[i].count -= count; + if(!items[i].count) + items.erase(items.begin()+i); + } return 0; } } - return -1; + return -2; } static GLuint *itemtex; @@ -258,17 +258,15 @@ namespace ui { * Draws a character at the specified coordinates, aborting if the character is unknown. */ - vec2 putChar(float xx,float yy,char c){ + vec2 putChar(float x,float y,char c){ vec2 c1,c2; - int x = xx, y = yy; - /* * Get the width and height of the rendered character. */ - c1={x+ftexbl[c-33].x, - y+ftexbl[c-33].y}; + c1={(float)floor(x)+ftexbl[c-33].x, + (float)floor(y)+ftexbl[c-33].y}; c2=ftexwh[c-33]; /* @@ -316,7 +314,10 @@ namespace ui { if(s[i] == ' ') i++; } - if(s[i] == '\n' || s[i] == '\r' || s[i] == '\t'){ + if(s[i] == '\n'){ + yo-=fontSize*1.05; + xo=x; + }else if(s[i] == '\r' || s[i] == '\t'){ /*if(s[i] == '\n'){ yo-=fontSize*1.05; xo=x; @@ -325,7 +326,7 @@ namespace ui { }else if(s[i]=='\b'){ // Handle backspaces? xo-=add.x; }else{ - add=putChar(xo,yo,s[i]); + add=putChar(floor(xo),floor(yo),s[i]); xo+=add.x; yo+=add.y; } @@ -334,12 +335,10 @@ namespace ui { return xo; // i.e. the string width } - float putStringCentered(const float xx,const float yy,const char *s){ + float putStringCentered(const float x,const float y,const char *s){ unsigned int i = 0; float width = 0; - int x = xx,y = yy; - do{ if(s[i]=='\n'){ // Handle newlines // TODO @@ -353,7 +352,7 @@ namespace ui { } }while(s[++i]); - putString(x-width/2,y,s); + putString(floor(x-width/2),y,s); return width; } @@ -530,15 +529,15 @@ namespace ui { } void importantText(const char *text,...){ va_list textArgs; - + //if(!player->ground)return; - + memset(dialogBoxText,0,512); - + va_start(textArgs,text); vsnprintf(dialogBoxText,512,text,textArgs); va_end(textArgs); - + dialogBoxExists = true; dialogImportant = true; //toggleBlack(); diff --git a/xml/playerSpawnHill1.xml b/xml/playerSpawnHill1.xml index cf42cda..387e1a9 100644 --- a/xml/playerSpawnHill1.xml +++ b/xml/playerSpawnHill1.xml @@ -31,8 +31,8 @@ And it wasn't stormy. </text> <text id="2" > - <quest check="Your First Quest" fail="3" /> Niice. + <quest check="Your First Quest" fail="3" /> </text> <text id="3"> @@ -43,9 +43,7 @@ And it wasn't stormy. <Dialog name="Johnny"> <text id="0" nextid="1" pause="true" > Sup bro! Have a quest. To complete it, just go talk to Ralph again. - <quest assign="Your First Quest" > - Dank Maymay - </quest> + <quest assign="Your First Quest" >Dank MayMay</quest> </text> <text id="1" nextid="1" pause="true" > diff --git a/xml/playerSpawnHill1_Building1.xml b/xml/playerSpawnHill1_Building1.xml index 54d217b..5c2b723 100644 --- a/xml/playerSpawnHill1_Building1.xml +++ b/xml/playerSpawnHill1_Building1.xml @@ -3,6 +3,13 @@ <style background="1" bgm="assets/music/theme_jazz.wav" /> <generation type="Random" width="300" /> - <npc name="Bob" /> + <npc name="Bob" hasDialog="true" /> </IndoorWorld> + +<Dialog name="Bob"> + <text id="0"> + Hey. Have a Dank Maymay :) + <give id="Dank MayMay" count="1" /> + </text> +</Dialog> |