TPT: Replace all explosion sparks with new element (EMBR) 1d5b081942

This commit is contained in:
Simon Robertshaw 2012-07-25 17:12:15 +01:00
parent 0afecb5b77
commit 6585a4640b
9 changed files with 111 additions and 156 deletions

View File

@ -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]));
}
}
}
}

View File

@ -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()<RAND_MAX/2) ||
@ -2748,6 +2746,9 @@ int Simulation::create_part(int p, int x, int y, int tv)//the function for creat
parts[i].life = 1000;
parts[i].tmp = 244;
break;
case PT_EMBR:
parts[i].life = 50;
break;
case PT_STKM:
if (player.spwn==0)
{
@ -4242,7 +4243,7 @@ void Simulation::update_particles()//doesn't update the particles themselves, bu
// To make particles collide correctly when inside these elements, these elements must not overwrite an existing pmap entry from particles inside them
if (!pmap[y][x] || (t!=PT_INVIS && t!= PT_FILT))
pmap[y][x] = t|(i<<8);
if (t!=PT_THDR)
if (t!=PT_THDR && t!=PT_EMBR)
pmap_count[y][x]++;
}
}

View File

@ -1,49 +0,0 @@
#include "simulation/Elements.h"
//#TPT-Directive ElementClass Element_147 PT_147 147
Element_147::Element_147()
{
Identifier = "DEFAULT_PT_147";
Name = "WIND";
Colour = PIXPACK(0x101010);
MenuVisible = 0;
MenuSection = SC_SPECIAL;
Enabled = 0;
Advection = 0.0f;
AirDrag = 0.00f * CFDS;
AirLoss = 0.90f;
Loss = 0.00f;
Collision = 0.0f;
Gravity = 0.0f;
Diffusion = 0.00f;
HotAir = 0.000f * CFDS;
Falldown = 0;
Flammable = 0;
Explosive = 0;
Meltable = 0;
Hardness = 0;
Weight = 100;
Temperature = 0.0f;
HeatConduct = 40;
Description = "";
State = ST_NONE;
Properties = ST_NONE;
LowPressure = IPL;
LowPressureTransition = NT;
HighPressure = IPH;
HighPressureTransition = NT;
LowTemperature = ITL;
LowTemperatureTransition = NT;
HighTemperature = ITH;
HighTemperatureTransition = NT;
Update = NULL;
}
Element_147::~Element_147() {}

View File

@ -70,7 +70,7 @@ int Element_BOMB::update(UPDATE_FUNC_ARGS)
if ((pmap[y+nxj][x+nxi]&0xFF)!=PT_DMND && (pmap[y+nxj][x+nxi]&0xFF)!=PT_CLNE && (pmap[y+nxj][x+nxi]&0xFF)!=PT_PCLN && (pmap[y+nxj][x+nxi]&0xFF)!=PT_BCLN)
{
sim->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)
{

View File

@ -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() {}

View File

@ -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+rrx<XRES && y+ry+rry<YRES) {
nb = sim->create_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;
}

View File

@ -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;

View File

@ -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+rx<XRES && y+ry<YRES && (rx || ry))
@ -62,52 +66,43 @@ int Element_FIRW::update(UPDATE_FUNC_ARGS)
if (rt==PT_FIRE||rt==PT_PLSM||rt==PT_THDR)
{
parts[i].tmp = 1;
parts[i].life = rand()%50+60;
parts[i].life = rand()%40+60;
}
}
}
else if (parts[i].tmp==1) {
if (parts[i].life==0) {
if (parts[i].life<=0) {
parts[i].tmp=2;
} else {
float newVel = parts[i].life/25;
parts[i].flags &= ~FLAG_STAGNANT;
/* TODO:
if ((pmap[(int)(ly-newVel)][(int)lx]&0xFF)==PT_NONE && ly-newVel>0) {
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+rx<XRES && y+ry<YRES && (rx || ry))
{
tmul = rand()%7;
np = sim->create_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;
}

View File

@ -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;