]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
arena/page fixes
authorClyne Sullivan <tullivan99@gmail.com>
Mon, 2 May 2016 12:49:17 +0000 (08:49 -0400)
committerClyne Sullivan <tullivan99@gmail.com>
Mon, 2 May 2016 12:49:17 +0000 (08:49 -0400)
Changelog
include/common.hpp
include/mob.hpp
include/texture.hpp
include/ui.hpp
include/world.hpp
main.cpp
src/mob.cpp
src/ui.cpp
src/world.cpp
xml/playerSpawnHill1.xml

index 5e967269edc75b09f0deb6d3a48acb83f082b238..711829083ffbb4e3ff477d027bbe15d59d099332 100644 (file)
--- a/Changelog
+++ b/Changelog
                - removed threadpool, gameplay
                - redoing inventory system
        - added -g flag
+
+       ~ 7 months of Changelog
+
+4/28/2016:
+==========
+
+       - fixed arenas, improved world switching
+       - continued revising inventory
+
+5/2/2016:
+=========
+
+       - fixed arena speed bug
+       - birds don't 'hit' the world boundaries
+       - fixed page drawing
+       - items are unique now
+       - added swords and bows
+       - render is now separated from the main loop
+
+       ~8,100 lines of code
index e607c12b50d19c9e435698658327c92330edd649..b9e0e7195c47fc93f5559ff2a513700b4624e2bd 100644 (file)
@@ -154,7 +154,6 @@ void safeSetColor(int r,int g,int b);
  */
 void safeSetColorA(int r,int g,int b,int a);
 
-
 // use our own millis function if we can, windows doesn't like <chrono> at the moment...
 #ifdef __WIN32__
 #define millis() SDL_GetTicks()
@@ -174,4 +173,14 @@ const char *readFile(const char *path);
 // aborts the program, printing the given error
 void UserError(std::string reason);
 
+namespace std {
+       template<class T>
+       constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
+               if (v < hi)
+                       return (v > lo) ? v : lo;
+               else
+                       return (v < hi) ? v : hi;
+       }
+}
+
 #endif // COMMON_H
