aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog7
-rw-r--r--config/items.xml2
-rw-r--r--include/Quest.h4
-rw-r--r--src/Quest.cpp24
-rw-r--r--src/gameplay.cpp17
-rw-r--r--src/inventory.cpp22
-rw-r--r--src/ui.cpp29
-rw-r--r--xml/playerSpawnHill1.xml6
-rw-r--r--xml/playerSpawnHill1_Building1.xml9
9 files changed, 79 insertions, 41 deletions
diff --git a/Changelog b/Changelog
index 5a94cac..e8a0605 100644
--- a/Changelog
+++ b/Changelog
@@ -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;
diff --git a/src/ui.cpp b/src/ui.cpp
index 5adb7b5..7c73192 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -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>