@@ -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 @@ void World::draw(Player *p){
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 @@ void World::draw(Player *p){
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 @@ void World::draw(Player *p){
/*
* 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 @@ void World::draw(Player *p){
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 {