diff --git a/src/client/GameSave.cpp b/src/client/GameSave.cpp index c03536cf1..7e3fbe72d 100644 --- a/src/client/GameSave.cpp +++ b/src/client/GameSave.cpp @@ -12,6 +12,10 @@ #include "bson/BSON.h" #include "GameSave.h" #include "simulation/SimulationData.h" +extern "C" +{ + #include "hmap.h" +} GameSave::GameSave(GameSave & save) : waterEEnabled(save.waterEEnabled), @@ -262,6 +266,7 @@ void GameSave::readOPS(char * data, int dataLength) int i, freeIndicesCount, x, y, j; int *freeIndices = NULL; int blockX, blockY, blockW, blockH, fullX, fullY, fullW, fullH; + int savedVersion = inputData[4]; bson b; bson_iterator iter; @@ -278,7 +283,7 @@ void GameSave::readOPS(char * data, int dataLength) fullH = blockH*CELL; //From newer version - if(inputData[4] > SAVE_VERSION) + if(savedVersion > SAVE_VERSION) throw ParseException(ParseException::WrongVersion, "Save from newer version"); //Incompatible cell size @@ -716,6 +721,32 @@ void GameSave::readOPS(char * data, int dataLength) //Clear soap links, links will be added back in if soapLinkData is present particles[newIndex].ctype &= ~6; break; + case PT_BOMB: + if (particles[newIndex].tmp!=0 && savedVersion < 81) + { + particles[newIndex].type = PT_EMBR; + particles[newIndex].ctype = 0; + if (particles[newIndex].tmp==1) + particles[newIndex].tmp = 0; + } + break; + case PT_DUST: + if (particles[newIndex].life>0 && savedVersion < 81) + { + particles[newIndex].type = PT_EMBR; + particles[newIndex].ctype = (particles[newIndex].tmp2<<16) | (particles[newIndex].tmp<<8) | particles[newIndex].ctype; + particles[newIndex].tmp = 1; + } + break; + case PT_FIRW: + if (particles[newIndex].tmp>=2 && savedVersion < 81) + { + int caddress = restrict_flt(restrict_flt((float)(particles[newIndex].tmp-4), 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + particles[newIndex].type = PT_EMBR; + particles[newIndex].tmp = 1; + particles[newIndex].ctype = (((unsigned char)(firw_data[caddress]))<<16) | (((unsigned char)(firw_data[caddress+1]))<<8) | ((unsigned char)(firw_data[caddress+2])); + } + break; } newIndex++; } @@ -1291,6 +1322,30 @@ void GameSave::readPSv(char * data, int dataLength) particles[i-1].tmp2 = particles[i-1].life; } } + + if (ver<81) + { + if (particles[i-1].type==PT_BOMB && particles[i-1].tmp!=0) + { + particles[i-1].type = PT_EMBR; + particles[i-1].ctype = 0; + if (particles[i-1].tmp==1) + particles[i-1].tmp = 0; + } + if (particles[i-1].type==PT_DUST && particles[i-1].life>0) + { + particles[i-1].type = PT_EMBR; + particles[i-1].ctype = (particles[i-1].tmp2<<16) | (particles[i-1].tmp<<8) | particles[i-1].ctype; + particles[i-1].tmp = 1; + } + if (particles[i-1].type==PT_FIRW && particles[i-1].tmp>=2) + { + int caddress = restrict_flt(restrict_flt((float)(particles[i-1].tmp-4), 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); + particles[i-1].type = PT_EMBR; + particles[i-1].tmp = 1; + particles[i-1].ctype = (((unsigned char)(firw_data[caddress]))<<16) | (((unsigned char)(firw_data[caddress+1]))<<8) | ((unsigned char)(firw_data[caddress+2])); + } + } } } diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index ab81912e1..858134772 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -1899,6 +1899,7 @@ void Simulation::init_can_move() can_move[PT_ANAR][PT_WHOL] = 1; can_move[PT_ANAR][PT_NWHL] = 1; can_move[PT_THDR][PT_THDR] = 2; + can_move[PT_EMBR][PT_EMBR] = 2; } /* @@ -1969,9 +1970,6 @@ int Simulation::try_move(int i, int x, int y, int nx, int ny) e = eval_move(parts[i].type, nx, ny, &r); - if ((r&0xFF)==PT_BOMB && parts[i].type==PT_BOMB && parts[i].tmp == 1) - e = 2; - /* half-silvered mirror */ if (!e && parts[i].type==PT_PHOT && (((r&0xFF)==PT_BMTL && rand()delete_part(x+nxi, y+nxj, 0); - pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f; + sim->pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f; nb = sim->create_part(-3, x+nxi, y+nxj, PT_EMBR); if (nb!=-1) { diff --git a/src/simulation/elements/DUST.cpp b/src/simulation/elements/DUST.cpp index 353bfbdfc..924dabbe5 100644 --- a/src/simulation/elements/DUST.cpp +++ b/src/simulation/elements/DUST.cpp @@ -43,34 +43,7 @@ Element_DUST::Element_DUST() HighTemperatureTransition = NT; Update = NULL; - Graphics = &Element_DUST::graphics; + Graphics = NULL; } -//#TPT-Directive ElementHeader Element_DUST static int graphics(GRAPHICS_FUNC_ARGS) -int Element_DUST::graphics(GRAPHICS_FUNC_ARGS) - -{ - if(cpart->life >= 1) - { - *firea = 120; - *firer = *colr = cpart->flags; - *fireg = *colg = cpart->tmp; - *fireb = *colb = cpart->ctype; - if (ren->decorations_enable && cpart->dcolour) - { - int a = (cpart->dcolour>>24)&0xFF; - *firer = *colr = (a*((cpart->dcolour>>16)&0xFF) + (255-a)**colr) >> 8; - *fireg = *colg = (a*((cpart->dcolour>>8)&0xFF) + (255-a)**colg) >> 8; - *fireb = *colb = (a*((cpart->dcolour)&0xFF) + (255-a)**colb) >> 8; - } - *pixel_mode |= PMODE_GLOW | FIRE_ADD; - /**firea = 255; - *firer = *colr; - *fireg = *colg; - *fireb = *colb;*/ - } - return 0; -} - - Element_DUST::~Element_DUST() {} \ No newline at end of file diff --git a/src/simulation/elements/ELEC.cpp b/src/simulation/elements/ELEC.cpp index ddaeac7fa..e9d1f5af5 100644 --- a/src/simulation/elements/ELEC.cpp +++ b/src/simulation/elements/ELEC.cpp @@ -67,25 +67,31 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS) continue; if ((r&0xFF)==PT_GLAS) { - //fire_r[y/CELL][x/CELL] += rand()%200; //D: Doesn't work with OpenGL, also shouldn't be here TODO: FIX THIS SHIT - //fire_g[y/CELL][x/CELL] += rand()%200; - //fire_b[y/CELL][x/CELL] += rand()%200; for (rrx=-1; rrx<=1; rrx++) { for (rry=-1; rry<=1; rry++) { if (x+rx+rrx>=0 && y+ry+rry>=0 && x+rx+rrxcreate_part(-1, x+rx+rrx, y+ry+rry, PT_BOMB); + nb = sim->create_part(-1, x+rx+rrx, y+ry+rry, PT_EMBR); if (nb!=-1) { - parts[nb].tmp = 1; + parts[nb].tmp = 0; parts[nb].life = 50; - parts[nb].temp = 400.0f; + parts[nb].temp = parts[i].temp*0.8f; parts[nb].vx = rand()%20-10; parts[nb].vy = rand()%20-10; } } } } + //fire_r[y/CELL][x/CELL] += rand()%200; //D: Doesn't work with OpenGL, also shouldn't be here + //fire_g[y/CELL][x/CELL] += rand()%200; + //fire_b[y/CELL][x/CELL] += rand()%200; + /* possible alternative, but doesn't work well at the moment because FIRE_ADD divides firea by 8, so the glow isn't strong enough + create_part(i, x, y, PT_EMBR); + parts[i].tmp = 2; + parts[i].life = 2; + parts[i].ctype = ((rand()%200)<<16) | ((rand()%200)<<8) | (rand()%200); + */ sim->kill_part(i); return 1; } diff --git a/src/simulation/elements/EMBR.cpp b/src/simulation/elements/EMBR.cpp index 80c2c4e9c..ea710cf86 100644 --- a/src/simulation/elements/EMBR.cpp +++ b/src/simulation/elements/EMBR.cpp @@ -94,7 +94,7 @@ int Element_EMBR::graphics(GRAPHICS_FUNC_ARGS) *colr = *colg = *colb = 255; } - if (decorations_enable && cpart->dcolour) + if (ren->decorations_enable && cpart->dcolour) { int a = (cpart->dcolour>>24)&0xFF; *colr = (a*((cpart->dcolour>>16)&0xFF) + (255-a)**colr) >> 8; diff --git a/src/simulation/elements/FIRW.cpp b/src/simulation/elements/FIRW.cpp index a23d013c3..9be26dddd 100644 --- a/src/simulation/elements/FIRW.cpp +++ b/src/simulation/elements/FIRW.cpp @@ -1,4 +1,8 @@ #include "simulation/Elements.h" +extern "C" +{ + #include "hmap.h" +} //#TPT-Directive ElementClass Element_FIRW PT_FIRW 69 Element_FIRW::Element_FIRW() { @@ -50,7 +54,7 @@ Element_FIRW::Element_FIRW() int Element_FIRW::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt, np; - if (parts[i].tmp==0) { + if (parts[i].tmp<=0) { for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx0) { - parts[i].vy = -newVel; - ly-=newVel; - iy-=newVel; - }*/ - parts[i].vy = -newVel; + // TODO: different gravity modes + Newtonian gravity + parts[i].vy = -parts[i].life*0.04f - 0.1f; } } - else if (parts[i].tmp==2) { - int col = rand()%200+4; - int tmul; - for (rx=-2; rx<3; rx++) - for (ry=-2; ry<3; ry++) - if (x+rx>=0 && y+ry>0 && x+rxcreate_part(-1, x+rx, y+ry, PT_FIRW); - if (np>-1) - { - parts[np].vx = (rand()%3-1)*tmul; - parts[np].vy = (rand()%3-1)*tmul; - parts[np].tmp = col; - parts[np].life = rand()%100+100; - parts[np].temp = 6000.0f; - parts[np].dcolour = parts[i].dcolour; - } - } - sim->pv[y/CELL][x/CELL] += 20; + else if (parts[i].tmp>=2) + { + float angle, magnitude; + int caddress = (rand()%200)*3; + int n; + unsigned col = (((unsigned char)(firw_data[caddress]))<<16) | (((unsigned char)(firw_data[caddress+1]))<<8) | ((unsigned char)(firw_data[caddress+2])); + for (n=0; n<40; n++) + { + np = sim->create_part(-3, x, y, PT_EMBR); + if (np>-1) + { + magnitude = ((rand()%60)+40)*0.05f; + angle = (rand()%6284)*0.001f;//(in radians, between 0 and 2*pi) + parts[np].vx = parts[i].vx + cosf(angle)*magnitude; + parts[np].vy = parts[i].vy + sinf(angle)*magnitude - 2.5f; + parts[np].ctype = col; + parts[np].tmp = 1; + parts[np].life = rand()%40+70; + parts[np].temp = (rand()%500)+5750.0f; + parts[np].dcolour = parts[i].dcolour; + } + } + sim->pv[y/CELL][x/CELL] += 8.0f; sim->kill_part(i); return 1; - } else if (parts[i].tmp>=3) { - if (parts[i].life<=0) { - sim->kill_part(i); - return 1; - } } return 0; } @@ -117,33 +112,7 @@ int Element_FIRW::update(UPDATE_FUNC_ARGS) int Element_FIRW::graphics(GRAPHICS_FUNC_ARGS) { - if(cpart->tmp>=3) - { - int caddress = restrict_flt(restrict_flt((float)(cpart->tmp-4), 0.0f, 200.0f)*3, 0.0f, (200.0f*3)-3); - *colr = 0;//(unsigned char)firw_data[caddress]; - *colg = 0;//(unsigned char)firw_data[caddress+1]; - *colb = 0;//(unsigned char)firw_data[caddress+2]; - - if (ren->decorations_enable && cpart->dcolour) - { - int a = (cpart->dcolour>>24)&0xFF; - *colr = (a*((cpart->dcolour>>16)&0xFF) + (255-a)**colr) >> 8; - *colg = (a*((cpart->dcolour>>8)&0xFF) + (255-a)**colg) >> 8; - *colb = (a*((cpart->dcolour)&0xFF) + (255-a)**colb) >> 8; - } - - *firea = cpart->life*4; - if(*firea > 240) - *firea = 240; - *firer = *colr; - *fireg = *colg; - *fireb = *colb; - - *pixel_mode = PMODE_NONE; //Clear default, don't draw pixel - *pixel_mode |= FIRE_ADD; - //Returning 0 means dynamic, do not cache - } - else if(cpart->tmp > 0) + if(cpart->tmp > 0) { *pixel_mode |= PMODE_GLOW; } diff --git a/src/simulation/elements/IGNT.cpp b/src/simulation/elements/IGNT.cpp index 206b92b68..de26eb743 100644 --- a/src/simulation/elements/IGNT.cpp +++ b/src/simulation/elements/IGNT.cpp @@ -73,9 +73,9 @@ int Element_IGNT::update(UPDATE_FUNC_ARGS) { if(rand()%3) { - int nb = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_BOMB); + int nb = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_EMBR); if (nb!=-1) { - parts[nb].tmp = 1; + parts[nb].tmp = 0; parts[nb].life = 30; parts[nb].vx = rand()%20-10; parts[nb].vy = rand()%20-10;