diff options
Diffstat (limited to 'src/world.cpp')
-rw-r--r-- | src/world.cpp | 334 |
1 files changed, 258 insertions, 76 deletions
diff --git a/src/world.cpp b/src/world.cpp index 5663086..fea0e3e 100644 --- a/src/world.cpp +++ b/src/world.cpp @@ -33,6 +33,8 @@ const char *bgPaths[2][7]={ NULL} }; +Texturec *grassT; + const float bgDraw[3][3]={ {100,240,.6 }, {150,250,.4 }, @@ -50,6 +52,7 @@ float worldGetYBase(World *w){ } void World::setBackground(WORLD_BG_TYPE bgt){ + bgType = bgt; switch(bgt){ case BG_FOREST: bgTex = new Texturec(7,bgPaths[0]); @@ -60,12 +63,126 @@ void World::setBackground(WORLD_BG_TYPE bgt){ } } -void World::save(FILE *s){ - fclose(s); +void World::save(std::ofstream *o){ + static unsigned int size2; + unsigned int size,i; + size_t bgms = strlen(bgm) + 1; + char *bufptr; + + o->write((char *)&lineCount, sizeof(unsigned int)); + o->write((char *)line ,lineCount * sizeof(struct line_t)); + o->write("GG" ,2 * sizeof(char)); + o->write((char *)star ,100 * sizeof(vec2)); + o->write((char *)&bgType , sizeof(WORLD_BG_TYPE)); + o->write((char *)&bgms , sizeof(size_t)); + o->write(bgm ,strlen(bgm)+1); + o->write("NO" ,2 * sizeof(char)); + size = npc.size(); + o->write((char *)&size,sizeof(unsigned int)); + for(i=0;i<size;i++){ + bufptr = npc[i]->save(&size2); + o->write((char *)&size2,sizeof(unsigned int)); + o->write(bufptr,size2); + delete[] bufptr; + } + size = build.size(); + o->write((char *)&size,sizeof(unsigned int)); + for(i=0;i<size;i++){ + bufptr = build[i]->save(); + o->write(bufptr,sizeof(StructuresSavePacket)); + delete[] bufptr; + } + size = object.size(); + o->write((char *)&size,sizeof(unsigned int)); + for(i=0;i<size;i++){ + bufptr = object[i]->save(); + o->write(bufptr,sizeof(ObjectSavePacket)); + delete[] bufptr; + } + size = mob.size(); + o->write((char *)&size,sizeof(unsigned int)); + for(i=0;i<size;i++){ + bufptr = mob[i]->save(); + o->write(bufptr,sizeof(MobSavePacket)); + delete[] bufptr; + } } -void World::load(FILE *s){ - fclose(s); +void World::load(std::ifstream *i){ + unsigned int size,size2,j; + size_t bgms; + char sig[2],*buf; + + i->read((char *)&lineCount,sizeof(unsigned int)); + + line = new struct line_t[lineCount]; + i->read((char *)line,lineCount * sizeof(struct line_t)); + + i->read(sig,2 * sizeof(char)); + if(strncmp(sig,"GG",2)){ + std::cout<<"world.dat corrupt: GG"<<std::endl; + exit(EXIT_FAILURE); + } + + x_start = 0 - getWidth(this) / 2; + + i->read((char *)star,100 * sizeof(vec2)); + i->read((char *)&bgType,sizeof(WORLD_BG_TYPE)); + + i->read((char *)&bgms,sizeof(size_t)); + bgm = new char[bgms]; + i->read(bgm,bgms); + setBGM(bgm); + + i->read(sig,2 * sizeof(char)); + if(strncmp(sig,"NO",2)){ + std::cout<<"world.dat corrupt: NO"<<std::endl; + exit(EXIT_FAILURE); + } + + i->read((char *)&size,sizeof(unsigned int)); + for(j=0;j<size;j++){ + i->read((char *)&size2,sizeof(unsigned int)); + buf = new char[size2]; + i->read(buf,size2); + npc.push_back(new NPC()); + npc.back()->load(size2,buf); + entity.push_back(npc.back()); + delete[] buf; + } + + static StructuresSavePacket *ssp; + ssp = new StructuresSavePacket(); + i->read((char *)&size,sizeof(unsigned int)); + for(j=0;j<size;j++){ + i->read((char *)ssp,sizeof(StructuresSavePacket)); + build.push_back(new Structures()); + build.back()->load((char *)ssp); + entity.push_back(build.back()); + } + delete ssp; + + static ObjectSavePacket *osp; + osp = new ObjectSavePacket(); + i->read((char *)&size,sizeof(unsigned int)); + for(j=0;j<size;j++){ + i->read((char *)osp,sizeof(ObjectSavePacket)); + object.push_back(new Object()); + object.back()->load((char *)osp); + object.back()->reloadTexture(); + entity.push_back(object.back()); + } + delete osp; + + static MobSavePacket *msp; + msp = new MobSavePacket(); + i->read((char *)&size,sizeof(unsigned int)); + for(j=0;j<size;j++){ + i->read((char *)msp,sizeof(MobSavePacket)); + mob.push_back(new Mob(0)); + mob.back()->load((char *)msp); + entity.push_back(mob.back()); + } } World::World(void){ @@ -88,6 +205,7 @@ World::World(void){ star = new vec2[100]; memset(star,0,100 * sizeof(vec2)); + grassT = new Texturec(1,"assets/grass.png"); } void World::deleteEntities(void){ @@ -383,27 +501,24 @@ LLLOOP: width = (-x_start) << 1; glEnable(GL_TEXTURE_2D); - + bgTex->bind(0); safeSetColorA(255,255,255,255 - worldShade * 4); - glBegin(GL_QUADS); glTexCoord2i(0,0);glVertex2i( cx_start,SCREEN_HEIGHT); glTexCoord2i(1,0);glVertex2i(-cx_start,SCREEN_HEIGHT); glTexCoord2i(1,1);glVertex2i(-cx_start,0); glTexCoord2i(0,1);glVertex2i( cx_start,0); glEnd(); - + bgTex->bindNext(); - safeSetColorA(255,255,255,worldShade * 4); - + safeSetColorA(255,255,255,worldShade * 4); glBegin(GL_QUADS); glTexCoord2i(0,0);glVertex2i( cx_start,SCREEN_HEIGHT); glTexCoord2i(1,0);glVertex2i(-cx_start,SCREEN_HEIGHT); glTexCoord2i(1,1);glVertex2i(-cx_start,0); glTexCoord2i(0,1);glVertex2i( cx_start,0); glEnd(); - glDisable(GL_TEXTURE_2D); /* @@ -426,13 +541,13 @@ LLLOOP: } } + glEnable(GL_TEXTURE_2D); /* * Draw the mountains. */ - bgTex->bindNext(); safeSetColorA(150-bgshade,150-bgshade,150-bgshade,220); @@ -551,79 +666,114 @@ LOOP2: bool hey=false; glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); bgTex->bindNext(); + + GLfloat pointArray[light.size()][2]; + for(uint w = 0; w < light.size(); w++){ + pointArray[w][0] = light[w].loc.x - offset.x; + pointArray[w][1] = light[w].loc.y; + } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //for the s direction glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //for the t direction + glUseProgram(shaderProgram); + glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); + glUniform1f(glGetUniformLocation(shaderProgram, "amb"), float(shade+50.0f)/100.0f); + if(p->light){ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 1); + glUniform2f(glGetUniformLocation(shaderProgram, "lightLocation"), p->loc.x - offset.x+SCREEN_WIDTH/2, p->loc.y); + glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + }else if(!light.size()){ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 0); + }else{ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), light.size()); + glUniform2fv(glGetUniformLocation(shaderProgram, "lightLocation"), light.size(), (GLfloat *)&pointArray); + glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + } + glBegin(GL_QUADS); - for(i=is;i<(unsigned)ie-GEN_INC;i++){ - cline[i].y+=(yoff-DRAW_Y_OFFSET); // Add the y offset - if(!cline[i].y){ - cline[i].y=base; - hey=true; - glColor4ub(0,0,0,255); - }else - safeSetColorA(150+shade*2,150+shade*2,150+shade*2,255); - glTexCoord2i(0,0);glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT); - glTexCoord2i(1,0);glVertex2i(cx_start+i*HLINE+HLINE,cline[i].y-GRASS_HEIGHT); - glTexCoord2i(1,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE+HLINE,0); - glTexCoord2i(0,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE ,0); - cline[i].y-=(yoff-DRAW_Y_OFFSET); // Restore the line's y value - if(hey){ - hey=false; - cline[i].y=0; - } + for(i=is;i<(unsigned)ie-GEN_INC;i++){ + cline[i].y+=(yoff-DRAW_Y_OFFSET); // Add the y offset + if(!cline[i].y){ + cline[i].y=base; + hey=true; + glColor4ub(0,0,0,255); + }else safeSetColorA(150+shade*2,150+shade*2,150+shade*2,255); + glTexCoord2i(0,0);glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT); + glTexCoord2i(1,0);glVertex2i(cx_start+i*HLINE+HLINE,cline[i].y-GRASS_HEIGHT); + glTexCoord2i(1,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE+HLINE,0); + glTexCoord2i(0,(int)(cline[i].y/64)+cline[i].color);glVertex2i(cx_start+i*HLINE ,0); + cline[i].y-=(yoff-DRAW_Y_OFFSET); // Restore the line's y value + if(hey){ + hey=false; + cline[i].y=0; } + } glEnd(); + glUseProgram(0); glDisable(GL_TEXTURE_2D); - /* * Draw grass on every line. */ float cgh[2]; - glBegin(GL_QUADS); - for(i=is;i<(unsigned)ie-GEN_INC;i++){ - - /* - * Load the current line's grass values - */ - - if(cline[i].y)memcpy(cgh,cline[i].gh,2*sizeof(float)); - else memset(cgh,0 ,2*sizeof(float)); - - - - /* - * Flatten the grass if the player is standing on it. - */ - - if(!cline[i].gs){ - cgh[0]/=4; - cgh[1]/=4; - } - - /* - * Actually draw the grass. - */ - - cline[i].y+=(yoff-DRAW_Y_OFFSET); - - safeSetColor(shade,100+shade*1.5,shade); - - glVertex2i(cx_start+i*HLINE ,cline[i].y+cgh[0]); - glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y+cgh[0]); - glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y-GRASS_HEIGHT); - glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT); - - glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y+cgh[1]); - glVertex2i(cx_start+i*HLINE+HLINE ,cline[i].y+cgh[1]); - glVertex2i(cx_start+i*HLINE+HLINE ,cline[i].y-GRASS_HEIGHT); - glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y-GRASS_HEIGHT); - - cline[i].y-=(yoff-DRAW_Y_OFFSET); + + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + grassT->bind(0); + glUseProgram(shaderProgram); + glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //for the s direction + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //for the t direction + //glBegin(GL_QUADS); + + for(i=is;i<(unsigned)ie-GEN_INC;i++){ + + /* + * Load the current line's grass values + */ + + if(cline[i].y)memcpy(cgh,cline[i].gh,2*sizeof(float)); + else memset(cgh,0 ,2*sizeof(float)); + + + + /* + * Flatten the grass if the player is standing on it. + */ + + if(!cline[i].gs){ + cgh[0]/=4; + cgh[1]/=4; } - glEnd(); - + + /* + * Actually draw the grass. + */ + + cline[i].y+=(yoff-DRAW_Y_OFFSET); + safeSetColorA(255,255,255,255); + glBegin(GL_QUADS); + glTexCoord2i(0,0);glVertex2i(cx_start+i*HLINE ,cline[i].y+cgh[0]); + glTexCoord2i(1,0);glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y+cgh[0]); + glTexCoord2i(1,1);glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y-GRASS_HEIGHT); + glTexCoord2i(0,1);glVertex2i(cx_start+i*HLINE ,cline[i].y-GRASS_HEIGHT); + glEnd(); + + glBegin(GL_QUADS); + glTexCoord2i(0,0);glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y+cgh[1]); + glTexCoord2i(1,0);glVertex2i(cx_start+i*HLINE+HLINE ,cline[i].y+cgh[1]); + glTexCoord2i(1,1);glVertex2i(cx_start+i*HLINE+HLINE ,cline[i].y-GRASS_HEIGHT); + glTexCoord2i(0,1);glVertex2i(cx_start+i*HLINE+HLINE/2,cline[i].y-GRASS_HEIGHT); + glEnd(); + + cline[i].y-=(yoff-DRAW_Y_OFFSET); + } + //glEnd(); + glUseProgram(0); + glDisable(GL_TEXTURE_2D); + + /* * Draw non-structure entities. */ @@ -913,16 +1063,20 @@ void World::addStructure(_TYPE t,BUILD_SUB sub, float x,float y,World *inside){ entity.push_back(build.back()); } -void World::addVillage(int bCount, int npcMin, int npcMax,_TYPE t,float x,float y,World *outside){ +void World::addVillage(int bCount, int npcMin, int npcMax,_TYPE t,World *inside){ std::cout << npcMin << ", " << npcMax << std::endl; - int xwasd; + //int xwasd; for(int i = 0; i < bCount; i++){ - xwasd = (rand()%(int)x+1000*HLINE); + addStructure(t,HOUSE,x_start + (i * 300),100,inside); + /*std::cout<<"1\n"; HERE: + xwasd = (rand()%(int)x+1000*HLINE); for(auto &bu : build){ if(xwasd > bu->loc.x && xwasd < bu->loc.x+bu->width)goto HERE; } - addStructure(t,HOUSE,xwasd,y,outside); + std::cout<<"2\n"; + addStructure(t,HOUSE,xwasd,y,inside); + std::cout<<"3\n";*/ } } void World::addMob(int t,float x,float y){ @@ -959,6 +1113,12 @@ void World::addParticle(float x, float y, float w, float h, float vx, float vy, particles.back()->canMove = true; } +void World::addLight(vec2 loc, Color color){ + light.push_back(Light()); + light.back().loc = loc; + light.back().color = color; +} + /*void World::removeObject(Object i){ object.delete[](i); }*/ @@ -1111,6 +1271,25 @@ void IndoorWorld::draw(Player *p){ */ glEnable(GL_TEXTURE_2D); + GLfloat pointArray[light.size()][2]; + for(uint w = 0; w < light.size(); w++){ + pointArray[w][0] = light[w].loc.x - offset.x; + pointArray[w][1] = light[w].loc.y; + } + glUseProgram(shaderProgram); + glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); + glUniform1f(glGetUniformLocation(shaderProgram, "amb"), 0.0f); + if(p->light){ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 1); + glUniform2f(glGetUniformLocation(shaderProgram, "lightLocation"), p->loc.x - offset.x+SCREEN_WIDTH/2, p->loc.y); + glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + }else if(!light.size()){ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), 0); + }else{ + glUniform1i(glGetUniformLocation(shaderProgram, "numLight"), light.size()); + glUniform2fv(glGetUniformLocation(shaderProgram, "lightLocation"), light.size(), (GLfloat *)&pointArray); + glUniform3f(glGetUniformLocation(shaderProgram, "lightColor"), 1.0f,1.0f,1.0f); + } bgTex->bind(0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //for the s direction @@ -1126,6 +1305,7 @@ void IndoorWorld::draw(Player *p){ //} glEnd(); + glUseProgram(0); glDisable(GL_TEXTURE_2D); /* @@ -1146,7 +1326,8 @@ void IndoorWorld::draw(Player *p){ /* * Draw the ground. */ - + glUseProgram(shaderProgram); + glUniform1i(glGetUniformLocation(shaderProgram, "sampler"), 0); glBegin(GL_QUADS); for(;i < ie - GEN_INC;i++){ safeSetColor(150,100,50); @@ -1158,6 +1339,7 @@ void IndoorWorld::draw(Player *p){ glVertex2i(x ,line[i].y - 50); } glEnd(); + glUseProgram(0); /* * Draw all entities. |