]> code.bitgloo.com Git - clyne/gamedev.git/commitdiff
cutscenes, arenas
authorClyne Sullivan <tullivan99@gmail.com>
Tue, 17 Nov 2015 13:38:51 +0000 (08:38 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Tue, 17 Nov 2015 13:38:51 +0000 (08:38 -0500)
Changelog
README.md
include/entities.h
include/world.h
main.cpp
src/entities.cpp
src/gameplay.cpp
src/ui.cpp
src/world.cpp

index e967987094604468e747f37575bd46bf2d451197..1a75022354323ff63ca90e4377885889af553b1c 100644 (file)
--- a/Changelog
+++ b/Changelog
        - created a generic object class
        - began death handling stuffs
        - added a quest list in-game
+
+11/13/2015:
+===========
+
+       - began working on cutscene triggers
+       - began working on item dialogs
+
+11/16/2015:
+===========
+
+       - minor bug fixes
+       - began working on arenas
+       - began working on cutscene triggers
+       
+11/17/2015:
+===========
+
+       - created basic arena / arena handling
+       - added entity deletion when an entity dies
+       - fixed errors with typewriter-text
+       - finished cutscene triggers
index 858068f1b8fae52e473ca5173418369036ae03a6..dda1214e9c5b7a84ca12cc5490523904e12c4d3c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
 # gamedev
 
 gamedev is a high school project between drumsetmonkey and tcsullivan written in C++ and using SDL2/OpenGL. The goal of this project is to have a completed commercial-grade video game available to Linux and Windows users. We plan on profiting off of the game once we finish it, so once the game reaches its final stages it may become closed source (however, what was uploaded will stay for others to use as a resource).
-
-Link to story outline: https://docs.google.com/document/d/18cavXmE0MTp2GCAvIABPs61qKblVLSbfOb5zmBXoZJw/edit
\ No newline at end of file
index b590c8d1d7472bd2718322ca23681d2de2d601c7..c2de1b1f63af66817562c08f0d915aef8c3b451c 100644 (file)
@@ -30,7 +30,8 @@ enum GENDER{
 
 enum MOB_SUB {
        MS_RABBIT = 1,
-       MS_BIRD
+       MS_BIRD,
+       MS_TRIGGER
 };
 
 class Entity{
@@ -102,8 +103,10 @@ public:
 
 class Mob : public Entity{
 public:
-       float init_y;
+       double init_y;
+       void (*hey)();
        Mob(int);
+       Mob(int,unsigned int);
        void wander(int);
 };
 
index ac41dd66c0bbd070fedd8e68565ea7017d716473..8f4ea5152b416a5efe65551b2a8b162d7ef0682e 100644 (file)
@@ -83,6 +83,7 @@ public:
        
        void addStructure(_TYPE t,float x,float y,World *outside,World *inside);
        void addMob(int t,float x,float y);
+       void addMob(int t,float x,float y,void (*hey)());
        void addNPC(float x,float y);
        void addObject(int, float, float);
 
@@ -191,10 +192,12 @@ public:
 
 class Arena : public World {
 private:
-       World *exit;
+       vec2     pxy;
+       vec2     door;
+       World   *exit;
 public:
-       void drawDoor(void);
-       World *exitArena(void);
+       Arena(World *leave,Player *p);
+       World *exitArena(Player *p);
 };
 
 extern int worldShade;
index ebeabd405b076c3fa4b51274f0048096ddf9ae4f..62cd87a6678ee23b01f06ba5bee9c790ca9898b8 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1069,6 +1069,12 @@ void logic(){
                        case MS_BIRD:
                                m->wander((rand()%240 + 15));   // Make the mob wander :)
                                break;
+                       case MS_TRIGGER:
+                               m->wander(0);
+                               break;
+                       default:
+                               std::cout<<"Unhandled mob of subtype "<<m->subtype<<"."<<std::endl;
+                               break;
                        }
                }
        }
@@ -1084,7 +1090,6 @@ void logic(){
                                        */
 
                                        if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT)){
-                                               std::cout << "Picking up!\n";
                                                o->interact();
                                        }
                                }
