Merge branch 'master' of github.com:FacialTurd/PowderToypp

This commit is contained in:
Simon Robertshaw
2012-11-05 20:10:35 +00:00
9 changed files with 163 additions and 126 deletions

View File

@@ -25,7 +25,7 @@
#endif #endif
#ifndef BUILD_NUM #ifndef BUILD_NUM
#define BUILD_NUM 232 #define BUILD_NUM 246
#endif #endif
#ifndef SNAPSHOT_ID #ifndef SNAPSHOT_ID

View File

@@ -1994,6 +1994,11 @@ void Simulation::init_can_move()
can_move[t][PT_VOID] = 3; can_move[t][PT_VOID] = 3;
can_move[t][PT_EMBR] = 0; can_move[t][PT_EMBR] = 0;
can_move[PT_EMBR][t] = 0; can_move[PT_EMBR][t] = 0;
if (elements[t].Properties&TYPE_ENERGY)
{
can_move[t][PT_VIBR] = 1;
can_move[t][PT_BVBR] = 1;
}
} }
for (t=0;t<PT_NUM;t++) for (t=0;t<PT_NUM;t++)
{ {
@@ -2234,6 +2239,12 @@ int Simulation::try_move(int i, int x, int y, int nx, int ny)
kill_part(i); kill_part(i);
return 0; return 0;
} }
if (((r&0xFF)==PT_VIBR || (r&0xFF)==PT_BVBR) && (elements[parts[i].type].Properties & TYPE_ENERGY))
{
parts[r>>8].tmp += 20;
kill_part(i);
return 0;
}
if (parts[i].type==PT_CNCT && y<ny && (pmap[y+1][x]&0xFF)==PT_CNCT)//check below CNCT for another CNCT if (parts[i].type==PT_CNCT && y<ny && (pmap[y+1][x]&0xFF)==PT_CNCT)//check below CNCT for another CNCT
return 0; return 0;
@@ -3853,6 +3864,7 @@ void Simulation::update_particles_i(int start, int inc)
else if (t==PT_LAVA) { else if (t==PT_LAVA) {
if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && parts[i].ctype!=PT_LAVA) { if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && parts[i].ctype!=PT_LAVA) {
if (parts[i].ctype==PT_THRM&&pt>=elements[PT_BMTL].HighTemperature) s = 0; if (parts[i].ctype==PT_THRM&&pt>=elements[PT_BMTL].HighTemperature) s = 0;
else if ((parts[i].ctype==PT_VIBR || parts[i].ctype==PT_BVBR) && pt>=273.15f) s = 0;
else if (elements[parts[i].ctype].HighTemperatureTransition==PT_LAVA) { else if (elements[parts[i].ctype].HighTemperatureTransition==PT_LAVA) {
if (pt>=elements[parts[i].ctype].HighTemperature) s = 0; if (pt>=elements[parts[i].ctype].HighTemperature) s = 0;
} }

View File

@@ -58,7 +58,7 @@ int Element_BOMB::update(UPDATE_FUNC_ARGS)
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if ((r&0xFF)!=PT_BOMB && (r&0xFF)!=PT_EMBR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_BCLN) if ((r&0xFF)!=PT_BOMB && (r&0xFF)!=PT_EMBR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_BCLN && (r&0xFF)!=PT_VIBR)
{ {
int rad = 8; int rad = 8;
int nxi; int nxi;
@@ -67,7 +67,7 @@ int Element_BOMB::update(UPDATE_FUNC_ARGS)
for (nxj=-rad; nxj<=rad; nxj++) for (nxj=-rad; nxj<=rad; nxj++)
for (nxi=-rad; nxi<=rad; nxi++) for (nxi=-rad; nxi<=rad; nxi++)
if ((pow((float)nxi,2))/(pow((float)rad,2))+(pow((float)nxj,2))/(pow((float)rad,2))<=1) if ((pow((float)nxi,2))/(pow((float)rad,2))+(pow((float)nxj,2))/(pow((float)rad,2))<=1)
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) 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 && (pmap[y+nxj][x+nxi]&0xFF)!=PT_VIBR)
{ {
sim->delete_part(x+nxi, y+nxj, 0); sim->delete_part(x+nxi, y+nxj, 0);
sim->pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f; sim->pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f;

View File

@@ -4,7 +4,7 @@ Element_BVBR::Element_BVBR()
{ {
Identifier = "DEFAULT_PT_BVBR"; Identifier = "DEFAULT_PT_BVBR";
Name = "BVBR"; Name = "BVBR";
Colour = PIXPACK(0x002900); Colour = PIXPACK(0x005000);
MenuVisible = 1; MenuVisible = 1;
MenuSection = SC_POWDERS; MenuSection = SC_POWDERS;
Enabled = 1; Enabled = 1;
@@ -16,7 +16,7 @@ Element_BVBR::Element_BVBR()
Collision = 0.0f; Collision = 0.0f;
Gravity = 0.15f; Gravity = 0.15f;
Diffusion = 0.00f; Diffusion = 0.00f;
HotAir = 0.0003f * CFDS; HotAir = 0.0000f * CFDS;
Falldown = 1; Falldown = 1;
Flammable = 0; Flammable = 0;

View File

@@ -22,16 +22,16 @@ Element_EXOT::Element_EXOT()
Flammable = 0; Flammable = 0;
Explosive = 0; Explosive = 0;
Meltable = 0; Meltable = 0;
Hardness = 20; Hardness = 2;
Weight = 45; Weight = 46;
Temperature = R_TEMP-2.0f +273.15f; Temperature = R_TEMP-2.0f +273.15f;
HeatConduct = 29; HeatConduct = 250;
Description = "Exotic matter. Explodes with excess exposure to electrons."; Description = "Exotic matter. Explodes with excess exposure to electrons.";
State = ST_LIQUID; State = ST_LIQUID;
Properties = TYPE_LIQUID|PROP_NEUTPENETRATE; Properties = TYPE_LIQUID;
LowPressure = IPL; LowPressure = IPL;
LowPressureTransition = NT; LowPressureTransition = NT;
@@ -56,7 +56,7 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) {
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if ((r&0xFF)==PT_WARP) if ((r&0xFF) == PT_WARP)
{ {
if (parts[r>>8].tmp2>2000) if (parts[r>>8].tmp2>2000)
if (1>rand()%100) if (1>rand()%100)
@@ -64,8 +64,22 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) {
parts[i].tmp2 += 100; parts[i].tmp2 += 100;
} }
} }
if ((r&0xFF)==PT_EXOT && parts[r>>8].life==1500 && 1>rand()%1000) else if ((r&0xFF) == PT_EXOT && parts[r>>8].life == 1500 && 1>rand()%1000)
parts[i].life = 1500; parts[i].life = 1500;
else if ((r&0xFF) == PT_LAVA)
{
if (parts[r>>8].ctype == PT_TTAN && 1>rand()%10)
{
parts[r>>8].ctype = PT_VIBR;
sim->kill_part(i);
return 1;
}
/*else if (parts[r>>8].ctype == PT_VIBR && 1>rand()%1000)
{
sim->kill_part(i);
return 1;
}*/
}
if ((parts[i].tmp>245) && (parts[i].life>1000)) if ((parts[i].tmp>245) && (parts[i].life>1000))
if ((r&0xFF)!=PT_EXOT && (r&0xFF)!=PT_BREC && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PRTI && (r&0xFF)!=PT_PRTO && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_NBHL && (r&0xFF)!=PT_WARP && (r&0xFF)!=PT_NEUT) if ((r&0xFF)!=PT_EXOT && (r&0xFF)!=PT_BREC && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PRTI && (r&0xFF)!=PT_PRTO && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_PHOT && (r&0xFF)!=PT_VOID && (r&0xFF)!=PT_NBHL && (r&0xFF)!=PT_WARP && (r&0xFF)!=PT_NEUT)
{ {
@@ -179,7 +193,7 @@ int Element_EXOT::graphics(GRAPHICS_FUNC_ARGS)
} }
else else
{ {
float frequency = 0.01300; float frequency = 0.01300;
*colr = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80)); *colr = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80));
*colg = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80)); *colg = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80));
*colb = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80)); *colb = (sin(frequency*q + 6.00) * 127 + ((b/2.9) + 80));

