diff options
-rw-r--r-- | Changelog | 21 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | include/entities.h | 7 | ||||
-rw-r--r-- | include/world.h | 9 | ||||
-rw-r--r-- | main.cpp | 7 | ||||
-rw-r--r-- | src/entities.cpp | 47 | ||||
-rw-r--r-- | src/gameplay.cpp | 27 | ||||
-rw-r--r-- | src/ui.cpp | 13 | ||||
-rw-r--r-- | src/world.cpp | 89 |
9 files changed, 179 insertions, 43 deletions
@@ -283,3 +283,24 @@ - 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 @@ -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 diff --git a/include/entities.h b/include/entities.h index b590c8d..c2de1b1 100644 --- a/include/entities.h +++ b/include/entities.h @@ -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); }; diff --git a/include/world.h b/include/world.h index ac41dd6..8f4ea51 100644 --- a/include/world.h +++ b/include/world.h @@ -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; @@ -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(); } } diff --git a/src/entities.cpp b/src/entities.cpp index a8e9bfb..67a564a 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -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 +} diff --git a/src/gameplay.cpp b/src/gameplay.cpp index fcc501c..e5d7251 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -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. @@ -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; diff --git a/src/world.cpp b/src/world.cpp index 2757471..335bda6 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -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; + } } |