diff options
| author | jacob1 <jfu614@gmail.com> | 2013-03-23 14:53:49 (GMT) |
|---|---|---|
| committer | jacob1 <jfu614@gmail.com> | 2013-03-23 14:53:49 (GMT) |
| commit | c50e12df28fd069933359026a527ba0c401447de (patch) | |
| tree | 604808a7c01bdc4104eda5a8bcd878cc73a1bc7f /src/simulation/elements/VIBR.cpp | |
| parent | 29e2604f57b2a90a7e7f2480e9665a24c08d0c98 (diff) | |
| download | powder-c50e12df28fd069933359026a527ba0c401447de.zip powder-c50e12df28fd069933359026a527ba0c401447de.tar.gz | |
CFLM defusses VIBR, a few speed improvements to VIBR
Diffstat (limited to 'src/simulation/elements/VIBR.cpp')
| -rw-r--r-- | src/simulation/elements/VIBR.cpp | 124 |
1 files changed, 75 insertions, 49 deletions
diff --git a/src/simulation/elements/VIBR.cpp b/src/simulation/elements/VIBR.cpp index ee57565..0d27702 100644 --- a/src/simulation/elements/VIBR.cpp +++ b/src/simulation/elements/VIBR.cpp @@ -58,7 +58,7 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { parts[i].tmp++; parts[i].temp -= 3; } - if (parts[i].temp < 271.65f) + else if (parts[i].temp < 271.65f) { parts[i].tmp--; parts[i].temp += 3; @@ -69,7 +69,7 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { parts[i].tmp += 7; sim->pv[y/CELL][x/CELL]--; } - if (sim->pv[y/CELL][x/CELL] < -2.5) + else if (sim->pv[y/CELL][x/CELL] < -2.5) { parts[i].tmp -= 2; sim->pv[y/CELL][x/CELL]++; @@ -83,8 +83,9 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { //Release sparks before explode if (parts[i].life < 300) { - rx = rand()%3-1; - ry = rand()%3-1; + int randstore = rand(); + rx = randstore%3-1; + ry = (randstore>>2)%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) { @@ -112,27 +113,36 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { //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; + if (!parts[i].tmp2) + { + 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; + return 1; + } + else + { + parts[i].tmp2 = 0; + parts[i].temp = 273.15f; + parts[i].tmp = 0; + } } } //Neighbor check loop - for (rx=-2; rx<3; rx++) - for (ry=-2; ry<3; ry++) + for (rx=-1; rx<2; rx++) + for (ry=-1; ry<2; ry++) if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; @@ -140,25 +150,44 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { r = sim->photons[y+ry][x+rx]; if (!r) continue; - //Melts into EXOT - if ((r&0xFF) == PT_EXOT && !(rand()%250) && !parts[i].life) + if (parts[i].life) { - sim->create_part(i, x, y, PT_EXOT); - } - else if ((r&0xFF) == PT_ANAR) - { - sim->part_change_type(i,x,y,PT_BVBR); - sim->pv[y/CELL][x/CELL] -= 1; + //Makes EXOT around it get tmp to start exploding too + if (((r&0xFF)==PT_VIBR || (r&0xFF)==PT_BVBR)) + { + if (!parts[r>>8].life) + parts[r>>8].tmp += 45; + else if (parts[i].tmp2 && rand()%2) + { + parts[r>>8].tmp2 = 1; + parts[i].tmp = 0; + } + } + else if ((r&0xFF)==PT_CFLM) + { + parts[i].tmp2 = 1; + parts[i].tmp = 0; + } } - else if (((r&0xFF)==PT_VIBR || (r&0xFF)==PT_BVBR) && parts[i].life && !parts[r>>8].life) + else { - parts[r>>8].tmp += 10; + //Melts into EXOT + if ((r&0xFF) == PT_EXOT && !(rand()%25)) + { + sim->create_part(i, x, y, PT_EXOT); + } + //Absorbs energy particles + else if ((sim->elements[r&0xFF].Properties & TYPE_ENERGY)) + { + parts[i].tmp += 20; + sim->kill_part(r>>8); + } } - //Absorbs energy particles - else if ((sim->elements[r&0xFF].Properties & TYPE_ENERGY) && !parts[i].life) + //VIBR+ANAR=BVBR + if (parts[i].type != PT_BVBR && (r&0xFF) == PT_ANAR) { - parts[i].tmp += 20; - sim->kill_part(r>>8); + sim->part_change_type(i,x,y,PT_BVBR); + sim->pv[y/CELL][x/CELL] -= 1; } } for (trade = 0; trade < 9; trade++) @@ -174,18 +203,9 @@ int Element_VIBR::update(UPDATE_FUNC_ARGS) { if (parts[i].tmp > parts[r>>8].tmp) { transfer = parts[i].tmp - parts[r>>8].tmp; - if (transfer == 1) - { - parts[r>>8].tmp += 1; - parts[i].tmp -= 1; - trade = 9; - } - else if (transfer > 0) - { - parts[r>>8].tmp += transfer/2; - parts[i].tmp -= transfer/2; - trade = 9; - } + parts[r>>8].tmp += transfer/2; + parts[i].tmp -= transfer/2; + break; } } } @@ -201,8 +221,14 @@ int Element_VIBR::graphics(GRAPHICS_FUNC_ARGS) if (gradient >= 100 || cpart->life) { *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); + if (cpart->tmp2) + *colg = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f); + else + *colg = 255; + if (cpart->tmp2) + *colb = 255; + else + *colb = (int)(fabs(sin(exp((750.0f-cpart->life)/170)))*200.0f); *firea = 90; *firer = *colr; *fireg = *colg; |
