aboutsummaryrefslogtreecommitdiffstats
path: root/src/world.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/world.cpp')
-rw-r--r--src/world.cpp109
1 files changed, 89 insertions, 20 deletions
diff --git a/src/world.cpp b/src/world.cpp
index 3f35e21..1b460a2 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -106,7 +106,13 @@ void World::deleteEntities(void){
delete object.back();
object.pop_back();
}
- while(!entity.empty()) entity.pop_back();
+ while(!entity.empty()){
+ entity.pop_back();
+ }
+ while(!particles.empty()){
+ delete particles.back();
+ particles.pop_back();
+ }
}
World::~World(void){
@@ -296,6 +302,28 @@ void World::update(Player *p,unsigned int delta){
else if(e->vel.x > 0)e->left = false;
}
}
+ uint oh = 0;
+ for(auto &pa : particles){
+ if(pa->kill(deltaTime)){
+ delete pa;
+ particles.erase(particles.begin()+oh);
+ }else if(pa->canMove){
+ pa->loc.y += pa->vely * deltaTime;
+ pa->loc.x += pa->velx * deltaTime;
+
+ for(auto &b : build){
+ if(b->bsubtype==FOUNTAIN){
+ if(pa->loc.x >= b->loc.x && pa->loc.x <= b->loc.x+b->width){
+ if(pa->loc.y <= b->loc.y + b->height*.25){
+ delete pa;
+ particles.erase(particles.begin()+oh);
+ }
+ }
+ }
+ }
+ }
+ oh++;
+ }oh=0;
if(ui::dialogImportant){
Mix_FadeOutMusic(2000);
@@ -351,7 +379,7 @@ LLLOOP:
current=current->infront;
goto LLLOOP;
}
- cx_start = current->x_start;
+ cx_start = current->x_start * 1.5;
width = (-x_start) << 1;
glEnable(GL_TEXTURE_2D);
@@ -437,6 +465,9 @@ LLLOOP:
glDisable(GL_TEXTURE_2D);
+ glColor3ub(0,0,0);
+ glRectf(cx_start,GEN_MIN,-cx_start,0);
+
/*
* World drawing is done recursively, meaning that this function jumps
* back as many 'layers' as it can and then draws, eventually coming
@@ -592,7 +623,7 @@ LOOP2:
/*
* Draw non-structure entities.
*/
-
+ for(auto &part : particles){part->draw();}
for(auto &n : current->npc){
n->loc.y+=(yoff-DRAW_Y_OFFSET);
n->draw();
@@ -610,6 +641,7 @@ LOOP2:
o->loc.y-=(yoff-DRAW_Y_OFFSET);
}
}
+
/*
* If we're drawing the closest/last world, handle and draw the player.
@@ -842,23 +874,52 @@ void World::detect(Player *p){
*/
LOOOOP:
+ static int what = 0;
for(auto &e : hey->entity)
hey->singleDetect(e);
+ for(auto &part : particles){
+ int l;
+ unsigned int i;
+ l=(part->loc.x + part->width / 2 - x_start) / HLINE;
+ if(l < 0) l=0;
+ i = l;
+ if(i > lineCount-1) i=lineCount-1;
+ if(part->loc.y < line[i].y){
+ part->loc.y = line[i].y;
+ part->vely = 0;
+ part->velx = 0;
+ part->canMove = false;
+ }else{
+ if(part->vely > -2)part->vely-=.003 * deltaTime;
+ }
+ what++;
+ }what=0;
if(hey->infront){
hey = hey->infront;
goto LOOOOP;
}
}
-
-void World::addStructure(_TYPE t,float x,float y,World *outside,World *inside){
+void World::addStructure(_TYPE t,BUILD_SUB sub, float x,float y,World *outside,World *inside){
build.push_back(new Structures());
- build.back()->spawn(t,x,y);
+ build.back()->spawn(t,sub,x,y);
build.back()->inWorld=outside;
build.back()->inside=(void *)inside;
entity.push_back(build.back());
}
+void World::addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside,World *inside){
+ std::cout << npcMin << ", " << npcMax << std::endl;
+ int xwasd;
+ for(int i = 0; i < bCount; i++){
+ xwasd = (rand()%(int)x+1000*HLINE);
+ HERE:
+ for(auto &bu : build){
+ if(xwasd > bu->loc.x && xwasd < bu->loc.x+bu->width)goto HERE;
+ }
+ addStructure(t,HOUSE,xwasd,y,outside,inside);
+ }
+}
void World::addMob(int t,float x,float y){
mob.push_back(new Mob(t));
mob.back()->spawn(x,y);
@@ -888,6 +949,11 @@ void World::addObject(ITEM_ID i, bool q, const char *p, float x, float y){
entity.push_back(object.back());
}
+void World::addParticle(float x, float y, float w, float h, float vx, float vy, Color color, int d){
+ particles.push_back(new Particles(x,y,w,h,vx,vy,color,d));
+ particles.back()->canMove = true;
+}
+
/*void World::removeObject(Object i){
object.delete[](i);
}*/
@@ -941,6 +1007,14 @@ World *World::goWorldFront(Player *p){
return this;
}
+bool World::isWorldLeft(void){
+ return toLeft ? true : false;
+}
+
+bool World::isWorldRight(void){
+ return toRight ? true : false;
+}
+
std::vector<void *>thing;
World *World::goInsideStructure(Player *p){
if(!thing.size()){
@@ -1078,18 +1152,13 @@ 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;*/
-
+ addMob(MS_DOOR,100,100);
inBattle = true;
+ exit = leave;
pxy = p->loc;
+
+ star = new vec2[100];
+ memset(star,0,100 * sizeof(vec2));
}
Arena::~Arena(void){
@@ -1101,11 +1170,11 @@ Arena::~Arena(void){
}
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 ){
+ if(p->loc.x + p->width / 2 > mob[0]->loc.x &&
+ p->loc.x + p->width / 2 < mob[0]->loc.x + HLINE * 12 ){
inBattle = false;
+ ui::toggleBlackFast();
+ ui::waitForCover();
p->loc = pxy;
return exit;
}else{