index a8e9bfb5fc5a0f3be2e8883b6edd4670ff0e3e80..67a564a8fd5fd31158cbd0ab3c598eaa82946faa 100644 (file)
@@ -25,8 +25,11 @@ void Entity::spawn(float x, float y){        //spawns the entity you pass to it based o
        
        if(!maxHealth)health = maxHealth = 1;
        
-       if(type==MOBT)
-               Mobp(this)->init_y=loc.y;
+       if(type==MOBT){
+               if(Mobp(this)->subtype == MS_BIRD){
+                       Mobp(this)->init_y=loc.y;
+               }
+       }
        
        name = (char*)malloc(16);
        getName();
@@ -71,7 +74,7 @@ Structures::Structures(){ //sets the structure type
 }
 
 Mob::Mob(int sub){
-       type   = MOBT;
+       type = MOBT;
        
        maxHealth = health = 50;
        
@@ -85,6 +88,10 @@ Mob::Mob(int sub){
                width = HLINE * 8;
                height = HLINE * 8;
                tex = new Texturec(1, "assets/robin.png");
+       case MS_TRIGGER:
+               width = HLINE * 8;
+               height = 2000;
+               tex = new Texturec(0);
                break;
        }
        
@@ -152,28 +159,27 @@ void Entity::draw(void){          //draws the entities
                                        tex->bind(2);
                                break;
                        }
-               }
-               else{
+               }else{
                        tex->bind(1);
                }
        }else if(type == MOBT){
                switch(subtype){
-                       case 1: //RABBIT
+                       case MS_RABBIT:
                                if(ground == 0){
                                        tex->bind(1);
                                }else if(ground == 1){
                                        tex->bind(0);
                                }
                                break;
-                       case 2: //RABBIT
-                               if(ground == 0){
-                                       tex->bind(0);
-                               }else if(ground == 1){
-                                       tex->bind(0);
-                               }
+                       case MS_BIRD:
+                               tex->bind(0);
+                               break;
+                       case MS_TRIGGER:
+                               goto NOPE;
                                break;
                        default:
-                       break;
+                               tex->bind(0);
+                               break;
                }
        }else if(type == OBJECTT){
                tex->bind(0);
@@ -187,6 +193,7 @@ void Entity::draw(void){            //draws the entities
                glTexCoord2i(1,0);glVertex2i(loc.x + width, loc.y + height);
                glTexCoord2i(0,0);glVertex2i(loc.x, loc.y + height);
        glEnd();
+NOPE:
        glDisable(GL_TEXTURE_2D);
        glMatrixMode(GL_MODELVIEW);
        glPopMatrix();
@@ -352,7 +359,7 @@ unsigned int Structures::spawn(_TYPE t, float x, float y){ //spawns a structure
 
 void Mob::wander(int timeRun){
        static int direction;   //variable to decide what direction the entity moves
-       static unsigned int hey=0,hi=0;
+       static unsigned int heya=0,hi=0;
        switch(subtype){
        case MS_RABBIT:
                if(!ticksToUse){
@@ -373,10 +380,18 @@ void Mob::wander(int timeRun){
        case MS_BIRD:
                if(loc.y<=init_y-.2)vel.y=.02*deltaTime;        // TODO handle direction
                vel.x=.02*deltaTime;
-               if(++hey==200){hey=0;hi^=1;}
+               if(++heya==200){heya=0;hi^=1;}
                if(hi)vel.x*=-1;
                break;
+       case MS_TRIGGER:
+               if(player->loc.x + player->width / 2 > loc.x             &&
+                  player->loc.x + player->width / 2 < loc.x + width ){
+                       if(player->left)player->loc.x = loc.x + width;
+                       else if(player->right) player->loc.x = loc.x - player->width;
+                       hey();
+               }
+               break;
        default:
                break;
        }
-}
\ No newline at end of file
+}
index fcc501c6a06ac4081b76fa41f17813f2f7ee8788..e5d7251f053c6990750d9e4ca772cce3d737ae98 100644 (file)
@@ -41,9 +41,26 @@ int giveTestQuest(NPC *speaker){
        return 0;
 }
 
+static Arena *a;
+
+void CUTSCENEEE(void){
+       char opt[]=":K.";
+       player->vel.x = 0;
+       ui::dialogBox(player->name,opt,"No way I\'m gettin\' up this hill.");
+       
+       waitForDialog();
+
+       a = new Arena(currentWorld,player);
+       
+       currentWorld = a;
+       
+       /*player->right = true;
+       player->left  = false;
+       player->loc.x += HLINE * 5;*/
+}
+
 float playerSpawnHillFunc(float x){
-       x=-x;
-       return (float)(pow(2,(x+200)/5) + 80);
+       return (float)(pow(2,(-x+200)/5) + 80);
 }
 void initEverything(void){
        unsigned int i;
@@ -104,13 +121,15 @@ void initEverything(void){
        currentWorld->addStructure(STRUCTURET,(rand()%120*HLINE),10,test,iw);
        
        /*
-        *      Spawn a mob. 
+        *      Spawn some mobs.
        */
+
+       playerSpawnHill->addMob(MS_TRIGGER,-1300,0,CUTSCENEEE);
        
        test->addMob(MS_RABBIT,200,100);
        test->addMob(MS_BIRD,-500,500);
 
-       currentWorld->addObject(2, 500,200);
+       test->addObject(2, 500,200);
        
        /*
         *      Link all the entities that were just created to the initial world, and setup a test AI function. 
index bbec2ded7aaf538cf30901e8215da809b51d66c0..e4cb93a0318bc3b105eec42174b92c651cc76412 100644 (file)
@@ -55,6 +55,9 @@ static unsigned char dialogOptCount = 0;
 
 bool fadeEnable = false;
 
+
+bool inBattle = false;
+
 namespace ui {
        
        /*
@@ -304,7 +307,7 @@ namespace ui {
                 *      Reset values if a new string is being passed.
                */
                
-               if(!size || ((linc>15)&(strncmp(ret,str,15)))){
+               if(strncmp(ret,str,linc-1)){
                        memset(ret,0,512);              //      Zero the buffer
                        size=strlen(str);               //      Set the new target string size
                        linc=0;                                 //      Reset the incrementers
@@ -434,7 +437,7 @@ namespace ui {
                if(dialogBoxExists){
                        
                        glColor3ub(0,0,0);
-                       x=player->loc.x-SCREEN_WIDTH/2+HLINE*8;
+                       x=offset.x-SCREEN_WIDTH/2+HLINE*8;
                        y=(offset.y+SCREEN_HEIGHT/2)-HLINE*8;
                        
                        glRectf(x,y,x+SCREEN_WIDTH-HLINE*16,y-SCREEN_HEIGHT/4);
@@ -543,7 +546,11 @@ DONE:
                                        player->ground=false;
                                        player->loc.y-=HLINE*1.5;
                                }
-                               if(SDL_KEY==SDLK_w)currentWorld=currentWorld->goInsideStructure(player);
+                               if(SDL_KEY==SDLK_w){
+                                       if(inBattle){
+                                               currentWorld=((Arena *)currentWorld)->exitArena(player);
+                                       }else currentWorld=currentWorld->goInsideStructure(player);
+                               }
                                if(SDL_KEY==SDLK_SPACE){                                                                                        // Jump
                                        if(player->ground){
                                                player->vel.y=.4;
index 27574717dbece9c3161c99f28b09563b13768d57..335bda662891ea2dbad11ad31efd4cca305676fe 100644 (file)
@@ -286,9 +286,7 @@ LOOP2:
        /*
         *      Draw the layer up until the grass portion, which is done later.
        */
-       /*
-        * TODO: CLYNE CHANGE THE NAME OF THIS
-       */
+
        bool hey=false;
        glBegin(GL_QUADS);
                for(i=is;i<ie-GEN_INC;i++){
@@ -449,18 +447,51 @@ LOOP2:
 }
 
 void World::singleDetect(Entity *e){
-       unsigned int i;
+       unsigned int i,j;
        
        /*
         *      Kill any dead entities.
        */
        
-       if(e->alive&&e->health<=0){
-         
-               e->alive=false;
-               std::cout<<"Killing entity..."<<std::endl;
+       if(!e->alive||e->health<=0){
+               
+               for(i=0;i<entity.size();i++){
+                       if(entity[i]==e){
+                               entity.erase(entity.begin()+i);
+                               switch(e->type){
+                               case STRUCTURET:
+                                       for(j=0;j<build.size();j++){
+                                               if(build[j]==e){
+                                                       build.erase(build.begin()+j);
+                                                       return;
+                                               }
+                                       }
+                                       break;
+                               case NPCT:
+                                       for(j=0;j<npc.size();j++){
+                                               if(npc[j]==e){
+                                                       npc.erase(npc.begin()+j);
+                                                       return;
+                                               }
+                                       }
+                                       break;
+                               case MOBT:
+                                       for(j=0;j<mob.size();j++){
+                                               if(mob[j]==e){
+                                                       mob.erase(mob.begin()+j);
+                                                       return;
+                                               }
+                                       }
+                                       break;
+                               }
+                               return;
+                       }
+               }
+
+               std::cout<<"RIP "<<e->name<<"."<<std::endl;
+               exit(0);
+
                return;
-               
        }
        
        /*
@@ -469,6 +500,8 @@ void World::singleDetect(Entity *e){
        
        if(e->alive){
          
+               if(e->type == MOBT && Mobp(e)->subtype == MS_TRIGGER)return;
+         
                /*
                 *      Calculate the line that this entity is currently standing on.
                */
@@ -577,6 +610,14 @@ void World::addMob(int t,float x,float y){
        entity.push_back(mob.back());
 }
 
+void World::addMob(int t,float x,float y,void (*hey)()){
+       mob.push_back(new Mob(t));
+       mob.back()->spawn(x,y);
+       mob.back()->hey = hey;
+       
+       entity.push_back(mob.back());
+}
+
 void World::addNPC(float x,float y){
        npc.push_back(new NPC());
        npc.back()->spawn(x,y);
@@ -727,9 +768,33 @@ void IndoorWorld::draw(Player *p){
        p->draw();
 }
 
-void Arena::drawDoor(void){
+extern bool inBattle;
+
+Arena::Arena(World *leave,Player *p){
+       generate(300);
+       door.y = line[299].y;
+       door.x = 100;
+       exit = leave;
+       
+       npc.push_back(new NPC());
+       entity.push_back(npc.back());
+       entity.back()->spawn(door.x,door.y);
+       entity.back()->width = HLINE * 12;
+       entity.back()->height = HLINE * 16;
+       
+       inBattle = true;
+       pxy = p->loc;
 }
 
-World *Arena::exitArena(void){
-       return this;
+World *Arena::exitArena(Player *p){
+       npc[0]->loc.x = door.x;
+       npc[0]->loc.y = door.y;
+       if(p->loc.x + p->width / 2 > door.x                              &&
+          p->loc.x + p->width / 2 < door.x + HLINE * 12 ){
+               inBattle = false;
+               p->loc = pxy;
+               return exit;
+       }else{
+               return this;
+       }
 }