TPT: Replace all explosion sparks with new element (EMBR) 1d5b081942
This commit is contained in:
parent
0afecb5b77
commit
6585a4640b
@ -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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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]++;
|
||||
}
|
||||
}
|
||||
|
@ -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() {}
|
@ -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)
|
||||
{
|
||||
|
@ -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() {}
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user