diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2016-05-31 08:49:48 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2016-05-31 08:49:48 -0400 |
commit | b22860234ff7991c851211042a9832d88ccbb958 (patch) | |
tree | 255f72ca00a3567c69b7f8f0bc7889aa3b12689d /src/entities.cpp | |
parent | 7dd64863c9ca613cf6969442f621849762b20115 (diff) |
entitys can modify xml
Diffstat (limited to 'src/entities.cpp')
-rw-r--r-- | src/entities.cpp | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/src/entities.cpp b/src/entities.cpp index 550748a..18c91ed 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -15,6 +15,7 @@ extern World *currentWorld; // main.cpp extern unsigned int loops; // main.cpp extern std::string xmlFolder; +extern XMLDocument currentXMLDoc; // a dynamic array of pointers to the NPC's that are being assigned the preloads std::vector<NPC *> aipreload; @@ -24,52 +25,17 @@ const unsigned int PLAYER_INV_SIZE = 43; // the size of an NPC's inventory const unsigned int NPC_INV_SIZE = 3; -static const unsigned int RAND_DIALOG_COUNT = 14; -const char *randomDialog[RAND_DIALOG_COUNT] = { - "What a beautiful day it is.", - "Have you ever went fast? I have.", - "I heard if you complete a quest, you'll get a special reward.", - "How much wood could a woodchuck chuck if a woodchuck could chuck wood?", - "I don\'t think anyone has ever been able to climb up that hill.", - "If you ever see a hole in the ground, watch out; it could mean the end for you.", - "Did you know this game has over 5000 lines of code? I didn\'t. I didn't even know I was in a game until now...", - "HELP MY CAPS LOCK IS STUCK", - "You know, if anyone ever asked me who I wanted to be when I grow up, I would say Abby Ross.", - "I want to have the wallpaper in our house changed. It doesn\'t really fit the environment.", - "Frig.", - "The sine of theta equals the opposite over the hdaypotenuese.", - "Did you know the developers spelt brazier as brazzier.", - "What's a bagel? I don't know because I'm mormon" -}; - -void randGetomName(Entity *e) -{ - unsigned int tempNum,max=0; - char *bufs; - - std::ifstream names ("assets/names_en-us",std::ios::in); - - names.seekg(0,names.beg); - - bufs = new char[32]; - - for(;!names.eof();max++) - names.getline(bufs,32); +static std::vector<std::string> randomDialog (readFileA("assets/dialog_en-us")); - tempNum = rand() % max; - names.seekg(0,names.beg); - - for(unsigned int i=0;i<tempNum;i++) - names.getline(bufs,32); - - names.close(); +void getRandomName(Entity *e) +{ + auto names = readFileA("assets/names_en-us"); + auto name = names[randGet() % names.size()]; // gender is a binary construct - e->gender = (bufs[0] == 'm') ? MALE : FEMALE; - - strcpy(e->name, bufs + 1); + e->gender = (name[0] == 'm') ? MALE : FEMALE; - delete[] bufs; + e->name = &name[1]; } Entity::Entity(void) @@ -101,7 +67,6 @@ Entity::Entity(void) hitDuration = maxHitDuration = 0; inv = nullptr; - name = nullptr; } // spawns the entity you pass to it based off of coords and global entity settings @@ -114,11 +79,10 @@ void Entity::spawn(float x, float y) health = maxHealth = 1; // generate a name - name = new char[32]; if (type == MOBT) - strncpy(name, "mob", 3); + name = "mob"; else - randGetomName(this); + getRandomName(this); setCooldown(0); } @@ -168,6 +132,11 @@ void Entity::die(void) { alive = false; health = 0; + + if (xmle) { + xmle->SetAttribute("alive", false); + currentXMLDoc.SaveFile(currentXML.c_str(), false); + } } bool Entity::isAlive(void) const @@ -218,7 +187,12 @@ Player::Player() : Entity() Player::~Player() { delete inv; - delete[] name; +} + +void Player::createFromXML(XMLElement *e, World *w=nullptr) +{ + (void)e; + (void)w; } NPC::NPC() : Entity() @@ -237,7 +211,7 @@ NPC::NPC() : Entity() tex = TextureIterator({"assets/NPC.png"}); inv = new Inventory(NPC_INV_SIZE); - randDialog = rand() % RAND_DIALOG_COUNT - 1; + randDialog = randGet() % randomDialog.size(); dialogIndex = 0; dialogCount = 0; @@ -249,7 +223,42 @@ NPC::NPC() : Entity() NPC::~NPC() { delete inv; - delete[] name; +} + +void NPC::createFromXML(XMLElement *e, World *w=nullptr) +{ + std::string npcname; + bool dialog; + float spawnx, Xhealth; + unsigned int flooor; + + // spawn at coordinates if desired + if (e->QueryFloatAttribute("x", &spawnx) == XML_NO_ERROR) + spawn(spawnx, 100); + else + spawn(0, 100); + + // name override + if (!(npcname = e->StrAttribute("name")).empty()) + name = npcname; + + // dialog enabling + dialog = false; + if (e->QueryBoolAttribute("hasDialog", &dialog) == XML_NO_ERROR && dialog) + addAIFunc(false); + else + dialogIndex = 9999; + + + if (/*Indoor && */e->QueryUnsignedAttribute("floor", &flooor) == XML_NO_ERROR) + Indoorp(w)->moveToFloor(this, flooor); + + // custom health value + if (e->QueryFloatAttribute("health", &Xhealth) == XML_NO_ERROR) { + health = maxHealth = Xhealth; + } + + xmle = e; } Merchant::Merchant() : NPC() @@ -283,8 +292,6 @@ Merchant::Merchant() : NPC() Merchant::~Merchant() { - //delete inv; - delete[] name; } Structures::Structures() : Entity() @@ -295,7 +302,19 @@ Structures::Structures() : Entity() Structures::~Structures() { - delete[] name; +} + +void Structures::createFromXML(XMLElement *e, World *w) +{ + float spawnx; + + inWorld = w; + inside = e->StrAttribute("inside"); + textureLoc = e->StrAttribute("texture"); + + spawn(static_cast<BUILD_SUB>(e->UnsignedAttribute("type")), + e->QueryFloatAttribute("x", &spawnx) == XML_NO_ERROR ? spawnx : (randGet() % w->getTheWidth() / 2.0f), + 100); } Object::Object() @@ -319,7 +338,12 @@ Object::Object(std::string in, std::string pd) Object::~Object() { - delete[] name; +} + +void Object::createFromXML(XMLElement *e, World *w=nullptr) +{ + (void)e; + (void)w; } void Object::reloadTexture(void) @@ -773,7 +797,7 @@ void Merchant::wander(int timeRun) { void Merchant::interact() { std::thread([this]{ - ui::merchantBox(name, trade[currTrade], ":Accept:Good-Bye", false, toSay->c_str()); + ui::merchantBox(name.c_str(), trade[currTrade], ":Accept:Good-Bye", false, toSay->c_str()); ui::waitForDialog(); // handle normal dialog options |