diff options
Diffstat (limited to 'src')
-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 |
4 files changed, 143 insertions, 37 deletions
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; + } } |