diff options
author | drumsetmonkey <abelleisle@roadrunner.com> | 2015-11-20 08:49:54 -0500 |
---|---|---|
committer | drumsetmonkey <abelleisle@roadrunner.com> | 2015-11-20 08:49:54 -0500 |
commit | cc4cd76409894615887e0b39d7db5b722138a613 (patch) | |
tree | db2802e34ba553bf121a7e59cb803d1c0c196e6d | |
parent | 0a30bd1b2e2f02b6f34225d8976f645c99b53b7e (diff) | |
parent | 5598e4d1f52224f2d075dc318868e284b2f20a78 (diff) |
Started inv ui, new item system
-rw-r--r-- | Changelog | 28 | ||||
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | assets/bgFarTreeTile.png | bin | 0 -> 9433 bytes | |||
-rw-r--r-- | assets/bgFrontTreeTile.png | bin | 0 -> 27660 bytes | |||
-rw-r--r-- | assets/bgMidTreeTile.png | bin | 0 -> 30605 bytes | |||
-rw-r--r-- | assets/bgTrashWaves.png | bin | 0 -> 1454217 bytes | |||
-rw-r--r-- | include/entities.h | 7 | ||||
-rw-r--r-- | include/world.h | 9 | ||||
-rw-r--r-- | main.cpp | 45 | ||||
-rw-r--r-- | src/entities.cpp | 47 | ||||
-rw-r--r-- | src/gameplay.cpp | 27 | ||||
-rw-r--r-- | src/ui.cpp | 11 | ||||
-rw-r--r-- | src/world.cpp | 95 | ||||
-rw-r--r-- | xcf/bgTrashWaves.xcf | bin | 0 -> 3932867 bytes |
14 files changed, 208 insertions, 63 deletions
@@ -283,3 +283,31 @@ - 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 + +11/18/2015: +=========== + + - converted layered background items to tiles + - fixed ortho in small spaces + - began formalizing item system @@ -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/assets/bgFarTreeTile.png b/assets/bgFarTreeTile.png Binary files differnew file mode 100644 index 0000000..07546a5 --- /dev/null +++ b/assets/bgFarTreeTile.png diff --git a/assets/bgFrontTreeTile.png b/assets/bgFrontTreeTile.png Binary files differnew file mode 100644 index 0000000..7fc7450 --- /dev/null +++ b/assets/bgFrontTreeTile.png diff --git a/assets/bgMidTreeTile.png b/assets/bgMidTreeTile.png Binary files differnew file mode 100644 index 0000000..126723e --- /dev/null +++ b/assets/bgMidTreeTile.png diff --git a/assets/bgTrashWaves.png b/assets/bgTrashWaves.png Binary files differnew file mode 100644 index 0000000..6a177cd --- /dev/null +++ b/assets/bgTrashWaves.png diff --git a/include/entities.h b/include/entities.h index fe316ad..403c3c5 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 3d5fdad..a32c7f2 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); void addObject(int, bool, char*, float, float); @@ -193,10 +194,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; @@ -447,7 +447,7 @@ int main(int argc, char *argv[]){ bgTreesMid =Texture::loadTexture("assets/bgMidTree.png" ); bgTreesFar =Texture::loadTexture("assets/bgFarTree.png" ); invUI =Texture::loadTexture("assets/invUI.png" ); - + /* * Load sprites used in the inventory menu. See src/inventory.cpp */ @@ -578,7 +578,9 @@ void render(){ * see past the world render */ - if(!worldInside){ + if(currentWorld->getTheWidth() < SCREEN_WIDTH){ + offset.x = 0; + }else if(!worldInside){ if(player->loc.x - SCREEN_WIDTH/2 < currentWorld->getTheWidth() * -0.5f) offset.x = ((currentWorld->getTheWidth() * -0.5f) + SCREEN_WIDTH / 2) + player->width / 2; if(player->loc.x + player->width + SCREEN_WIDTH/2 > currentWorld->getTheWidth() * 0.5f) @@ -680,7 +682,7 @@ void render(){ * Draws stars if it is an appropriate time of day for them. */ - int base = 40 - (int)worldGetYBase(currentWorld); + int base = 80; int shade = worldShade*2; if(((weather==DARK )&(tickCount%DAY_CYCLE)<DAY_CYCLE/2) || @@ -725,33 +727,33 @@ void render(){ glBindTexture(GL_TEXTURE_2D, bgTreesFar); glBegin(GL_QUADS); safeSetColorA(100-shade,100-shade,100-shade,240); - for(int i = 0; i <= currentWorld->getTheWidth()/1920; i++){ - glTexCoord2i(0,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.6,base); - glTexCoord2i(1,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.6,base); - glTexCoord2i(1,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.6,base+1080); - glTexCoord2i(0,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.6,base+1080); + for(int i = -currentWorld->getTheWidth() / 2; i <= currentWorld->getTheWidth() / 2; i += 300){ + glTexCoord2i(0,1);glVertex2i(i+offset.x*.6,base); + glTexCoord2i(1,1);glVertex2i((i+300)+offset.x*.6,base); + glTexCoord2i(1,0);glVertex2i((i+300)+offset.x*.6,base+200); + glTexCoord2i(0,0);glVertex2i(i+offset.x*.6,base+200); } glEnd(); glBindTexture(GL_TEXTURE_2D, bgTreesMid); glBegin(GL_QUADS); safeSetColorA(150-shade,150-shade,150-shade,250); - for(int i = 0; i <= currentWorld->getTheWidth()/1920; i++){ - glTexCoord2i(0,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.4,base); - glTexCoord2i(1,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.4,base); - glTexCoord2i(1,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.4,base+1080); - glTexCoord2i(0,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.4,base+1080); + for(int i = -currentWorld->getTheWidth() / 2; i <= currentWorld->getTheWidth() / 2; i += 400){ + glTexCoord2i(0,1);glVertex2i(i+offset.x*.4,base); + glTexCoord2i(1,1);glVertex2i((i+300)+offset.x*.4,base); + glTexCoord2i(1,0);glVertex2i((i+300)+offset.x*.4,base+200); + glTexCoord2i(0,0);glVertex2i(i+offset.x*.4,base+200); } glEnd(); glBindTexture(GL_TEXTURE_2D, bgTreesFront); glBegin(GL_QUADS); safeSetColorA(255-shade,255-shade,255-shade,255); - for(int i = 0; i <= currentWorld->getTheWidth()/1920; i++){ - glTexCoord2i(0,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.25,base); - glTexCoord2i(1,1);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.25,base); - glTexCoord2i(1,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * (i+1))+offset.x*.25,base+1080); - glTexCoord2i(0,0);glVertex2i((currentWorld->getTheWidth()*-0.5f)+(1920 * i)+offset.x*.25,base+1080); + for(int i = -currentWorld->getTheWidth() / 2; i <= currentWorld->getTheWidth() / 2; i += 280){ + glTexCoord2i(0,1);glVertex2i(i+offset.x*.25,base); + glTexCoord2i(1,1);glVertex2i((i+300)+offset.x*.25,base); + glTexCoord2i(1,0);glVertex2i((i+300)+offset.x*.25,base+200); + glTexCoord2i(0,0);glVertex2i(i+offset.x*.25,base+200); } glEnd(); glDisable(GL_TEXTURE_2D); @@ -1079,6 +1081,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; } } } @@ -1098,7 +1106,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 e979e33..af32cd6 100644 --- a/src/entities.cpp +++ b/src/entities.cpp @@ -27,8 +27,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(); @@ -73,7 +76,7 @@ Structures::Structures(){ //sets the structure type } Mob::Mob(int sub){ - type = MOBT; + type = MOBT; maxHealth = health = 50; @@ -87,6 +90,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; } @@ -168,28 +175,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{ tex->bind(0); @@ -201,6 +207,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(); @@ -376,7 +383,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){ @@ -397,10 +404,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 18bf327..92d1284 100644 --- a/src/gameplay.cpp +++ b/src/gameplay.cpp @@ -70,9 +70,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; @@ -133,12 +150,14 @@ 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(SWORD_WOOD, 500,200); currentWorld->addObject(FLASHLIGHT, true, "This looks important, do you want to pick it up?",600,200); /* @@ -55,6 +55,9 @@ static unsigned char dialogOptCount = 0; bool fadeEnable = false; + +bool inBattle = false; + namespace ui { /* @@ -435,7 +438,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); @@ -544,7 +547,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 8d003c9..c50ad0b 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -17,13 +17,13 @@ bool worldInside = false; float worldGetYBase(World *w){ - float base = 0; + /*float base = 0; World *ptr = w; while(ptr->infront){ base+=DRAW_Y_OFFSET; ptr=ptr->infront; - } - return base; + }*/ + return /*base*/ GEN_MIN; } struct wSavePack { @@ -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); @@ -734,9 +775,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; + } } diff --git a/xcf/bgTrashWaves.xcf b/xcf/bgTrashWaves.xcf Binary files differnew file mode 100644 index 0000000..0214d8d --- /dev/null +++ b/xcf/bgTrashWaves.xcf |