index 48be4565da112bc7cee96169d9c891d31fcbe589..adaecb4b4846167fa81b9e4662c953be01b66978 100644 (file)
@@ -40,6 +40,7 @@ constexpr Mob *Mobp(Entity *e) {
 class Page : public Mob {
 private:
     std::string pageTexPath;
+    GLuint pageTexture;
 public:
     Page(void);
 
index 59358f25bd790573d2460b00dd45eaf7661104b4..22a245960ba4c1b8faeff28d60ce94f313c06d85 100644 (file)
  * When defined, DEBUG allows extra messages to be printed to the terminal for
  * debugging purposes.
  */
-
 #define DEBUG
 
 /**
  * Texture functions are given a namespace for better organization.
  */
-
 namespace Texture {
 
        /**
index 7cee8854044a60e8e32389e561644e9ccc94be85..4c5f2c20150c95c992502471488909589800db08 100644 (file)
@@ -136,7 +136,7 @@ namespace ui {
        void waitForDialog(void);
 
        bool pageExists(void);
-       void drawPage(std::string path);
+       void drawPage(const GLuint& tex);
 
        void dontTypeOut(void);
        /*
index 0aea879149f488cce8a3773c67435cad368aa97c..200b0654ff8448a2b4ff08240bd7335283f8768e 100644 (file)
@@ -180,6 +180,9 @@ public:
        // gets the world's width in TODO
        int getTheWidth(void) const;
 
+       // gets the starting x coordinate of the world
+       float getWorldStart(void) const;
+
        // gets a pointer to the most recently added light
        Light *getLastLight(void);
 
@@ -305,6 +308,7 @@ public:
  * transported to a temporary world with the player, and the Mob will be
  * killed upon exiting the arena.
  */
+
 class Arena : public World {
 private:
 
@@ -323,21 +327,18 @@ public:
        WorldSwitchInfo exitArena(Player *p);
 };
 
-
 std::string getWorldWeatherStr(WorldWeather ww);
 
 /**
  * Loads the player into the world created by the given XML file. If a world is
  * already loaded it will be saved before the transition is made.
  */
-
 World *loadWorldFromXML(std::string path);
 
 /**
  * Loads the player into the XML-scripted world, but does not save data from the
  * previous world if one was loaded.
  */
-
 World *loadWorldFromXMLNoSave(std::string path);
 
 World *loadWorldFromPtr(World *ptr);
index 4db0579493fbfb281e417b39d8b114a2cb55c940..ba60fdda1c376d28f75816d0af9c23f8ddb1f87d 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -288,10 +288,11 @@ void mainLoop(void){
                        debugDiv=0;
 
                        fps = 1000 / game::time::getDeltaTime();
-                       if (!(debugDiv % 10))
-                               debugY = player->loc.y;
+                       debugY = player->loc.y;
                }
        }
+
+       SDL_Delay(1);
 }
 
 void render() {
index e98a648632cfcb8ac3c6021d8540eeaeca918adb..a9015f96de11899c9c43ebbcbd1396cd97c1a4f8 100644 (file)
@@ -2,6 +2,8 @@
 #include <ui.hpp>
 #include <world.hpp>
 
+extern World *currentWorld;
+
 Mob::Mob(void)
 {
     type = MOBT;
@@ -18,6 +20,7 @@ Page::Page(void) : Mob()
     width = HLINES(6);
     height = HLINES(4);
     tex = TextureIterator({"assets/items/ITEM_PAGE.png"});
+    pageTexture = 0;
 }
 
 void Page::act(void)
@@ -25,7 +28,7 @@ void Page::act(void)
     if (player->loc.x > loc.x - 100 && player->loc.x < loc.x + 100 && isInside(ui::mouse) &&
         (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT))) {
         std::thread([this](void){
-            ui::drawPage(pageTexPath);
+            ui::drawPage(pageTexture);
             ui::waitForDialog();
             die();
         }).detach();
@@ -45,6 +48,7 @@ void Page::createFromXML(const XMLElement *e)
     if (e->QueryFloatAttribute("x", &Xlocx) == XML_NO_ERROR)
         loc.x = Xlocx;
     pageTexPath = e->StrAttribute("id");
+    pageTexture = Texture::loadTexture(pageTexPath);
 }
 
 Door::Door(void) : Mob()
@@ -79,7 +83,7 @@ Cat::Cat(void) : Mob()
 {
     ridable = true;
     aggressive = false;
-    maxHealth = health = 1000;
+    maxHealth = health = 100000;
     width  = HLINES(19);
     height = HLINES(15);
     tex = TextureIterator({"assets/cat.png"});
@@ -143,22 +147,24 @@ extern bool inBattle;
 void Rabbit::act(void)
 {
     static int direction = 0;
-    if (!--actCounter) {
-        actCounter = actCounterInitial;
-        direction = (randGet() % 3 - 1);       //sets the direction to either -1, 0, 1
-        if (direction == 0)
-            ticksToUse /= 2;
-        vel.x *= direction;
-    }
 
-    if (inBattle)
+    if (inBattle) {
         die();
+    } else {
+        if (!--actCounter) {
+            actCounter = actCounterInitial;
+            direction = (randGet() % 3 - 1);   //sets the direction to either -1, 0, 1
+            if (direction == 0)
+                ticksToUse /= 2;
+            vel.x *= direction;
+        }
 
-    if (ground && direction) {
-        ground = false;
-        vel.y = .15;
-        loc.y += HLINES(0.25f);
-        vel.x = 0.05f * direction;
+        if (ground && direction) {
+            ground = false;
+            vel.y = .15;
+            loc.y += HLINES(0.25f);
+            vel.x = 0.05f * direction;
+        }
     }
 }
 
@@ -194,15 +200,21 @@ Bird::Bird(void) : Mob()
 void Bird::act(void)
 {
     static bool direction = false;
-    auto deltaTime = game::time::getDeltaTime();
+    static const float wstart = currentWorld->getWorldStart();
+
     if (!--actCounter) {
         actCounter = actCounterInitial;
         direction ^= 1;
     }
 
+    if (loc.x > -wstart - HLINES(10.0f))
+        loc.x = wstart + HLINES(10.0f);
+    else if (loc.x < wstart + HLINES(10.0f))
+        loc.x = -wstart - HLINES(10.0f);
+
     if (loc.y <= initialY)
-        vel.y = 0.02f * deltaTime;
-    vel.x = (direction ? -0.02f : 0.02f) * deltaTime;
+        vel.y = 0.3f;
+    vel.x = direction ? -0.3f : 0.3f;
 }
 
 bool Bird::bindTex(void)
index b94b0f3094cfe3bc6e2f81abd294cb19535b3532..bedccabf6bd120f3f8a80c8f76b12607c2dc1bce 100644 (file)
@@ -605,8 +605,8 @@ namespace ui {
        }
 
 
-       void drawPage(std::string path) {
-               pageTex = Texture::loadTexture(path);
+       void drawPage(const GLuint& tex) {
+               pageTex = tex;
                pageTexReady = true;
        }
 
index a7c2fdfc278ec59a6da87b87626e4e769f2b42ae..477432c8e7f881105b38f284429847f8bbc6acab 100644 (file)
@@ -187,16 +187,16 @@ generate(int width)
 
     // give every GROUND_HILLINESSth entry a groundHeight value
     for (; wditer < std::end(worldData); wditer += GROUND_HILLINESS)
-        (*(wditer - GROUND_HILLINESS)).groundHeight = (*wditer).groundHeight + (randGet() % 8 - 4);
+        wditer[-static_cast<int>(GROUND_HILLINESS)].groundHeight = wditer[0].groundHeight + (randGet() % 8 - 4);
 
     // create slopes from the points that were just defined, populate the rest of the WorldData structure
     for (wditer = std::begin(worldData) + 1; wditer < std::end(worldData); wditer++){
         auto w = &*(wditer);
 
         if (w->groundHeight != 0)
-            geninc = ((w + static_cast<int>(GROUND_HILLINESS))->groundHeight - w->groundHeight) / GROUND_HILLINESS;
+            geninc = (w[static_cast<int>(GROUND_HILLINESS)].groundHeight - w->groundHeight) / GROUND_HILLINESS;
 
-        w->groundHeight   = fmin(fmax((w - 1)->groundHeight + geninc, GROUND_HEIGHT_MINIMUM), GROUND_HEIGHT_MAXIMUM);
+        w->groundHeight   = std::clamp(w[-1].groundHeight + geninc, GROUND_HEIGHT_MINIMUM, GROUND_HEIGHT_MAXIMUM);
         w->groundColor    = randGet() % 32 / 8;
         w->grassUnpressed = true;
         w->grassHeight[0] = (randGet() % 16) / 3 + 2;
@@ -555,7 +555,7 @@ singleDetect(Entity *e)
                                        break;
                                case MOBT:
                                        killed = "mob";
-                    // TODO
+                                       mob.erase(std::find(std::begin(mob), std::end(mob), e));
                                        break;
                                case OBJECTT:
                                        killed = "object";
@@ -583,8 +583,7 @@ singleDetect(Entity *e)
         e->handleHits();
 
                // calculate the line that this entity is currently standing on
-               l = static_cast<int>(fmax((e->loc.x + e->width / 2 - worldStart) / game::HLINE, 0));
-               l = static_cast<int>(fmin(l, lineCount - 1));
+        l = std::clamp(static_cast<int>((e->loc.x + e->width / 2 - worldStart) / game::HLINE), 0, static_cast<int>(lineCount - 1));
 
                // if the entity is under the world/line, pop it back to the surface
                if (e->loc.y < worldData[l].groundHeight) {
@@ -614,9 +613,9 @@ singleDetect(Entity *e)
                }
 
                // insure that the entity doesn't fall off either edge of the world.
-               if (e->loc.x < worldStart) {
+        if (e->loc.x < worldStart) {
                        e->vel.x = 0;
-                       e->loc.x = worldStart + game::HLINE / 2;
+                       e->loc.x = worldStart + HLINES(0.5f);
                } else if (e->loc.x + e->width + game::HLINE > worldStart + worldStart * -2) {
                        e->vel.x = 0;
                        e->loc.x = worldStart + worldStart * -2 - e->width - game::HLINE;
@@ -766,6 +765,12 @@ getTheWidth(void) const
        return (worldStart * -2);
 }
 
+float World::
+getWorldStart(void) const
+{
+    return static_cast<float>(worldStart);
+}
+
 /**
  * Get a pointer to the most recently created light.
  * Meant to be non-constant.
@@ -834,6 +839,12 @@ getStructurePos(int index)
     return build[index]->loc;
 }
 
+template<typename T>
+void appVal(const T &x, std::string &str)
+{
+    str.append(std::to_string(static_cast<int>(x)) + "\n");
+}
+
 /**
  * Saves world data to a file.
  */
@@ -846,22 +857,22 @@ void World::save(void){
 
     // save npcs
        for (auto &n : npc) {
-               data.append(std::to_string(n->dialogIndex) + "\n");
-               data.append(std::to_string((int)n->loc.x) + "\n");
-               data.append(std::to_string((int)n->loc.y) + "\n");
+        appVal(n->dialogIndex, data);
+        appVal(n->loc.x, data);
+        appVal(n->loc.y, data);
        }
 
     // save structures
        for (auto &b : build) {
-               data.append(std::to_string((int)b->loc.x) + "\n");
-               data.append(std::to_string((int)b->loc.y) + "\n");
+        appVal(b->loc.x, data);
+        appVal(b->loc.y, data);
        }
 
     // save mobs
        for (auto &m : mob) {
-               data.append(std::to_string((int)m->loc.x) + "\n");
-               data.append(std::to_string((int)m->loc.y) + "\n");
-               data.append(std::to_string((int)m->isAlive()) + "\n");
+        appVal(m->loc.x, data);
+        appVal(m->loc.y, data);
+               appVal(m->isAlive(), data);
        }
 
     // wrap up
@@ -870,6 +881,19 @@ void World::save(void){
        out.close();
 }
 
+template<typename T>
+bool getVal(T &x, std::istringstream &iss)
+{
+    std::string str;
+    std::getline(iss, str);
+
+    if (str == "dOnE")
+        return false;
+
+    x = std::stoi(str);
+    return true;
+}
+
 void World::load(void){
        std::string save, data, line;
        const char *filedata;
@@ -880,42 +904,29 @@ void World::load(void){
        std::istringstream iss (data);
 
        for(auto &n : npc){
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               if ((n->dialogIndex = std::stoi(line)) != 9999)
+        if (!getVal(n->dialogIndex, iss)) return;
+               if (n->dialogIndex != 9999)
                        n->addAIFunc(false);
 
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               n->loc.x = std::stoi(line);
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               n->loc.y = std::stoi(line);
+        if (!getVal(n->loc.x, iss)) return;
+        if (!getVal(n->loc.y, iss)) return;
        }
 
        for(auto &b : build){
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               b->loc.x = std::stoi(line);
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               b->loc.y = std::stoi(line);
+        if (!getVal(b->loc.x, iss)) return;
+        if (!getVal(b->loc.y, iss)) return;
        }
 
+    bool alive = true;
        for(auto &m : mob){
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               m->loc.x = std::stoi(line);
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-               m->loc.y = std::stoi(line);
-               std::getline(iss,line);
-               if(line == "dOnE")return;
-        if (!std::stoi(line))
+        if (!getVal(m->loc.x, iss)) return;
+        if (!getVal(m->loc.y, iss)) return;
+               if (!getVal(alive, iss)) return;
+               if (!alive)
             m->die();
        }
 
-       while(std::getline(iss,line)){
+       while (std::getline(iss,line)) {
                if(line == "dOnE")
                        break;
        }
index 30bbbbdcd628dfa045ec24b36a4138f536116379..785758de5e3371088794e5afe5bfc9a13dd4238f 100644 (file)
@@ -8,7 +8,7 @@
        <hill peakx="0" peaky="1000" width="50" />
 
        <rabbit x="300" aggressive="true" health="100" />
-       <bird />
+       <bird y="500"/>
        <cat />
 
        <trigger x="-300" id="Test" />
@@ -17,7 +17,7 @@
        <npc name="Johnny" hasDialog="false" x="300" />
        <npc name="Big Dave" hasDialog="true" x="300" />
 
-       <page x="-200" id="assets/door.png" />
+       <page x="-200" id="assets/pages/gootaGoFast.png" />
 
        <village name="Swagville U.S.A.">
                <structure type="0" x="-300" inside="playerSpawnHill1_Building1.xml"/>