diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-11-05 20:10:35 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-11-05 20:10:35 (GMT) |
| commit | 150a2e528ee41cb596b59c8a3c9ec62e9bf686fa (patch) | |
| tree | 4aa02da9f38c5f24acc5ac1176d4010ace8fc8dd /src/simulation/elements | |
| parent | 8614a2d9638da8ee6982e2a8eadf95eaf5365aa6 (diff) | |
| parent | 7da144fbae1dac390ddf3bbcc69a990cf91398ac (diff) | |
| download | powder-150a2e528ee41cb596b59c8a3c9ec62e9bf686fa.zip powder-150a2e528ee41cb596b59c8a3c9ec62e9bf686fa.tar.gz | |
Merge branch 'master' of github.com:FacialTurd/PowderToypp
Diffstat (limited to 'src/simulation/elements')
| -rw-r--r-- | src/simulation/elements/BOMB.cpp | 4 | ||||
| -rw-r--r-- | src/simulation/elements/BVBR.cpp | 4 | ||||
| -rw-r--r-- | src/simulation/elements/EXOT.cpp | 28 | ||||
| -rw-r--r-- | src/simulation/elements/INVIS.cpp | 2 | ||||
| -rw-r--r-- | src/simulation/elements/PPIP.cpp | 4 | ||||
| -rw-r--r-- | src/simulation/elements/SWCH.cpp | 19 | ||||
| -rw-r--r-- | src/simulation/elements/VIBR.cpp | 202 |
7 files changed, 144 insertions, 119 deletions
diff --git a/src/simulation/elements/BOMB.cpp b/src/simulation/elements/BOMB.cpp index 8aaa722..0335e59 100644 --- a/src/simulation/elements/BOMB.cpp +++ b/src/simulation/elements/BOMB.cpp @@ -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; diff --git a/src/simulation/elements/BVBR.cpp b/src/simulation/elements/BVBR.cpp index 994027e..dfff186 100644 --- a/src/simulation/elements/BVBR.cpp +++ b/src/simulation/elements/BVBR.cpp @@ -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; diff --git a/src/simulation/elements/EXOT.cpp b/src/simulation/elements/EXOT.cpp index 2f96254..03eca2f 100644 --- a/src/simulation/elements/EXOT.cpp +++ b/src/simulation/elements/EXOT.cpp @@ -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)); diff --git a/src/simulation/elements/INVIS.cpp b/src/simulation/elements/INVIS.cpp index 03f2d69..54d722d 100644 --- a/src/simulation/elements/INVIS.cpp +++ b/src/simulation/elements/INVIS.cpp @@ -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; } diff --git a/src/simulation/elements/PPIP.cpp b/src/simulation/elements/PPIP.cpp index 799c25d..03830a7 100644 --- a/src/simulation/elements/PPIP.cpp +++ b/src/simulation/elements/PPIP.cpp @@ -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; diff --git a/src/simulation/elements/SWCH.cpp b/src/simulation/elements/SWCH.cpp index fa8e49e..818af27 100644 --- a/src/simulation/elements/SWCH.cpp +++ b/src/simulation/elements/SWCH.cpp @@ -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))) - { - 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)))) + //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 = 14; + if (parts[i].life == 10) + parts[i].life = 9; + else if (parts[i].life <= 5) + parts[i].life = 14; } return 0; } diff --git a/src/simulation/elements/VIBR.cpp b/src/simulation/elements/VIBR.cpp index 02c97fa..0a7c470 100644 --- a/src/simulation/elements/VIBR.cpp +++ b/src/simulation/elements/VIBR.cpp @@ -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) + if (parts[i].temp > 274.65f) { - parts[i].ctype++; - parts[i].temp-=3; + parts[i].tmp++; + parts[i].temp -= 3; } - if (parts[i].temp<271.65f) + if (parts[i].temp < 271.65f) { - parts[i].ctype--; - parts[i].temp+=3; + parts[i].tmp--; + parts[i].temp += 3; } //Pressure absorption code - if (sim->pv[y/CELL][x/CELL]>2.5) + if (sim->pv[y/CELL][x/CELL] > 2.5) { - parts[i].tmp++; + parts[i].tmp += 7; sim->pv[y/CELL][x/CELL]--; } - if (sim->pv[y/CELL][x/CELL]<-2.5) + if (sim->pv[y/CELL][x/CELL] < -2.5) { - parts[i].tmp--; + 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) + //Release sparks before explode + if (parts[i].life < 300) { - parts[r>>8].life = 4; - parts[r>>8].ctype = r>>8; - sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); + 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&0xFF; + 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 all heat + if (parts[i].life < 500) { - r = pmap[y+ry][x+rx]; - if ((r&0xFF) && (r&0xFF)!=PT_VIBR) + 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) { - parts[r>>8].temp += parts[i].ctype*6; - parts[i].ctype -= parts[i].ctype*2; + 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) - { - 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; + //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) + else if ((r&0xFF) == PT_ANAR) { - parts[i].tmp2++; - sim->kill_part(r>>8); + sim->part_change_type(i,x,y,PT_BVBR); + sim->pv[y/CELL][x/CELL] -= 1; } - if ((r&0xFF)==PT_BOYL) + else if (parts[i].life && ((r&0xFF)==PT_VIBR || (r&0xFF)==PT_BVBR) && !parts[r>>8].life) { - sim->part_change_type(i,x,y,PT_BVBR); + 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) - { - *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) + else if (gradient < 100) { - *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; } |
