diff --git a/src/simulation/elements/CO2.cpp b/src/simulation/elements/CO2.cpp index 09dbe8c62..9eade3de5 100644 --- a/src/simulation/elements/CO2.cpp +++ b/src/simulation/elements/CO2.cpp @@ -56,7 +56,14 @@ int Element_CO2::update(UPDATE_FUNC_ARGS) { r = pmap[y+ry][x+rx]; if (!r) + { + if (parts[i].ctype==5 && !(rand()%83)) + { + if (sim->create_part(-1, x+rx, y+ry, PT_WATR)>=0) + parts[i].ctype = 0; + } continue; + } if ((r&0xFF)==PT_FIRE){ sim->kill_part(r>>8); if(!(rand()%150)){ @@ -79,11 +86,6 @@ int Element_CO2::update(UPDATE_FUNC_ARGS) } } } - if (parts[i].ctype==5 && !(rand()%83)) - { - if (sim->create_part(-1, x+rx, y+ry, PT_WATR)>=0) - parts[i].ctype = 0; - } if (parts[i].temp > 9773.15 && sim->pv[y/CELL][x/CELL] > 200.0f) { if (!(rand()%5)) diff --git a/src/simulation/elements/DLAY.cpp b/src/simulation/elements/DLAY.cpp index 1bce99925..c0602dbcb 100644 --- a/src/simulation/elements/DLAY.cpp +++ b/src/simulation/elements/DLAY.cpp @@ -68,17 +68,23 @@ int Element_DLAY::update(UPDATE_FUNC_ARGS) } else if ((r&0xFF)==PT_DLAY) { - if(!parts[i].life && parts[r>>8].life) + if (!parts[i].life) { - parts[i].life = parts[r>>8].life; - if((r>>8)>i) //If the other particle hasn't been life updated - parts[i].life--; + if (parts[r>>8].life) + { + parts[i].life = parts[r>>8].life; + if((r>>8)>i) //If the other particle hasn't been life updated + parts[i].life--; + } } - else if(parts[i].life && !parts[r>>8].life) + else { - parts[r>>8].life = parts[i].life; - if((r>>8)>i) //If the other particle hasn't been life updated - parts[r>>8].life++; + if (!parts[r>>8].life) + { + parts[r>>8].life = parts[i].life; + if((r>>8)>i) //If the other particle hasn't been life updated + parts[r>>8].life++; + } } } else if((r&0xFF)==PT_NSCN && oldl==1) diff --git a/src/simulation/elements/DMG.cpp b/src/simulation/elements/DMG.cpp index b89db1cfe..75ad49494 100644 --- a/src/simulation/elements/DMG.cpp +++ b/src/simulation/elements/DMG.cpp @@ -76,15 +76,11 @@ int Element_DMG::update(UPDATE_FUNC_ARGS) angle = atan2((float)nxj, nxi); fx = cos(angle) * 7.0f; fy = sin(angle) * 7.0f; - parts[rr>>8].vx += fx; parts[rr>>8].vy += fy; - sim->vx[(y+nxj)/CELL][(x+nxi)/CELL] += fx; sim->vy[(y+nxj)/CELL][(x+nxi)/CELL] += fy; - sim->pv[(y+nxj)/CELL][(x+nxi)/CELL] += 1.0f; - t = rr&0xFF; if(t && sim->elements[t].HighPressureTransition>-1 && sim->elements[t].HighPressureTransitionpart_change_type(rr>>8, x+nxi, y+nxj, sim->elements[t].HighPressureTransition); diff --git a/src/simulation/elements/DSTW.cpp b/src/simulation/elements/DSTW.cpp index 6c2c7d2e3..cca1b68f7 100644 --- a/src/simulation/elements/DSTW.cpp +++ b/src/simulation/elements/DSTW.cpp @@ -55,35 +55,46 @@ int Element_DSTW::update(UPDATE_FUNC_ARGS) if (x+rx>=0 && y+ry>0 && x+rxpart_change_type(i,x,y,PT_SLTW); - // on average, convert 3 DSTW to SLTW before SALT turns into SLTW - if (!(rand()%3)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_SLTW); - } - if ((rt==PT_WATR||rt==PT_SLTW) && !(rand()%500)) - { - sim->part_change_type(i,x,y,PT_WATR); - } - if (rt==PT_SLTW && !(rand()%10000)) - { - sim->part_change_type(i,x,y,PT_SLTW); - } - if ((rt==PT_RBDM||rt==PT_LRBD) && (sim->legacy_enable||parts[i].temp>12.0f) && !(rand()%500)) - { - sim->part_change_type(i,x,y,PT_FIRE); - parts[i].life = 4; - } - if (rt==PT_FIRE){ + case PT_SALT: + if (!(rand()%250)) + { + sim->part_change_type(i,x,y,PT_SLTW); + // on average, convert 3 DSTW to SLTW before SALT turns into SLTW + if (!(rand()%3)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_SLTW); + } + break; + case PT_SLTW: + if (!(rand()%10000)) + { + sim->part_change_type(i,x,y,PT_SLTW); + break; + } + case PT_WATR: + if (!(rand()%500)) + { + sim->part_change_type(i,x,y,PT_WATR); + } + break; + case PT_RBDM: + case PT_LRBD: + if ((sim->legacy_enable||parts[i].temp>12.0f) && !(rand()%500)) + { + sim->part_change_type(i,x,y,PT_FIRE); + parts[i].life = 4; + } + break; + case PT_FIRE: sim->kill_part(r>>8); if(!(rand()%150)){ sim->kill_part(i); return 1; } + break; + default: + continue; } } return 0; diff --git a/src/simulation/elements/ELEC.cpp b/src/simulation/elements/ELEC.cpp index 307c6ad50..d8a24e934 100644 --- a/src/simulation/elements/ELEC.cpp +++ b/src/simulation/elements/ELEC.cpp @@ -66,12 +66,11 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS) if (!r) continue; rt = r&0xFF; - if (rt==PT_GLAS) + switch (rt) { + case PT_GLAS: for (rrx=-1; rrx<=1; rrx++) - { for (rry=-1; rry<=1; rry++) - { if (x+rx+rrx>=0 && y+ry+rry>=0 && x+rx+rrxcreate_part(-1, x+rx+rrx, y+ry+rry, PT_EMBR); if (nb!=-1) { @@ -82,56 +81,43 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS) parts[nb].vy = rand()%20-10; } } - } - } - //fire_r[y/CELL][x/CELL] += rand()%200; //D: Doesn't work with OpenGL, also shouldn't be here - //fire_g[y/CELL][x/CELL] += rand()%200; - //fire_b[y/CELL][x/CELL] += rand()%200; - /* possible alternative, but doesn't work well at the moment because FIRE_ADD divides firea by 8, so the glow isn't strong enough - create_part(i, x, y, PT_EMBR); - parts[i].tmp = 2; - parts[i].life = 2; - parts[i].ctype = ((rand()%200)<<16) | ((rand()%200)<<8) | (rand()%200); - */ sim->kill_part(i); return 1; - } - if (rt==PT_LCRY) - { + case PT_LCRY: parts[r>>8].tmp2 = 5+rand()%5; - } - if (rt==PT_WATR || rt==PT_DSTW || rt==PT_SLTW || rt==PT_CBNW) - { + break; + case PT_WATR: + case PT_DSTW: + case PT_SLTW: + case PT_CBNW: if(!(rand()%3)) sim->create_part(r>>8, x+rx, y+ry, PT_O2); else sim->create_part(r>>8, x+rx, y+ry, PT_H2); return 1; - } - if (rt==PT_NEUT) - { + case PT_NEUT: sim->part_change_type(r>>8, x+rx, y+ry, PT_H2); parts[r>>8].life = 0; parts[r>>8].ctype = 0; - } - if (rt==PT_DEUT) - { + break; + case PT_DEUT: if(parts[r>>8].life < 6000) parts[r>>8].life += 1; parts[r>>8].temp = 0; sim->kill_part(i); return 1; - } - if (rt==PT_EXOT) - { + case PT_EXOT: parts[r>>8].tmp2 += 5; parts[r>>8].life = 1000; - } - if ((sim->elements[rt].Properties & PROP_CONDUCTS) && (rt!=PT_NBLE||parts[i].temp<2273.15)) - { - sim->create_part(-1, x+rx, y+ry, PT_SPRK); - sim->kill_part(i); - return 1; + break; + default: + if ((sim->elements[rt].Properties & PROP_CONDUCTS) && (rt!=PT_NBLE||parts[i].temp<2273.15)) + { + sim->create_part(-1, x+rx, y+ry, PT_SPRK); + sim->kill_part(i); + return 1; + } + continue; } } return 0; diff --git a/src/simulation/elements/EMP.cpp b/src/simulation/elements/EMP.cpp index 33f9ad384..527f42d84 100644 --- a/src/simulation/elements/EMP.cpp +++ b/src/simulation/elements/EMP.cpp @@ -48,8 +48,8 @@ Element_EMP::Element_EMP() //#TPT-Directive ElementHeader Element_EMP static int update(UPDATE_FUNC_ARGS) int Element_EMP::update(UPDATE_FUNC_ARGS) - { - int r,rx,ry,t,n,nx,ny; +{ + int r,rx,ry,t,n,nx,ny,ntype; if (parts[i].life) return 0; for (rx=-2; rx<3; rx++) @@ -76,18 +76,17 @@ int Element_EMP::update(UPDATE_FUNC_ARGS) if (t==PT_SPRK || (t==PT_SWCH && parts[r].life!=0 && parts[r].life!=10) || (t==PT_WIRE && parts[r].ctype>0)) { int is_elec=0; - if ((parts[r].ctype==PT_PSCN || parts[r].ctype==PT_NSCN || parts[r].ctype==PT_PTCT || - parts[r].ctype==PT_NTCT || parts[r].ctype==PT_INST || parts[r].ctype==PT_SWCH) || t==PT_WIRE || t==PT_SWCH) + if (parts[r].ctype==PT_PSCN || parts[r].ctype==PT_NSCN || parts[r].ctype==PT_PTCT || + parts[r].ctype==PT_NTCT || parts[r].ctype==PT_INST || parts[r].ctype==PT_SWCH || t==PT_WIRE || t==PT_SWCH) { is_elec=1; - if (sim->elements[parts[r].type].HeatConduct && !(rand()%100)) + if (!(rand()%100)) parts[r].temp = restrict_flt(parts[r].temp+3000.0f, MIN_TEMP, MAX_TEMP); if (!(rand()%80)) sim->part_change_type(r, rx, ry, PT_BREC); else if (!(rand()%120)) sim->part_change_type(r, rx, ry, PT_NTCT); } - for (nx=-2; nx<3; nx++) for (ny=-2; ny<3; ny++) if (rx+nx>=0 && ry+ny>=0 && rx+nx>8].temp = restrict_flt(parts[n>>8].temp+3000.0f, MIN_TEMP, MAX_TEMP); + case PT_METL: + if (!(rand()%280)) + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+3000.0f, MIN_TEMP, MAX_TEMP); + if (!(rand()%300)) + sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL); + continue; + case PT_BMTL: + if (!(rand()%280)) + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+3000.0f, MIN_TEMP, MAX_TEMP); + if (!(rand()%160)) + { + sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BRMT); + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); + } + continue; + case PT_WIFI: + if (!(rand()%8)) + { + //Randomise channel + parts[n>>8].temp = rand()%MAX_TEMP; + } + if (!(rand()%16)) + { + sim->create_part(n>>8, rx+nx, ry+ny, PT_BREC); + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); + } + continue; + default: + break; } - if (nt==PT_BMTL && !(rand()%160)) - { - sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BRMT); - parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); - } - if (nt==PT_METL && !(rand()%300)) - { - sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL); - } - if (nt==PT_WIFI && !(rand()%8)) - { - //Randomise channel - parts[n>>8].temp = rand()%MAX_TEMP; - } - if (nt==PT_WIFI && !(rand()%16)) + } + switch (ntype) + { + case PT_SWCH: + if (!(rand()%100)) + sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BREC); + if (!(rand()%100)) + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+2000.0f, MIN_TEMP, MAX_TEMP); + break; + case PT_ARAY: + if (!(rand()%60)) { sim->create_part(n>>8, rx+nx, ry+ny, PT_BREC); parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); } - } - if (nt==PT_SWCH && !(rand()%100)) - { - sim->part_change_type(n>>8, rx+nx, ry+ny, PT_BREC); - } - if (nt==PT_SWCH && !(rand()%100)) - { - parts[n>>8].temp = restrict_flt(parts[n>>8].temp+2000.0f, MIN_TEMP, MAX_TEMP); - } - if (nt==PT_ARAY && !(rand()%60)) - { - sim->create_part(n>>8, rx+nx, ry+ny, PT_BREC); - parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); - } - if (nt==PT_DLAY && !(rand()%70)) - { - //Randomise delay - parts[n>>8].temp = (rand()%256) + 273.15f; + break; + case PT_DLAY: + if (!(rand()%70)) + { + //Randomise delay + parts[n>>8].temp = (rand()%256) + 273.15f; + } + break; + default: + break; } } } diff --git a/src/simulation/elements/EXOT.cpp b/src/simulation/elements/EXOT.cpp index 466fb9caf..140383c32 100644 --- a/src/simulation/elements/EXOT.cpp +++ b/src/simulation/elements/EXOT.cpp @@ -63,8 +63,11 @@ int Element_EXOT::update(UPDATE_FUNC_ARGS) { parts[i].tmp2 += 100; } } - else if (rt == PT_EXOT && parts[r>>8].life == 1500 && !(rand()%1000)) - parts[i].life = 1500; + else if (rt == PT_EXOT) + { + if (parts[r>>8].life == 1500 && !(rand()%1000)) + parts[i].life = 1500; + } else if (rt == PT_LAVA) { if (parts[r>>8].ctype == PT_TTAN && !(rand()%10)) diff --git a/src/simulation/elements/FIRE.cpp b/src/simulation/elements/FIRE.cpp index 37745ab80..35c7758ec 100644 --- a/src/simulation/elements/FIRE.cpp +++ b/src/simulation/elements/FIRE.cpp @@ -50,31 +50,40 @@ Element_FIRE::Element_FIRE() int Element_FIRE::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt, t = parts[i].type; - if (t==PT_PLSM && parts[i].ctype == PT_NBLE && parts[i].life <=1) + switch (t) { - sim->part_change_type(i,x,y,PT_NBLE); - parts[i].life = 0; - } - else if (t==PT_FIRE && parts[i].life <=1) - { - if ((parts[i].tmp&0x3) == 3){ - sim->part_change_type(i,x,y,PT_DSTW); - parts[i].life = 0; - parts[i].ctype = PT_FIRE; - } - else if (parts[i].temp<625) + case PT_PLSM: + if (parts[i].life <=1) { - sim->part_change_type(i,x,y,PT_SMKE); - parts[i].life = rand()%20+250; + if (parts[i].ctype == PT_NBLE) + { + sim->part_change_type(i,x,y,PT_NBLE); + parts[i].life = 0; + } + else if ((parts[i].tmp&0x3) == 3){ + sim->part_change_type(i,x,y,PT_DSTW); + parts[i].life = 0; + parts[i].ctype = PT_FIRE; + } } - } - else if (t==PT_PLSM && parts[i].life <=1) - { - if ((parts[i].tmp&0x3) == 3){ - sim->part_change_type(i,x,y,PT_DSTW); - parts[i].life = 0; - parts[i].ctype = PT_FIRE; + break; + case PT_FIRE: + if (parts[i].life <=1) + { + if ((parts[i].tmp&0x3) == 3){ + sim->part_change_type(i,x,y,PT_DSTW); + parts[i].life = 0; + parts[i].ctype = PT_FIRE; + } + else if (parts[i].temp<625) + { + sim->part_change_type(i,x,y,PT_SMKE); + parts[i].life = rand()%20+250; + } } + break; + default: + break; } for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) diff --git a/src/simulation/elements/FRAY.cpp b/src/simulation/elements/FRAY.cpp index 57e2b2249..5ab7de892 100644 --- a/src/simulation/elements/FRAY.cpp +++ b/src/simulation/elements/FRAY.cpp @@ -49,7 +49,7 @@ Element_FRAY::Element_FRAY() //#TPT-Directive ElementHeader Element_FRAY static int update(UPDATE_FUNC_ARGS) int Element_FRAY::update(UPDATE_FUNC_ARGS) { - int r, nxx, nyy, docontinue, len, nxi, nyi, rx, ry, nr, ry1, rx1; + int r, nxx, nyy, len, nxi, nyi, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx= 0 && y+nyi+nyy >= 0) || len>10) { break; } r = pmap[y+nyi+nyy][x+nxi+nxx]; if (!r) r = sim->photons[y+nyi+nyy][x+nxi+nxx]; - if (r && !(sim->elements[r&0xFF].Properties & TYPE_SOLID)){ parts[r>>8].vx += nxi*((parts[i].temp-273.15)/10.0f); parts[r>>8].vy += nyi*((parts[i].temp-273.15)/10.0f); @@ -77,4 +76,4 @@ int Element_FRAY::update(UPDATE_FUNC_ARGS) } -Element_FRAY::~Element_FRAY() {} \ No newline at end of file +Element_FRAY::~Element_FRAY() {} diff --git a/src/simulation/elements/FRZZ.cpp b/src/simulation/elements/FRZZ.cpp index 106766db5..02b57829e 100644 --- a/src/simulation/elements/FRZZ.cpp +++ b/src/simulation/elements/FRZZ.cpp @@ -64,7 +64,6 @@ int Element_FRZZ::update(UPDATE_FUNC_ARGS) sim->kill_part(i); return 1; } - } return 0; } diff --git a/src/simulation/elements/FUSE.cpp b/src/simulation/elements/FUSE.cpp index 5e9c95d05..71f551f5c 100644 --- a/src/simulation/elements/FUSE.cpp +++ b/src/simulation/elements/FUSE.cpp @@ -55,7 +55,8 @@ int Element_FUSE::update(UPDATE_FUNC_ARGS) if (r>-1) parts[r].life = 50; return 1; - } else if (parts[i].life < 40) { + } + else if (parts[i].life < 40) { parts[i].life--; if (!(rand()%100)) { r = sim->create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_PLSM); diff --git a/src/simulation/elements/GEL.cpp b/src/simulation/elements/GEL.cpp index 2b028416a..0a61b82d3 100644 --- a/src/simulation/elements/GEL.cpp +++ b/src/simulation/elements/GEL.cpp @@ -65,66 +65,80 @@ int Element_GEL::update(UPDATE_FUNC_ARGS) continue; rt = r&0xFF; //Desaturation - if ((rt==PT_WATR || rt==PT_DSTW || rt==PT_FRZW) && parts[i].tmp<100 && 500>rand()%absorbChanceDenom) + switch (rt) { - parts[i].tmp++; - sim->kill_part(r>>8); - } - else if ((rt==PT_PSTE) && parts[i].tmp<100 && 20>rand()%absorbChanceDenom) - { - parts[i].tmp++; - sim->create_part(r>>8, x+rx, y+ry, PT_CLST); - } - else if ((rt==PT_SLTW) && parts[i].tmp<100 && 50>rand()%absorbChanceDenom) - { - parts[i].tmp++; - if (rand()%4) + case PT_WATR: + case PT_DSTW: + case PT_FRZW: + if (parts[i].tmp<100 && 500>rand()%absorbChanceDenom) + { + parts[i].tmp++; sim->kill_part(r>>8); - else - sim->part_change_type(r>>8, x+rx, y+ry, PT_SALT); - } - else if ((rt==PT_CBNW) && parts[i].tmp<100 && 100>rand()%absorbChanceDenom) - { - parts[i].tmp++; - sim->part_change_type(r>>8, x+rx, y+ry, PT_CO2); - } - - else if (rt==PT_SPNG && parts[i].tmp<100 && ((parts[r>>8].life+1)>parts[i].tmp)) - { - parts[r>>8].life--; - parts[i].tmp++; - } - //Concentration diffusion - if (rt==PT_GEL && (parts[r>>8].tmp+1)>8].tmp++; - parts[i].tmp--; + } + break; + case PT_PSTE: + if (parts[i].tmp<100 && 20>rand()%absorbChanceDenom) + { + parts[i].tmp++; + sim->create_part(r>>8, x+rx, y+ry, PT_CLST); + } + break; + case PT_SLTW: + if (parts[i].tmp<100 && 50>rand()%absorbChanceDenom) + { + parts[i].tmp++; + if (rand()%4) + sim->kill_part(r>>8); + else + sim->part_change_type(r>>8, x+rx, y+ry, PT_SALT); + } + break; + case PT_CBNW: + if (parts[i].tmp<100 && 100>rand()%absorbChanceDenom) + { + parts[i].tmp++; + sim->part_change_type(r>>8, x+rx, y+ry, PT_CO2); + } + break; + case PT_SPNG: + if (parts[i].tmp<100 && ((parts[r>>8].life+1)>parts[i].tmp)) + { + parts[r>>8].life--; + parts[i].tmp++; + } + else if ((parts[r>>8].life+1)>8].life++; + parts[i].tmp--; + } + break; + case PT_GEL: + if ((parts[r>>8].tmp+1)>8].tmp++; + parts[i].tmp--; + } gel = true; + break; + default: + break; } - else if (rt==PT_SPNG && (parts[r>>8].life+1)>8].life++; - parts[i].tmp--; - } - float dx, dy; dx = parts[i].x - parts[r>>8].x; dy = parts[i].y - parts[r>>8].y; //Stickness - if ((dx*dx + dy*dy)>1.5 && (gel || !sim->elements[r&0xFF].Falldown || (fabs((float)rx)<2 && fabs((float)ry)<2))) + if ((dx*dx + dy*dy)>1.5 && (gel || !sim->elements[rt].Falldown || (fabs((float)rx)<2 && fabs((float)ry)<2))) { float per, nd; nd = dx*dx + dy*dy - 0.5; - per = 5*(1 - parts[i].tmp/100)*(nd/(dx*dx + dy*dy + nd) - 0.5); - if (sim->elements[r&0xFF].State==ST_LIQUID) + if (sim->elements[rt].State==ST_LIQUID) per *= 0.1; - dx *= per; dy *= per; parts[i].vx += dx; parts[i].vy += dy; - if ((sim->elements[r&0xFF].Properties&TYPE_PART) || rt==PT_GOO) + if ((sim->elements[rt].Properties&TYPE_PART) || rt==PT_GOO) { parts[r>>8].vx -= dx; parts[r>>8].vy -= dy; diff --git a/src/simulation/elements/H2.cpp b/src/simulation/elements/H2.cpp index b5bfe513a..e9913e1ea 100644 --- a/src/simulation/elements/H2.cpp +++ b/src/simulation/elements/H2.cpp @@ -55,15 +55,14 @@ int Element_H2::update(UPDATE_FUNC_ARGS) if (x+rx>=0 && y+ry>=0 && x+rxpv[y/CELL][x/CELL] > 8.0f && rt == PT_DESL) // This will not work. DESL turns to fire above 5.0 pressure { sim->part_change_type(r>>8,x+rx,y+ry,PT_WATR); sim->part_change_type(i,x,y,PT_OIL); } - if (sim->pv[y/CELL][x/CELL] > 45.0f) { if (parts[r>>8].temp > 2273.15) @@ -73,18 +72,19 @@ int Element_H2::update(UPDATE_FUNC_ARGS) { if (rt==PT_FIRE) { - parts[r>>8].temp=2473.15; if(parts[r>>8].tmp&0x02) - parts[r>>8].temp=3473; + parts[r>>8].temp=3473.0f; + else + parts[r>>8].temp=2473.15f; parts[r>>8].tmp |= 1; sim->create_part(i,x,y,PT_FIRE); - parts[i].temp+=(rand()/(RAND_MAX/100)); + parts[i].temp+=(rand()%100); parts[i].tmp |= 1; } else if ((rt==PT_PLSM && !(parts[r>>8].tmp&4)) || (rt==PT_LAVA && parts[r>>8].ctype != PT_BMTL)) { sim->create_part(i,x,y,PT_FIRE); - parts[i].temp+=(rand()/(RAND_MAX/100)); + parts[i].temp+=(rand()%100); parts[i].tmp |= 1; } } @@ -112,14 +112,12 @@ int Element_H2::update(UPDATE_FUNC_ARGS) parts[j].ctype = 0x7C0000; parts[j].temp = temp; } - j = sim->create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PLSM); if (j>-1) { parts[j].temp = temp; parts[j].tmp |= 4; } - parts[i].temp = temp+750+rand()%500; sim->pv[y/CELL][x/CELL] += 30; } diff --git a/src/simulation/elements/ICEI.cpp b/src/simulation/elements/ICEI.cpp index 995da9e3f..4e10c92d8 100644 --- a/src/simulation/elements/ICEI.cpp +++ b/src/simulation/elements/ICEI.cpp @@ -61,16 +61,18 @@ int Element_ICEI::update(UPDATE_FUNC_ARGS) r = pmap[y+ry][x+rx]; if (!r) continue; - if (((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && parts[i].temp > sim->elements[PT_SLTW].LowTemperature && !(rand()%1000)) + if ((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) { - sim->part_change_type(i,x,y,PT_SLTW); - sim->part_change_type(r>>8,x+rx,y+ry,PT_SLTW); - goto done; + if (parts[i].temp > sim->elements[PT_SLTW].LowTemperature && !(rand()%1000)) + { + sim->part_change_type(i,x,y,PT_SLTW); + sim->part_change_type(r>>8,x+rx,y+ry,PT_SLTW); + return 0; + } } else if (((r&0xFF)==PT_FRZZ) && (parts[i].ctype=PT_FRZW) && !(rand()%1000)) sim->part_change_type(r>>8,x+rx,y+ry,PT_ICEI); } - done: return 0; } diff --git a/src/simulation/elements/IGNT.cpp b/src/simulation/elements/IGNT.cpp index b1afe9203..85a24411e 100644 --- a/src/simulation/elements/IGNT.cpp +++ b/src/simulation/elements/IGNT.cpp @@ -76,7 +76,7 @@ int Element_IGNT::update(UPDATE_FUNC_ARGS) parts[nb].life = 30; parts[nb].vx = rand()%20-10; parts[nb].vy = rand()%20-10; - parts[nb].temp = restrict_flt(400.0f+parts[i].temp-273.15, MIN_TEMP, MAX_TEMP); + parts[nb].temp = restrict_flt(parts[i].temp-273.15f+400.0f, MIN_TEMP, MAX_TEMP); } } else diff --git a/src/simulation/elements/IRON.cpp b/src/simulation/elements/IRON.cpp index b742b3038..9614cd78e 100644 --- a/src/simulation/elements/IRON.cpp +++ b/src/simulation/elements/IRON.cpp @@ -48,28 +48,40 @@ Element_IRON::Element_IRON() //#TPT-Directive ElementHeader Element_IRON static int update(UPDATE_FUNC_ARGS) int Element_IRON::update(UPDATE_FUNC_ARGS) - { - int r, rx, ry, rt; +{ + int r, rx, ry, rt; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rxpart_change_type(i,x,y,PT_BMTL); - parts[i].tmp=(rand()/(RAND_MAX/10))+20; + case PT_SALT: + if (!(parts[i].life) && !(rand()%47)) + goto succ; + break; + case PT_SLTW: + if (!(parts[i].life) && !(rand()%67)) + goto succ; + break; + case PT_WATR: + if (!(parts[i].life) && !(rand()%1200)) + goto succ; + break; + case PT_O2: + if (!(parts[i].life) && !(rand()%250)) + goto succ; + break; + case PT_LO2: + goto succ; + default: + break; } } +succ: + sim->part_change_type(i,x,y,PT_BMTL); + parts[i].tmp=(rand()%10)+20; return 0; } diff --git a/src/simulation/elements/LCRY.cpp b/src/simulation/elements/LCRY.cpp index 2ca5c285c..8bcf4d05e 100644 --- a/src/simulation/elements/LCRY.cpp +++ b/src/simulation/elements/LCRY.cpp @@ -53,13 +53,7 @@ int Element_LCRY::update(UPDATE_FUNC_ARGS) int r, rx, ry, check, setto; switch (parts[i].tmp) { - case 0: - check=3; - setto=1; - break; case 1: - check=3; - setto=1; if(parts[i].life<=0) parts[i].tmp = 0; else @@ -69,14 +63,11 @@ int Element_LCRY::update(UPDATE_FUNC_ARGS) parts[i].life = 0; parts[i].tmp2 = parts[i].life; } - break; - case 3: - check=0; - setto=2; + case 0: + check=3; + setto=1; break; case 2: - check=0; - setto=2; if(parts[i].life>=10) parts[i].tmp = 3; else @@ -86,8 +77,10 @@ int Element_LCRY::update(UPDATE_FUNC_ARGS) parts[i].life = 10; parts[i].tmp2 = parts[i].life; } + case 3: + check=0; + setto=2; break; - default: return 0; } diff --git a/src/simulation/elements/LIGH.cpp b/src/simulation/elements/LIGH.cpp index 23f815a2b..2e64bb2ea 100644 --- a/src/simulation/elements/LIGH.cpp +++ b/src/simulation/elements/LIGH.cpp @@ -99,43 +99,49 @@ int Element_LIGH::update(UPDATE_FUNC_ARGS) if (sim->elements[rt].Explosive) sim->pv[y/CELL][x/CELL] += 0.25f * CFDS; } - if (rt!=PT_LIGH && rt!=PT_TESC) + switch (rt) { - if (rt!=PT_CLNE&&rt!=PT_THDR&&rt!=PT_DMND&&rt!=PT_FIRE) + case PT_LIGH: + case PT_TESC: + continue; + case PT_CLNE: + case PT_THDR: + case PT_DMND: + case PT_FIRE: + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/10, MIN_TEMP, MAX_TEMP); + continue; + case PT_DEUT: + case PT_PLUT: + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful, MIN_TEMP, MAX_TEMP); + sim->pv[y/CELL][x/CELL] +=powderful/35; + if (!(rand()%3)) { - if ((sim->elements[r&0xFF].Properties&PROP_CONDUCTS) && parts[r>>8].life==0) - { - sim->create_part(r>>8,x+rx,y+ry,PT_SPRK); - } - if (rt==PT_DEUT || rt==PT_PLUT) // start nuclear reactions - { - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful, MIN_TEMP, MAX_TEMP); - sim->pv[y/CELL][x/CELL] +=powderful/35; - if (!(rand()%3)) - { - sim->part_change_type(r>>8,x+rx,y+ry,PT_NEUT); - parts[r>>8].life = rand()%480+480; - parts[r>>8].vx=rand()%10-5; - parts[r>>8].vy=rand()%10-5; - } - } - else if (rt==PT_COAL || rt==PT_BCOL) // ignite coal - { - if (parts[r>>8].life>100) { - parts[r>>8].life = 99; - } - } - else if ((rt==PT_STKM && sim->player.elem!=PT_LIGH) || (rt==PT_STKM2 && sim->player2.elem!=PT_LIGH)) - { - parts[r>>8].life-=powderful/100; - } - sim->pv[y/CELL][x/CELL] += powderful/400; - if (sim->elements[r&0xFF].HeatConduct) parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/1.3, MIN_TEMP, MAX_TEMP); + sim->part_change_type(r>>8,x+rx,y+ry,PT_NEUT); + parts[r>>8].life = rand()%480+480; + parts[r>>8].vx=rand()%10-5; + parts[r>>8].vy=rand()%10-5; } - else - parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/10, MIN_TEMP, MAX_TEMP); - + break; + case PT_COAL: + case PT_BCOL: + if (parts[r>>8].life>100) + parts[r>>8].life = 99; + break; + case PT_STKM: + if (sim->player.elem!=PT_LIGH) + parts[r>>8].life-=powderful/100; + break; + case PT_STKM2: + if (sim->player2.elem!=PT_LIGH) + parts[r>>8].life-=powderful/100; + break; + default: + break; } + if ((sim->elements[r&0xFF].Properties&PROP_CONDUCTS) && parts[r>>8].life==0) + sim->create_part(r>>8,x+rx,y+ry,PT_SPRK); + sim->pv[y/CELL][x/CELL] += powderful/400; + if (sim->elements[r&0xFF].HeatConduct) parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/1.3, MIN_TEMP, MAX_TEMP); } if (parts[i].tmp2==3) { @@ -155,7 +161,7 @@ int Element_LIGH::update(UPDATE_FUNC_ARGS) return 1; } - //Completely broken and laggy function, possible can be fixed later + //Completely broken and laggy function, possibly can be fixed later /*pNear = LIGH_nearest_part(sim, i, parts[i].life*2.5); if (pNear!=-1) { @@ -278,6 +284,7 @@ bool Element_LIGH::create_LIGH(Simulation * sim, int x, int y, int c, int temp, if ((((r&0xFF)==PT_VOID || ((r&0xFF)==PT_PVOD && sim->parts[r>>8].life >= 10)) && (!sim->parts[r>>8].ctype || (sim->parts[r>>8].ctype==c)!=(sim->parts[r>>8].tmp&1))) || (r&0xFF)==PT_BHOL || (r&0xFF)==PT_NBHL) // VOID, PVOD, VACU, and BHOL eat LIGH here return true; } + else return true; return false; } diff --git a/src/simulation/elements/NBLE.cpp b/src/simulation/elements/NBLE.cpp index dedd4d69d..d1ece54ae 100644 --- a/src/simulation/elements/NBLE.cpp +++ b/src/simulation/elements/NBLE.cpp @@ -48,7 +48,6 @@ Element_NBLE::Element_NBLE() //#TPT-Directive ElementHeader Element_NBLE static int update(UPDATE_FUNC_ARGS) int Element_NBLE::update(UPDATE_FUNC_ARGS) - { if (parts[i].temp > 5273.15 && sim->pv[y/CELL][x/CELL] > 100.0f) { @@ -74,14 +73,12 @@ int Element_NBLE::update(UPDATE_FUNC_ARGS) parts[j].ctype = 0xF800000; parts[j].temp = temp; } - j = sim->create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PLSM); if (j != -1) { parts[j].temp = temp; parts[j].tmp |= 4; } - parts[i].temp = temp+1750+rand()%500; sim->pv[y/CELL][x/CELL] += 50; } diff --git a/src/simulation/elements/NEUT.cpp b/src/simulation/elements/NEUT.cpp index 31c990b00..5f23014b1 100644 --- a/src/simulation/elements/NEUT.cpp +++ b/src/simulation/elements/NEUT.cpp @@ -56,93 +56,114 @@ int Element_NEUT::update(UPDATE_FUNC_ARGS) if (x+rx>=0 && y+ry>0 && x+rx(rand()%20)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_DSTW); + case PT_ICEI: + case PT_SNOW: parts[i].vx *= 0.995; parts[i].vy *= 0.995; - } - if (rt==PT_PLUT && pressureFactor>(rand()%1000)) - { - if (!(rand()%3)) + break; + case PT_PLUT: + if (pressureFactor>(rand()%1000)) { - sim->create_part(r>>8, x+rx, y+ry, rand()%3 ? PT_LAVA : PT_URAN); - parts[r>>8].temp = MAX_TEMP; - if (parts[r>>8].type==PT_LAVA) { - parts[r>>8].tmp = 100; - parts[r>>8].ctype = PT_PLUT; + if (!(rand()%3)) + { + sim->create_part(r>>8, x+rx, y+ry, rand()%3 ? PT_LAVA : PT_URAN); + parts[r>>8].temp = MAX_TEMP; + if (parts[r>>8].type==PT_LAVA) { + parts[r>>8].tmp = 100; + parts[r>>8].ctype = PT_PLUT; + } } + else + { + sim->create_part(r>>8, x+rx, y+ry, PT_NEUT); + parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; + parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; + } + sim->pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough + Element_FIRE::update(UPDATE_FUNC_SUBCALL_ARGS); } - else + break; +#ifdef SDEUT + case PT_DEUT: + if ((pressureFactor+1+(parts[r>>8].life/100))>(rand()%1000)) { - sim->create_part(r>>8, x+rx, y+ry, PT_NEUT); + create_n_parts(sim, parts[r>>8].life, x+rx, y+ry, parts[i].vx, parts[i].vy, restrict_flt(parts[r>>8].temp + parts[r>>8].life*500, MIN_TEMP, MAX_TEMP), PT_NEUT); + sim->kill_part(r>>8); + } + break; +#else + case PT_DEUT: + if ((pressureFactor+1)>(rand()%1000)) + { + create_part(r>>8, x+rx, y+ry, PT_NEUT); parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - } - sim->pv[y/CELL][x/CELL] += 10.0f * CFDS; //Used to be 2, some people said nukes weren't powerful enough - Element_FIRE::update(UPDATE_FUNC_SUBCALL_ARGS); - } -#ifdef SDEUT - else if (rt==PT_DEUT && (pressureFactor+1+(parts[r>>8].life/100))>(rand()%1000)) - { - create_n_parts(sim, parts[r>>8].life, x+rx, y+ry, parts[i].vx, parts[i].vy, restrict_flt(parts[r>>8].temp + parts[r>>8].life*500, MIN_TEMP, MAX_TEMP), PT_NEUT); - sim->kill_part(r>>8); - } -#else - else if (rt==PT_DEUT && (pressureFactor+1)>(rand()%1000)) - { - create_part(r>>8, x+rx, y+ry, PT_NEUT); - parts[r>>8].vx = 0.25f*parts[r>>8].vx + parts[i].vx; - parts[r>>8].vy = 0.25f*parts[r>>8].vy + parts[i].vy; - if (parts[r>>8].life>0) - { parts[r>>8].life --; parts[r>>8].temp = restrict_flt(parts[r>>8].temp + parts[r>>8].life*17, MIN_TEMP, MAX_TEMP); pv[y/CELL][x/CELL] += 6.0f * CFDS; + } - else - sim.kill_part(r>>8); - } + break; #endif - else if (rt==PT_GUNP && 3>(rand()%200)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_DUST); - else if (rt==PT_DYST && 3>(rand()%200)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_YEST); - else if (rt==PT_YEST) + case PT_GUNP: + if (3>(rand()%200)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_DUST); + break; + case PT_DYST: + if (3>(rand()%200)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_YEST); + break; + case PT_YEST: sim->part_change_type(r>>8,x+rx,y+ry,PT_DYST); - else if (rt==PT_WATR && 3>(rand()%20)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_DSTW); - else if (rt==PT_PLEX && 3>(rand()%200)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_GOO); - else if (rt==PT_NITR && 3>(rand()%200)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_DESL); - else if (rt==PT_PLNT && !(rand()%20)) - sim->create_part(r>>8, x+rx, y+ry, PT_WOOD); - else if (rt==PT_DESL && 3>(rand()%200)) - sim->part_change_type(r>>8,x+rx,y+ry,PT_GAS); - else if (rt==PT_COAL && !(rand()%20)) - sim->create_part(r>>8, x+rx, y+ry, PT_WOOD); - else if (rt==PT_DUST && !(rand()%20)) - sim->part_change_type(r>>8, x+rx, y+ry, PT_FWRK); - else if (rt==PT_FWRK && !(rand()%20)) - parts[r>>8].ctype = PT_DUST; - else if (rt==PT_ACID && !(rand()%20)) - sim->create_part(r>>8, x+rx, y+ry, PT_ISOZ); - else if (rt==PT_TTAN && !(rand()%20)) - { - sim->kill_part(i); - return 1; + break; + case PT_PLEX: + if (3>(rand()%200)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_GOO); + break; + case PT_NITR: + if (3>(rand()%200)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_DESL); + break; + case PT_PLNT: + if (!(rand()%20)) + sim->create_part(r>>8, x+rx, y+ry, PT_WOOD); + break; + case PT_DESL: + if (3>(rand()%200)) + sim->part_change_type(r>>8,x+rx,y+ry,PT_GAS); + break; + case PT_COAL: + if (!(rand()%20)) + sim->create_part(r>>8, x+rx, y+ry, PT_WOOD); + break; + case PT_DUST: + if (!(rand()%20)) + sim->part_change_type(r>>8, x+rx, y+ry, PT_FWRK); + break; + case PT_FWRK: + if (!(rand()%20)) + parts[r>>8].ctype = PT_DUST; + break; + case PT_ACID: + if (!(rand()%20)) + sim->create_part(r>>8, x+rx, y+ry, PT_ISOZ); + break; + case PT_TTAN: + if (!(rand()%20)) + { + sim->kill_part(i); + return 1; + } + break; + case PT_EXOT: + if (!(rand()%20)) + parts[r>>8].life = 1500; } - else if (rt==PT_EXOT && 5>(rand()%100)) - parts[r>>8].life = 1500; - /*if(parts[r>>8].type>1 && parts[r>>8].type!=PT_NEUT && parts[r>>8].type-1!=PT_NEUT && parts[r>>8].type-1!=PT_STKM && - (elements[parts[r>>8].type-1].menusection==SC_LIQUID|| - elements[parts[r>>8].type-1].menusection==SC_EXPLOSIVE|| - elements[parts[r>>8].type-1].menusection==SC_GAS|| - elements[parts[r>>8].type-1].menusection==SC_POWDERS) && 15>(rand()%1000)) - parts[r>>8].type--;*/ } return 0; } diff --git a/src/simulation/elements/SPRK.cpp b/src/simulation/elements/SPRK.cpp index cedbaa97c..5d40b3fc8 100644 --- a/src/simulation/elements/SPRK.cpp +++ b/src/simulation/elements/SPRK.cpp @@ -170,8 +170,7 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS) continue; rt = r&0xFF; conduct_sprk = 1; - - +// ct = spark from material, rt = spark to material. Make conduct_sprk = 0 if conduction not allowed pavg = sim->parts_avg(r>>8, i,PT_INSL); if ((rt==PT_SWCH||(rt==PT_SPRK&&parts[r>>8].ctype==PT_SWCH)) && pavg!=PT_INSL && parts[i].life<4) // make sparked SWCH turn off correctly { @@ -200,80 +199,75 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS) if (ct == PT_NSCN || ct == PT_PSCN || ct == PT_INST) Element_PPIP::flood_trigger(sim, x+rx, y+ry, ct); } - - // ct = spark from material, rt = spark to material. Make conduct_sprk = 0 if conduction not allowed - - if (pavg == PT_INSL) conduct_sprk = 0; - if (!((sim->elements[rt].Properties&PROP_CONDUCTS)||rt==PT_INST||rt==PT_QRTZ)) conduct_sprk = 0; - if (abs(rx)+abs(ry)>=4 &&ct!=PT_SWCH&&rt!=PT_SWCH) - conduct_sprk = 0; - - if (ct==PT_METL && (rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR||(rt==PT_SPRK&&(parts[r>>8].ctype==PT_NTCT||parts[r>>8].ctype==PT_PTCT))) && pavg!=PT_INSL && parts[i].life<4) { parts[r>>8].temp = 473.0f; if (rt==PT_NTCT||rt==PT_PTCT) - conduct_sprk = 0; + continue; } + if (pavg == PT_INSL) continue; + if (!((sim->elements[rt].Properties&PROP_CONDUCTS)||rt==PT_INST||rt==PT_QRTZ)) continue; + if (abs(rx)+abs(ry)>=4 &&ct!=PT_SWCH&&rt!=PT_SWCH) + continue; + //if (rt==ct && rt!=PT_INST) goto conduct; if (ct==PT_NTCT && !(rt==PT_PSCN || rt==PT_NTCT || (rt==PT_NSCN&&parts[i].temp>373.0f))) - conduct_sprk = 0; + continue; else if (ct==PT_PTCT && !(rt==PT_PSCN || rt==PT_PTCT || (rt==PT_NSCN&&parts[i].temp<373.0f))) - conduct_sprk = 0; + continue; else if (ct==PT_INWR && !(rt==PT_NSCN || rt==PT_INWR || rt==PT_PSCN)) - conduct_sprk = 0; + continue; else if (ct==PT_NSCN && rt==PT_PSCN) - conduct_sprk = 0; + continue; else if (ct==PT_ETRD && !(rt==PT_METL||rt==PT_ETRD||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN)) - conduct_sprk = 0; - else if (ct==PT_INST && rt!=PT_NSCN) conduct_sprk = 0; + continue; + else if (ct==PT_INST && rt!=PT_NSCN) continue; else if (ct==PT_SWCH && (rt==PT_PSCN||rt==PT_NSCN||rt==PT_WATR||rt==PT_SLTW||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)) - conduct_sprk = 0; + continue; else if (rt==PT_QRTZ && !((ct==PT_NSCN||ct==PT_METL||ct==PT_PSCN||ct==PT_QRTZ) && (parts[r>>8].temp<173.15||sim->pv[(y+ry)/CELL][(x+rx)/CELL]>8))) - conduct_sprk = 0; + continue; else if (rt==PT_NTCT && !(ct==PT_NSCN || ct==PT_NTCT || (ct==PT_PSCN&&parts[r>>8].temp>373.0f))) - conduct_sprk = 0; + continue; else if (rt==PT_PTCT && !(ct==PT_NSCN || ct==PT_PTCT || (ct==PT_PSCN&&parts[r>>8].temp<373.0f))) - conduct_sprk = 0; + continue; else if (rt==PT_INWR && !(ct==PT_NSCN || ct==PT_INWR || ct==PT_PSCN)) - conduct_sprk = 0; + continue; else if (rt==PT_INST && ct!=PT_PSCN) - conduct_sprk = 0; + continue; else if (rt==PT_NBLE && parts[r>>8].tmp == 1) - conduct_sprk = 0; - - if (conduct_sprk) { - if (rt==PT_WATR||rt==PT_SLTW) { - if (parts[r>>8].life==0 && parts[i].life<3) - { - sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); - if (rt==PT_WATR) parts[r>>8].life = 6; - else parts[r>>8].life = 5; - parts[r>>8].ctype = rt; - } - } - else if (rt==PT_INST) { - if (parts[r>>8].life==0 && parts[i].life<4) - { - sim->FloodINST(x+rx,y+ry,PT_SPRK,PT_INST);//spark the wire - } - } - else if (parts[r>>8].life==0 && parts[i].life<4) { - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; - sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); - if (parts[r>>8].temp+10.0f<673.0f&&!sim->legacy_enable&&(rt==PT_METL||rt==PT_BMTL||rt==PT_BRMT||rt==PT_PSCN||rt==PT_NSCN||rt==PT_ETRD||rt==PT_NBLE||rt==PT_IRON)) - parts[r>>8].temp = parts[r>>8].temp+10.0f; - } - else if (ct==PT_ETRD && parts[i].life==5) + continue; + conduct: + if (rt==PT_WATR||rt==PT_SLTW) { + if (parts[r>>8].life==0 && parts[i].life<3) { - sim->part_change_type(i,x,y,ct); - parts[i].ctype = PT_NONE; - parts[i].life = 20; - parts[r>>8].life = 4; - parts[r>>8].ctype = rt; sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); + if (rt==PT_WATR) parts[r>>8].life = 6; + else parts[r>>8].life = 5; + parts[r>>8].ctype = rt; } } + else if (rt==PT_INST) { + if (parts[r>>8].life==0 && parts[i].life<4) + { + sim->FloodINST(x+rx,y+ry,PT_SPRK,PT_INST);//spark the wire + } + } + else if (parts[r>>8].life==0 && parts[i].life<4) { + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); + if (parts[r>>8].temp+10.0f<673.0f&&!sim->legacy_enable&&(rt==PT_METL||rt==PT_BMTL||rt==PT_BRMT||rt==PT_PSCN||rt==PT_NSCN||rt==PT_ETRD||rt==PT_NBLE||rt==PT_IRON)) + parts[r>>8].temp = parts[r>>8].temp+10.0f; + } + else if (ct==PT_ETRD && parts[i].life==5) + { + sim->part_change_type(i,x,y,ct); + parts[i].ctype = PT_NONE; + parts[i].life = 20; + parts[r>>8].life = 4; + parts[r>>8].ctype = rt; + sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); + } + } return 0; } diff --git a/src/simulation/elements/THDR.cpp b/src/simulation/elements/THDR.cpp index 9d35b5212..f30962887 100644 --- a/src/simulation/elements/THDR.cpp +++ b/src/simulation/elements/THDR.cpp @@ -50,7 +50,7 @@ Element_THDR::Element_THDR() int Element_THDR::update(UPDATE_FUNC_ARGS) { int r, rx, ry, rt; - bool kill; + bool kill=false; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) if (x+rx>=0 && y+ry>0 && x+rx>8].ctype = parts[r>>8].type; sim->part_change_type(r>>8,x+rx,y+ry,PT_SPRK); parts[r>>8].life = 4; - kill = true; + kill=true; } else if (rt!=PT_CLNE&&rt!=PT_THDR&&rt!=PT_SPRK&&rt!=PT_DMND&&rt!=PT_FIRE) {