diff options
Diffstat (limited to 'src/simulation/elements/EXOT.cpp')
| -rw-r--r-- | src/simulation/elements/EXOT.cpp | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/src/simulation/elements/EXOT.cpp b/src/simulation/elements/EXOT.cpp index df075e0..e2f6e41 100644 --- a/src/simulation/elements/EXOT.cpp +++ b/src/simulation/elements/EXOT.cpp @@ -47,11 +47,13 @@ Element_EXOT::Element_EXOT() } //#TPT-Directive ElementHeader Element_EXOT static int update(UPDATE_FUNC_ARGS) -int Element_EXOT::update(UPDATE_FUNC_ARGS) { +int Element_EXOT::update(UPDATE_FUNC_ARGS) +{ int r, rt, rx, ry, nb, rrx, rry, trade, tym; for (rx=-2; rx<=2; rx++) for (ry=-2; ry<=2; ry++) - if (BOUNDS_CHECK && (rx || ry)) { + if (BOUNDS_CHECK && (rx || ry)) + { r = pmap[y+ry][x+rx]; if (!r) continue; @@ -65,11 +67,14 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) { } else if (rt == PT_EXOT) { + if (parts[r>>8].ctype == PT_PROT) + parts[i].ctype = PT_PROT; if (parts[r>>8].life == 1500 && !(rand()%1000)) parts[i].life = 1500; } else if (rt == PT_LAVA) { + //turn molten TTAN or molten GOLD to molten VIBR if (parts[r>>8].ctype == PT_TTAN || parts[r>>8].ctype == PT_GOLD) { if (!(rand()%10)) @@ -79,66 +84,71 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) { return 1; } } + //molten VIBR will kill the leftover EXOT though, so the VIBR isn't killed later else if (parts[r>>8].ctype == PT_VIBR) { - if (1>rand()%1000) + if (!(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 (rt!=PT_EXOT && rt!=PT_BREC && rt!=PT_DMND && rt!=PT_CLNE && rt!=PT_PRTI && rt!=PT_PRTO && rt!=PT_PCLN && rt!=PT_VOID && rt!=PT_NBHL && rt!=PT_WARP) { sim->create_part(i, x, y, rt); - return 0; + return 1; } } + parts[i].tmp--; parts[i].tmp2--; - if (parts[i].tmp<1 || parts[i].tmp>250) + //reset tmp every 250 frames, gives EXOT it's slow flashing effect + if (parts[i].tmp < 1 || parts[i].tmp > 250) parts[i].tmp = 250; - if (parts[i].tmp2<1) + + if (parts[i].tmp2 < 1) parts[i].tmp2 = 1; - else if (parts[i].tmp2>6000) + else if (parts[i].tmp2 > 6000) { parts[i].tmp2 = 10000; - if (parts[i].life<1001) + if (parts[i].life < 1001) { sim->part_change_type(i, x, y, PT_WARP); return 0; } } - else if(parts[i].life<1001) + else if(parts[i].life < 1001) sim->pv[y/CELL][x/CELL] += (parts[i].tmp2*CFDS)/160000; + if (sim->pv[y/CELL][x/CELL]>200 && parts[i].temp>9000 && parts[i].tmp2>200) { parts[i].tmp2 = 6000; sim->part_change_type(i, x, y, PT_WARP); return 0; } - if (parts[i].tmp2>100) + if (parts[i].tmp2 > 100) { - for ( trade = 0; trade<9; trade ++) + for (trade = 0; trade < 9; trade++) { rx = rand()%5-2; ry = rand()%5-2; - if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) + if (BOUNDS_CHECK && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; - if ((r&0xFF)==PT_EXOT && (parts[i].tmp2>parts[r>>8].tmp2) && parts[r>>8].tmp2>=0 )//diffusion + if ((r&0xFF)==PT_EXOT && (parts[i].tmp2 > parts[r>>8].tmp2) && parts[r>>8].tmp2 >= 0) //diffusion { tym = parts[i].tmp2 - parts[r>>8].tmp2; - if (tym ==1) + if (tym == 1) { - parts[r>>8].tmp2 ++; - parts[i].tmp2 --; + parts[r>>8].tmp2++; + parts[i].tmp2--; break; } - if (tym>0) + if (tym > 0) { parts[r>>8].tmp2 += tym/2; parts[i].tmp2 -= tym/2; @@ -148,7 +158,17 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) { } } } - if (parts[i].temp<273.15f) + if (parts[i].ctype == PT_PROT) + { + if (parts[i].temp < 50.0f) + { + sim->create_part(i, x, y, PT_CFLM); + return 1; + } + else + parts[i].temp -= 1.0f; + } + else if (parts[i].temp < 273.15f) { parts[i].vx = 0; parts[i].vy = 0; |