View File

@@ -51,6 +51,8 @@ int Element_INVIS::update(UPDATE_FUNC_ARGS)
{ {
if (sim->pv[y/CELL][x/CELL]>4.0f || sim->pv[y/CELL][x/CELL]<-4.0f) if (sim->pv[y/CELL][x/CELL]>4.0f || sim->pv[y/CELL][x/CELL]<-4.0f)
parts[i].tmp = 1; parts[i].tmp = 1;
else
parts[i].tmp = 0;
return 0; return 0;
} }

View File

@@ -35,8 +35,8 @@ Element_PPIP::Element_PPIP()
LowPressure = IPL; LowPressure = IPL;
LowPressureTransition = NT; LowPressureTransition = NT;
HighPressure = 10.0f; HighPressure = IPH;
HighPressureTransition = PT_BRMT; HighPressureTransition = NT;
LowTemperature = ITL; LowTemperature = ITL;
LowTemperatureTransition = NT; LowTemperatureTransition = NT;
HighTemperature = ITH; HighTemperature = ITH;

View File

@@ -46,6 +46,11 @@ Element_SWCH::Element_SWCH()
Graphics = &Element_SWCH::graphics; Graphics = &Element_SWCH::graphics;
} }
bool isRedBRAY(UPDATE_FUNC_ARGS, int xc, int yc)
{
return (pmap[yc][xc]&0xFF) == PT_BRAY && parts[pmap[yc][xc]>>8].tmp == 2;
}
//#TPT-Directive ElementHeader Element_SWCH static int update(UPDATE_FUNC_ARGS) //#TPT-Directive ElementHeader Element_SWCH static int update(UPDATE_FUNC_ARGS)
int Element_SWCH::update(UPDATE_FUNC_ARGS) int Element_SWCH::update(UPDATE_FUNC_ARGS)
{ {
@@ -78,15 +83,13 @@ int Element_SWCH::update(UPDATE_FUNC_ARGS)
} }
} }
} }
//turn off SWCH from two red BRAYS //turn SWCH on/off from two red BRAYS. There must be one either above or below, and one either left or right to work, and it can't come from the side, it must be a diagonal beam
if (parts[i].life==10 && (!(pmap[y-1][x-1]&0xFF) && ((pmap[y-1][x]&0xFF)==PT_BRAY&&parts[pmap[y-1][x]>>8].tmp==2) && !(pmap[y-1][x+1]&0xFF) && ((pmap[y][x+1]&0xFF)==PT_BRAY&&parts[pmap[y][x+1]>>8].tmp==2))) if (!(pmap[y-1][x-1]&0xFF) && !(pmap[y-1][x+1]&0xFF) && (isRedBRAY(UPDATE_FUNC_SUBCALL_ARGS, x, y-1) || isRedBRAY(UPDATE_FUNC_SUBCALL_ARGS, x, y+1)) && (isRedBRAY(UPDATE_FUNC_SUBCALL_ARGS, x+1, y) || isRedBRAY(UPDATE_FUNC_SUBCALL_ARGS, x-1, y)))
{ {
parts[i].life = 9; if (parts[i].life == 10)
} parts[i].life = 9;
//turn on SWCH from two red BRAYS else if (parts[i].life <= 5)
else if (parts[i].life<=5 && (!(pmap[y-1][x-1]&0xFF) && (((pmap[y-1][x]&0xFF)==PT_BRAY&&parts[pmap[y-1][x]>>8].tmp==2) || ((pmap[y+1][x]&0xFF)==PT_BRAY&&parts[pmap[y+1][x]>>8].tmp==2)) && !(pmap[y-1][x+1]&0xFF) && (((pmap[y][x+1]&0xFF)==PT_BRAY&&parts[pmap[y][x+1]>>8].tmp==2) || ((pmap[y][x-1]&0xFF)==PT_BRAY&&parts[pmap[y][x-1]>>8].tmp==2)))) parts[i].life = 14;
{
parts[i].life = 14;
} }
return 0; return 0;
} }

