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

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

View File

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

View File

@ -1994,6 +1994,11 @@ void Simulation::init_can_move()
can_move[t][PT_VOID] = 3;
can_move[t][PT_EMBR] = 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++)
{
@ -2234,6 +2239,12 @@ int Simulation::try_move(int i, int x, int y, int nx, int ny)
kill_part(i);
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
return 0;
@ -3853,6 +3864,7 @@ void Simulation::update_particles_i(int start, int inc)
else if (t==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;
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) {
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];
if (!r)
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 nxi;
@ -67,7 +67,7 @@ int Element_BOMB::update(UPDATE_FUNC_ARGS)
for (nxj=-rad; nxj<=rad; nxj++)
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 ((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->pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f;

View File

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

View File

@ -22,16 +22,16 @@ Element_EXOT::Element_EXOT()
Flammable = 0;
Explosive = 0;
Meltable = 0;
Hardness = 20;
Hardness = 2;
Weight = 45;
Weight = 46;
Temperature = R_TEMP-2.0f +273.15f;
HeatConduct = 29;
HeatConduct = 250;
Description = "Exotic matter. Explodes with excess exposure to electrons.";
State = ST_LIQUID;
Properties = TYPE_LIQUID|PROP_NEUTPENETRATE;
Properties = TYPE_LIQUID;
LowPressure = IPL;
LowPressureTransition = NT;
@ -56,7 +56,7 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) {
r = pmap[y+ry][x+rx];
if (!r)
continue;
if ((r&0xFF)==PT_WARP)
if ((r&0xFF) == PT_WARP)
{
if (parts[r>>8].tmp2>2000)
if (1>rand()%100)
@ -64,8 +64,22 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) {
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;
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 ((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
{
float frequency = 0.01300;
float frequency = 0.01300;
*colr = (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));

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)
parts[i].tmp = 1;
else
parts[i].tmp = 0;
return 0;
}

View File

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

View File

@ -46,6 +46,11 @@ Element_SWCH::Element_SWCH()
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)
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
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)))
//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 (!(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;
}
//turn on SWCH from two red BRAYS
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;
if (parts[i].life == 10)
parts[i].life = 9;
else if (parts[i].life <= 5)
parts[i].life = 14;
}
return 0;
}

View File

@ -4,9 +4,9 @@ Element_VIBR::Element_VIBR()
{
Identifier = "DEFAULT_PT_VIBR";
Name = "VIBR";
Colour = PIXPACK(0x002900);
Colour = PIXPACK(0x005000);
MenuVisible = 1;
MenuSection = SC_SOLIDS;
MenuSection = SC_NUCLEAR;
Enabled = 1;
Advection = 0.0f;
@ -26,7 +26,7 @@ Element_VIBR::Element_VIBR()
Weight = 100;
Temperature = R_TEMP+0.0f +273.15f;
Temperature = 273.15f;
HeatConduct = 251;
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))
{
r = pmap[y+ry][x+rx];
if ((r&0xFF)!=PT_VIBR)
if ((r&0xFF) != parts[i].type)
continue;
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)
int Element_VIBR::update(UPDATE_FUNC_ARGS) {
int r, rx, ry, transfer, trade;
if (!parts[i].life)
int r, rx, ry;
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
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)
if (parts[i].temp > 274.65f)
{
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].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]++;
}
//initiate explosion counter
if (parts[i].tmp > 1000)
parts[i].life = 750;
}
//Release sparks before explode
if (parts[i].life && parts[i].life < 300)
else //if it is exploding
{
rx = rand()%3-1;
ry = rand()%3-1;
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)
//Release sparks before explode
if (parts[i].life < 300)
{
rx = rand()%3-1;
ry = rand()%3-1;
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[i].ctype -= parts[i].ctype*2;
parts[r>>8].life = 4;
parts[r>>8].ctype = r&0xFF;
sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK);
}
}
}
//Explosion code
if (parts[i].life == 1)
{
sim->create_part(i, x, y, PT_EXOT);
parts[i].tmp2 = 100;
int random = rand(), index;
index = sim->create_part(-3,x+(random&3)-1,y+((random>>2)&3)-1,PT_ELEC);
if (index != -1)
parts[index].temp = 7000;
index = sim->create_part(-3,x+((random>>4)&3)-1,y+((random>>6)&3)-1,PT_NEUT);
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(-3,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]=200;
//Release all heat
if (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)
{
r = pmap[y+ry][x+rx];
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))
{
parts[r>>8].temp += parts[i].tmp*3;
parts[i].tmp = 0;
}
}
}
//Explosion code
if (parts[i].life == 1)
{
int random = rand(), index;
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
for (rx=-3; rx<4; rx++)
for (ry=-3; ry<4; ry++)
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))
{
r = pmap[y+ry][x+rx];
if (!r || (r & (abs(rx) == 3 || abs(ry) == 3)) )
if (!r)
r = sim->photons[y+ry][x+rx];
if (!r)
continue;
//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
if (sim->elements[r&0xFF].Properties & TYPE_ENERGY)
{
parts[i].tmp2++;
sim->kill_part(r>>8);
}
if ((r&0xFF)==PT_BOYL)
else if ((r&0xFF) == PT_ANAR)
{
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, tmp2));
transferProp(UPDATE_FUNC_SUBCALL_ARGS, offsetof(Particle, ctype));
if (parts[i].tmp < 0)
parts[i].tmp = 0; // only preventing because negative tmp doesn't save
return 0;
}
//#TPT-Directive ElementHeader Element_VIBR static int graphics(GRAPHICS_FUNC_ARGS)
int Element_VIBR::graphics(GRAPHICS_FUNC_ARGS)
{
float maxtemp = std::max((float)cpart->tmp, cpart->temp);
int gradient = std::max(cpart->ctype/12.0f, (float)cpart->tmp);
gradient = std::max(gradient, cpart->tmp2);
int gradient = cpart->tmp/10;
if (gradient >= 100 || cpart->life)
{
*pixel_mode = PMODE_NONE;
*pixel_mode |= FIRE_BLEND;
*colr = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f);
*colg = 255;
*colb = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f);
*firea = 90;
*colr = 146;
*colg = 158;
*colb = 113;
*firer = *colr;
*fireg = *colg;
*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);
*colg += (int)restrict_flt((gradient-94)*17.5+87,87,192);
*colb += (int)restrict_flt((gradient-94)*19.7+100,100,218);
}
else if (gradient >= 63 && gradient < 94)
{
*colr += (int)restrict_flt((gradient-63)*1.58+51,51,100);
*colg += (int)restrict_flt((gradient-63)*1.03+55,55,87);
*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);
*colr += (int)restrict_flt(gradient*2.0f,0,255);
*colg += (int)restrict_flt(gradient*2.0f,0,175);
*colb += (int)restrict_flt(gradient*2.0f,0,255);
*firea = (int)restrict_flt(gradient*.6f,0,60);
*firer = *colr/2;
*fireg = *colg/2;
*fireb = *colb/2;
*pixel_mode |= FIRE_BLEND;
}
return 0;
}