aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/entities.cpp47
-rw-r--r--src/gameplay.cpp27
-rw-r--r--src/ui.cpp11
-rw-r--r--src/world.cpp95
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);
/*
diff --git a/src/ui.cpp b/src/ui.cpp
index e6914d5..81c3f9b 100644
--- a/src/ui.cpp
+++ b/src/ui.cpp
@@ -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;
+ }
}