View File

@@ -4,9 +4,9 @@ Element_VIBR::Element_VIBR()
{ {
Identifier = "DEFAULT_PT_VIBR"; Identifier = "DEFAULT_PT_VIBR";
Name = "VIBR"; Name = "VIBR";
Colour = PIXPACK(0x002900); Colour = PIXPACK(0x005000);
MenuVisible = 1; MenuVisible = 1;
MenuSection = SC_SOLIDS; MenuSection = SC_NUCLEAR;
Enabled = 1; Enabled = 1;
Advection = 0.0f; Advection = 0.0f;
@@ -26,7 +26,7 @@ Element_VIBR::Element_VIBR()
Weight = 100; Weight = 100;
Temperature = R_TEMP+0.0f +273.15f; Temperature = 273.15f;
HeatConduct = 251; HeatConduct = 251;
Description = "Vibranium. Stores energy and releases it in violent explosions."; Description = "Vibranium. Stores energy and releases it in violent explosions.";
@@ -57,7 +57,7 @@ void transferProp(UPDATE_FUNC_ARGS, int propOffset)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{ {
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if ((r&0xFF)!=PT_VIBR) if ((r&0xFF) != parts[i].type)
continue; continue;
if (*((int*)(((char*)&parts[i])+propOffset)) > *((int*)(((char*)&parts[r>>8])+propOffset))) if (*((int*)(((char*)&parts[i])+propOffset)) > *((int*)(((char*)&parts[r>>8])+propOffset)))
{ {
@@ -81,152 +81,158 @@ void transferProp(UPDATE_FUNC_ARGS, int propOffset)
//#TPT-Directive ElementHeader Element_VIBR static int update(UPDATE_FUNC_ARGS) //#TPT-Directive ElementHeader Element_VIBR static int update(UPDATE_FUNC_ARGS)
int Element_VIBR::update(UPDATE_FUNC_ARGS) { int Element_VIBR::update(UPDATE_FUNC_ARGS) {
int r, rx, ry, transfer, trade; int r, rx, ry;
if (!parts[i].life) if (parts[i].ctype == 1) //leaving in, just because
{
if (sim->pv[y/CELL][x/CELL] > -2.5 || parts[i].tmp)
{
parts[i].ctype = 0;
sim->part_change_type(i, x, y, PT_VIBR);
}
}
else if (!parts[i].life) //if not exploding
{ {
//Heat absorption code //Heat absorption code
if (parts[i].temp>274.65f) if (parts[i].temp > 274.65f)
{
parts[i].ctype++;
parts[i].temp-=3;
}
if (parts[i].temp<271.65f)
{
parts[i].ctype--;
parts[i].temp+=3;
}
//Pressure absorption code
if (sim->pv[y/CELL][x/CELL]>2.5)
{ {
parts[i].tmp++; parts[i].tmp++;
sim->pv[y/CELL][x/CELL]--; parts[i].temp -= 3;
} }
if (sim->pv[y/CELL][x/CELL]<-2.5) if (parts[i].temp < 271.65f)
{ {
parts[i].tmp--; parts[i].tmp--;
parts[i].temp += 3;
}
//Pressure absorption code
if (sim->pv[y/CELL][x/CELL] > 2.5)
{
parts[i].tmp += 7;
sim->pv[y/CELL][x/CELL]--;
}
if (sim->pv[y/CELL][x/CELL] < -2.5)
{
parts[i].tmp -= 2;
sim->pv[y/CELL][x/CELL]++; sim->pv[y/CELL][x/CELL]++;
} }
//initiate explosion counter
if (parts[i].tmp > 1000)
parts[i].life = 750;
} }
//Release sparks before explode else //if it is exploding
if (parts[i].life && parts[i].life < 300)
{ {
rx = rand()%3-1; //Release sparks before explode
ry = rand()%3-1; if (parts[i].life < 300)
r = pmap[y+ry][x+rx];
if ((r&0xFF) && (r&0xFF) != PT_BREC && (sim->elements[r&0xFF].Properties&PROP_CONDUCTS) && !parts[r>>8].life)
{
parts[r>>8].life = 4;
parts[r>>8].ctype = r>>8;
sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK);
}
}
//initiate explosion counter
if (!parts[i].life && (parts[i].ctype > 1200 || parts[i].tmp > 100 || parts[i].tmp2 > 100))
parts[i].life = 750;
//Release all heat
if (parts[i].life && parts[i].life < 500)
{
int random = rand();
rx = random%7-3;
ry = (random>>3)%7-3;
if(x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES)
{ {
rx = rand()%3-1;
ry = rand()%3-1;
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if ((r&0xFF) && (r&0xFF)!=PT_VIBR) if ((r&0xFF) && (r&0xFF) != PT_BREC && (sim->elements[r&0xFF].Properties&PROP_CONDUCTS) && !parts[r>>8].life)
{ {
parts[r>>8].temp += parts[i].ctype*6; parts[r>>8].life = 4;
parts[i].ctype -= parts[i].ctype*2; parts[r>>8].ctype = r&0xFF;
sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK);
} }
} }
} //Release all heat
//Explosion code if (parts[i].life < 500)
if (parts[i].life == 1) {
{ int random = rand();
sim->create_part(i, x, y, PT_EXOT); rx = random%7-3;
parts[i].tmp2 = 100; ry = (random>>3)%7-3;
int random = rand(), index; if(x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES)
index = sim->create_part(-3,x+(random&3)-1,y+((random>>2)&3)-1,PT_ELEC); {
if (index != -1) r = pmap[y+ry][x+rx];
parts[index].temp = 7000; if ((r&0xFF) && (r&0xFF)!=PT_VIBR && (r&0xFF)!=PT_BVBR && sim->elements[r&0xFF].HeatConduct && ((r&0xFF)!=PT_HSWC||parts[r>>8].life==10))
index = sim->create_part(-3,x+((random>>4)&3)-1,y+((random>>6)&3)-1,PT_NEUT); {
if (index != -1) parts[r>>8].temp += parts[i].tmp*3;
parts[index].temp = 7000; parts[i].tmp = 0;
index = sim->create_part(-3,x+((random>>8)&3)-1,y+((random>>10)&3)-1,PT_PHOT); }
if (index != -1) }
parts[index].temp = 7000; }
index = sim->create_part(-3,x+((random>>12)&3)-1,y+rand()%3-1,PT_BREC); //Explosion code
if (index != -1) if (parts[i].life == 1)
parts[index].temp = 7000; {
parts[i].temp=9000; int random = rand(), index;
sim->pv[y/CELL][x/CELL]=200; sim->create_part(i, x, y, PT_EXOT);
parts[i].tmp2 = rand()%1000;
index = sim->create_part(-3,x+((random>>4)&3)-1,y+((random>>6)&3)-1,PT_ELEC);
if (index != -1)
parts[index].temp = 7000;
index = sim->create_part(-3,x+((random>>8)&3)-1,y+((random>>10)&3)-1,PT_PHOT);
if (index != -1)
parts[index].temp = 7000;
index = sim->create_part(-1,x+((random>>12)&3)-1,y+rand()%3-1,PT_BREC);
if (index != -1)
parts[index].temp = 7000;
parts[i].temp=9000;
sim->pv[y/CELL][x/CELL] += 50;
return 1;
}
} }
//Neighbor check loop //Neighbor check loop
for (rx=-3; rx<4; rx++) for (rx=-2; rx<3; rx++)
for (ry=-3; ry<4; ry++) for (ry=-2; ry<3; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{ {
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r || (r & (abs(rx) == 3 || abs(ry) == 3)) ) if (!r)
r = sim->photons[y+ry][x+rx]; r = sim->photons[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
//Melts into EXOT //Melts into EXOT
if ((r&0xFF)==PT_EXOT && !(rand()%250)) if ((r&0xFF) == PT_EXOT && !(rand()%250))
{ {
sim->part_change_type(i,x,y,PT_EXOT); sim->create_part(i, x, y, PT_EXOT);
} }
//Absorbs energy particles else if ((r&0xFF) == PT_ANAR)
if (sim->elements[r&0xFF].Properties & TYPE_ENERGY)
{
parts[i].tmp2++;
sim->kill_part(r>>8);
}
if ((r&0xFF)==PT_BOYL)
{ {
sim->part_change_type(i,x,y,PT_BVBR); sim->part_change_type(i,x,y,PT_BVBR);
sim->pv[y/CELL][x/CELL] -= 1;
}
else if (parts[i].life && ((r&0xFF)==PT_VIBR || (r&0xFF)==PT_BVBR) && !parts[r>>8].life)
{
parts[r>>8].tmp += 10;
}
//Absorbs energy particles
if ((sim->elements[r&0xFF].Properties & TYPE_ENERGY))
{
parts[i].tmp += 20;
sim->kill_part(r>>8);
} }
} }
transferProp(UPDATE_FUNC_SUBCALL_ARGS, offsetof(Particle, tmp)); transferProp(UPDATE_FUNC_SUBCALL_ARGS, offsetof(Particle, tmp));
transferProp(UPDATE_FUNC_SUBCALL_ARGS, offsetof(Particle, tmp2)); if (parts[i].tmp < 0)
transferProp(UPDATE_FUNC_SUBCALL_ARGS, offsetof(Particle, ctype)); parts[i].tmp = 0; // only preventing because negative tmp doesn't save
return 0; return 0;
} }
//#TPT-Directive ElementHeader Element_VIBR static int graphics(GRAPHICS_FUNC_ARGS) //#TPT-Directive ElementHeader Element_VIBR static int graphics(GRAPHICS_FUNC_ARGS)
int Element_VIBR::graphics(GRAPHICS_FUNC_ARGS) int Element_VIBR::graphics(GRAPHICS_FUNC_ARGS)
{ {
float maxtemp = std::max((float)cpart->tmp, cpart->temp); int gradient = cpart->tmp/10;
int gradient = std::max(cpart->ctype/12.0f, (float)cpart->tmp);
gradient = std::max(gradient, cpart->tmp2);
if (gradient >= 100 || cpart->life) if (gradient >= 100 || cpart->life)
{ {
*pixel_mode = PMODE_NONE; *colr = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f);
*pixel_mode |= FIRE_BLEND; *colg = 255;
*colb = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f);
*firea = 90; *firea = 90;
*colr = 146;
*colg = 158;
*colb = 113;
*firer = *colr; *firer = *colr;
*fireg = *colg; *fireg = *colg;
*fireb = *colb; *fireb = *colb;
*pixel_mode = PMODE_NONE;
*pixel_mode |= FIRE_BLEND;
} }
else if (gradient >= 94 && gradient < 100) else if (gradient < 100)
{ {
*colr += (int)restrict_flt((gradient-94)*19.7+100,100,218); *colr += (int)restrict_flt(gradient*2.0f,0,255);
*colg += (int)restrict_flt((gradient-94)*17.5+87,87,192); *colg += (int)restrict_flt(gradient*2.0f,0,175);
*colb += (int)restrict_flt((gradient-94)*19.7+100,100,218); *colb += (int)restrict_flt(gradient*2.0f,0,255);
} *firea = (int)restrict_flt(gradient*.6f,0,60);
else if (gradient >= 63 && gradient < 94) *firer = *colr/2;
{ *fireg = *colg/2;
*colr += (int)restrict_flt((gradient-63)*1.58+51,51,100); *fireb = *colb/2;
*colg += (int)restrict_flt((gradient-63)*1.03+55,55,87); *pixel_mode |= FIRE_BLEND;
*colb += (int)restrict_flt((gradient-63)*1.58+51,51,100);
}
else if (gradient > 31 && gradient < 63)
{
*colr += (int)restrict_flt((gradient-31)*1.59,0,51);
*colg += (int)restrict_flt((gradient-31)*1.72,0,55);
*colb += (int)restrict_flt((gradient-31)*1.59,0,51);
} }
return 0; return 0;
} }