int update_SHLD1(UPDATE_FUNC_ARGS) { int r, nnx, nny, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; else if ((r&0xFF)==PT_SPRK&&parts[i].life==0) { if (55>rand()%200&&parts[i].life==0) { part_change_type(i,x,y,PT_SHLD2); parts[i].life = 7; } for ( nnx=-1; nnx<2; nnx++) for ( nny=-1; nny<2; nny++) { if (!pmap[y+ry+nny][x+rx+nnx]) { create_part(-1,x+rx+nnx,y+ry+nny,PT_SHLD1); //parts[pmap[y+ny+nny][x+nx+nnx]>>8].life=7; } } } else if ((r&0xFF)==PT_SHLD3&&4>rand()%10) { part_change_type(i,x,y,PT_SHLD2); parts[i].life = 7; } } return 0; }
int update_THRM(UPDATE_FUNC_ARGS) { int r, rx, 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) continue; if (((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM || (r&0xFF)==PT_LAVA)) // TODO: could this go in update_PYRO? { if (1>(rand()%500)) { part_change_type(i,x,y,PT_LAVA); parts[i].ctype = PT_BMTL; parts[i].temp = 3500.0f; pv[y/CELL][x/CELL] += 50.0f; } else { part_change_type(i,x,y,PT_LAVA); parts[i].life = 400; parts[i].ctype = PT_THRM; parts[i].temp = 3500.0f; parts[i].tmp = 20; } } } return 0; }
int update_MASH(UPDATE_FUNC_ARGS) { int r, rx, ry; if ((legacy_enable||parts[i].temp>(273.15f+50.0f) && 1>(rand()%250))) { if(1>rand()%2) { create_part(-1,x,y-1,PT_ALCV); parts[i].life +=1; } else { create_part(-1,x,y-1,PT_WTRV); parts[i].life +=1; } } 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) continue; if (parts[i].life >= 5) { part_change_type(i,x,y,PT_DMSH); } if ((r&0xFF)==PT_HOPS && 1>(rand()%250)) { part_change_type(i,x,y,PT_MALT); kill_part(r>>8); }
int update_WSTE(UPDATE_FUNC_ARGS) { int r, rx, ry, trade, np; 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&0xFF)==PT_WSTE) continue; if ((r&0xFF)!=PT_DMND && (r&0xFF)!=PT_URAN && (r&0xFF)!=PT_PLUT && (r&0xFF)!=PT_DEUT && (r&0xFF)!=PT_NEUT && (r&0xFF)!=PT_WATR && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN) { if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) { part_change_type(i,x,y,PT_FIRE); part_change_type(r>>8,x+rx,y+ry,PT_FIRE); parts[r>>8].life = 4; } if (parts[i].life < 2) part_change_type(i,x,y,PT_GLOW); else if (rand()%700 == 1) { kill_part(r>>8); parts[i].life -= 1; return 1; }
int update_FOG(UPDATE_FUNC_ARGS) { int r, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r && rand()%2500==0) { if (parts[i].temp > 253.15) { create_part(-1, x+rx, y+ry, PT_WATR); kill_part(i); } else { create_part(-1, rx+rx, y+ry, PT_SNOW); part_change_type(i,x,y,PT_SNOW); } } if (!r) continue; if (ptypes[r&0xFF].state==ST_SOLID&&5>=rand()%50&&parts[i].life==0&&!((r&0xFF)==PT_CLNE||(r&0xFF)==PT_PCLN)) // TODO: should this also exclude BCLN? { part_change_type(i,x,y,PT_RIME); } if ((r&0xFF)==PT_SPRK) { parts[i].life += rand()%20; } } return 0; }
int update_SHLD3(UPDATE_FUNC_ARGS) { int r, nnx, nny, rx, ry, np; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) { if (1>rand()%2500) { np = create_part(-1,x+rx,y+ry,PT_SHLD1); if (np<0) continue; parts[np].life=7; part_change_type(i,x,y,PT_SHLD2); } else continue; } if ((r&0xFF)==PT_SHLD1 && parts[i].life>3) { part_change_type(r>>8,x+rx,y+ry,PT_SHLD2); parts[r>>8].life=7; }
int update_QRTZ(UPDATE_FUNC_ARGS) { int r, tmp, trade, rx, ry, np, t; t = parts[i].type; if (t == PT_QRTZ) { parts[i].pavg[0] = parts[i].pavg[1]; parts[i].pavg[1] = pv[y/CELL][x/CELL]; if (parts[i].pavg[1]-parts[i].pavg[0] > 0.05*(parts[i].temp/3) || parts[i].pavg[1]-parts[i].pavg[0] < -0.05*(parts[i].temp/3)) { part_change_type(i,x,y,PT_PQRT); } } // absorb SLTW if (parts[i].ctype!=-1) 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) continue; else if ((r&0xFF)==PT_SLTW && (1>rand()%2500)) { kill_part(r>>8); parts[i].ctype ++; }
int update_VINE(UPDATE_FUNC_ARGS) { int r, np, rx =(rand()%3)-1, ry=(rand()%3)-1; if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (1>rand()%15) part_change_type(i,x,y,PT_PLNT); else if (!r) { np = create_part(-1,x+rx,y+ry,PT_VINE); if (np<0) return 0; parts[np].temp = parts[i].temp; part_change_type(i,x,y,PT_PLNT); } } return 0; }
int update_FWRK(UPDATE_FUNC_ARGS) { int r, rx, ry, np; if ((parts[i].temp>400&&(9+parts[i].temp/40)>rand()%100000&&parts[i].life==0&&!pmap[y-1][x])||parts[i].ctype==PT_DUST) { np = create_part(-1, x , y-1 , PT_FWRK); if (np!=-1) { parts[np].vy = rand()%8-22; parts[np].vx = rand()%20-rand()%20; parts[np].life=rand()%15+25; parts[np].dcolour = parts[i].dcolour; kill_part(i); return 1; } } if (parts[i].life>=45) parts[i].life=0; if ((parts[i].life<3&&parts[i].life>0)||(parts[i].vy>6&&parts[i].life>0)) { int q = (rand()%255+1); int w = (rand()%255+1); int e = (rand()%255+1); for (rx=-1; rx<2; rx++) for (ry=-2; ry<3; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { if (5>=rand()%8) { if (!pmap[y+ry][x+rx]) { np = create_part(-1, x+rx, y+ry , PT_DUST); pv[y/CELL][x/CELL] += 2.00f*CFDS; if (np!=-1) { parts[np].vy = -(rand()%10-1); parts[np].vx = ((rand()%2)*2-1)*rand()%(5+5)+(parts[i].vx)*2 ; parts[np].life= rand()%37+18; parts[np].tmp=q; parts[np].flags=w; parts[np].ctype=e; parts[np].temp= rand()%20+6000; parts[np].dcolour = parts[i].dcolour; part_change_type(i,x,y,PT_DUST); parts[i].life = 0; parts[i].dcolour = 0; parts[i].vy += 2; } } } } //kill_part(i); return 1; } return 0; }
int update_WATR(UPDATE_FUNC_ARGS) { int r, rx, ry; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if ((r&0xFF)==PT_SALT && 1>(rand()%250)) { part_change_type(i,x,y,PT_SLTW); part_change_type(r>>8,x+rx,y+ry,PT_SLTW); }
int update_MOLS(UPDATE_FUNC_ARGS) { int r, rx, 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) continue; if ((r&0xFF)==PT_YEST && 1>(rand()%250)) { part_change_type(i,x,y,PT_PRUM); kill_part(r>>8); }
int update_CLST(UPDATE_FUNC_ARGS) { int r, rx, ry; float cxy; 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) continue; if ((r&0xFF)==PT_WATR && 1>(rand()%1500)) { part_change_type(i,x,y,PT_PSTS); kill_part(r>>8); }
int update_ELEC(UPDATE_FUNC_ARGS) { int r, rt, rx, ry, nb, rrx, rry; float rr, rrr; parts[i].pavg[0] = x; parts[i].pavg[1] = y; if(pmap[y][x]==PT_GLOW) { part_change_type(i, x, y, PT_PHOT); } for (rx=-2; rx<=2; rx++) for (ry=-2; ry<=2; ry++) if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) { r = pmap[y+ry][x+rx]; if (!r) r = photons[y+ry][x+rx]; if (!r) continue; if ((r&0xFF)==PT_GLAS) { 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; for (rrx=-1; rrx<=1; rrx++) { for (rry=-1; rry<=1; rry++) { if (x+rx+rrx>=0 && y+ry+rry>=0 && x+rx+rrx<XRES && y+ry+rry<YRES) { nb = create_part(-1, x+rx+rrx, y+ry+rry, PT_BOMB); if (nb!=-1) { parts[nb].tmp = 1; parts[nb].life = 50; parts[nb].temp = 400.0f; parts[nb].vx = rand()%20-10; parts[nb].vy = rand()%20-10; } } } } kill_part(i); return 1; } if ((r&0xFF)==PT_LCRY) { parts[r>>8].tmp2 = 5+rand()%5; }
int update_ICEI(UPDATE_FUNC_ARGS) { //currently used for snow as well int r, rx, ry; if (parts[i].ctype==PT_FRZW)//get colder if it is from FRZW { parts[i].temp = restrict_flt(parts[i].temp-1.0f, MIN_TEMP, MAX_TEMP); } 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) continue; if (((r&0xFF)==PT_SALT || (r&0xFF)==PT_SLTW) && 1>(rand()%1000)) { part_change_type(i,x,y,PT_SLTW); part_change_type(r>>8,x+rx,y+ry,PT_SLTW); }
int update_H2(UPDATE_FUNC_ARGS) { int r,rx,ry,rt; if (parts[i].temp > 2273.15 && pv[y/CELL][x/CELL] > 50.0f) parts[i].tmp = 1; 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]; rt = (r&0xFF); if (!r) continue; if (pv[y/CELL][x/CELL] > 8.0f && rt == PT_DESL) // This will not work. DESL turns to fire above 5.0 pressure { part_change_type(r>>8,x+rx,y+ry,PT_WATR); part_change_type(i,x,y,PT_OIL); }
int update_ACID(UPDATE_FUNC_ARGS) { int r, rx, ry, trade, np; 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) continue; if ((r&0xFF)!=PT_ACID) { if ((r&0xFF)==PT_PLEX || (r&0xFF)==PT_NITR || (r&0xFF)==PT_GUNP || (r&0xFF)==PT_RBDM || (r&0xFF)==PT_LRBD) { part_change_type(i,x,y,PT_FIRE); part_change_type(r>>8,x+rx,y+ry,PT_FIRE); parts[i].life = 4; parts[r>>8].life = 4; } else if (((r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && ptypes[r&0xFF].hardness>(rand()%1000))&&parts[i].life>=50)
int update_WTRV(UPDATE_FUNC_ARGS) { int r, rx, 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) continue; if (((r&0xFF)==PT_RBDM||(r&0xFF)==PT_LRBD) && !legacy_enable && parts[i].temp>(273.15f+12.0f) && 1>(rand()%500)) { part_change_type(i,x,y,PT_FIRE); parts[i].life = 4; parts[i].ctype = PT_WATR; } } if(parts[i].temp>1273&&parts[i].ctype==PT_FIRE) parts[i].temp-=parts[i].temp/1000; return 0; }
int update_FOAM(UPDATE_FUNC_ARGS) { int r, rx, ry, np; 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) continue; if ((parts[i].life ==0) && (pv[y/CELL][x/CELL]<2.5f) && 1>(rand()%250)) { part_change_type(i,x,y,PT_BEER); } else { parts[i].life==50; } } return 0; }
int update_BARI(UPDATE_FUNC_ARGS) { int r, rx, 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) continue; if (((r&0xFF)==PT_ALCO||(r&0xFF)==PT_WATR) && 1>(rand()%500)) { parts[i].tmp = PT_BARI; parts[r>>8].tmp = PT_BARI; part_change_type(r>>8,x+rx,y+ry,PT_FIRE); part_change_type(i,x,y,PT_FIRE); parts[i].temp += 100; parts[i].life = 16; parts[r>>8].life = 16; }
int update_ANAR(UPDATE_FUNC_ARGS) { int r, rx, ry; //if (parts[i].temp >= 0.23) // parts[i].temp --; for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { r = pmap[y+ry][x+rx]; if (!r) continue; if ((r&0xFF)==PT_HFLM) { if (1>rand()%22) { part_change_type(i,x,y,PT_HFLM); parts[i].life = rand()%150+50; parts[r>>8].temp = parts[i].temp = 0; pv[y/CELL][x/CELL] -= 0.5; } }
int update_NBLE(UPDATE_FUNC_ARGS) { if (parts[i].temp > 5273.15 && pv[y/CELL][x/CELL] > 100.0f) { if (rand()%5 < 1) { int j; float temp = parts[i].temp; part_change_type(i,x,y,PT_PLSM); parts[i].life = rand()%150+50; j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_NEUT); if (j != -1) parts[j].temp = temp; if (!(rand()%25)) { j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_ELEC); if (j != -1) parts[j].temp = temp; } j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_PHOT); if (j != -1) { parts[j].ctype = 0xFF0000; parts[j].temp = temp; } j = create_part(-3,x+rand()%3-1,y+rand()%3-1,PT_CO2); if (j != -1) parts[j].temp = temp; parts[i].temp += 1750+rand()%500; pv[y/CELL][x/CELL] += 50; } } return 0; }
int update_CBNW(UPDATE_FUNC_ARGS) { int r, rx, ry, oldt; oldt = parts[i].tmp; if (pv[y/CELL][x/CELL]<=3) { if(20>(rand()%80000)) { part_change_type(i,x,y,PT_CO2); parts[i].ctype = 5; pv[y/CELL][x/CELL] += 0.5f; } else if(pv[y/CELL][x/CELL]<=-0.5) { part_change_type(i,x,y,PT_CO2); parts[i].ctype = 5; pv[y/CELL][x/CELL] += 0.5f; } } if (parts[i].tmp>0) parts[i].tmp--; if(!(rand()%200)) { parts[i].tmp2 = rand()%40; } else if(parts[i].tmp2!=20) { parts[i].tmp2 -= (parts[i].tmp2>20)?1:-1; } if(oldt==1) { //Explode if(rand()%4) { part_change_type(i,x,y,PT_CO2); parts[i].ctype = 5; pv[y/CELL][x/CELL] += 0.2f; } } 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) continue; if (ptypes[r&0xFF].properties&TYPE_PART && parts[i].tmp == 0 && 1>(rand()%250)) { //Start explode parts[i].tmp = rand()%25;//(rand()%100)+50; } else if(ptypes[r&0xFF].properties&TYPE_SOLID && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_GLAS && parts[i].tmp == 0 && (2-pv[y/CELL][x/CELL])>(rand()%20000)) { if(rand()%2) { part_change_type(i,x,y,PT_CO2); parts[i].ctype = 5; pv[y/CELL][x/CELL] += 0.2f; } } if ((r&0xFF)==PT_CBNW) { if(!parts[i].tmp && parts[r>>8].tmp) { parts[i].tmp = parts[r>>8].tmp; if((r>>8)>i) //If the other particle hasn't been life updated parts[i].tmp--; } else if(parts[i].tmp && !parts[r>>8].tmp) { parts[r>>8].tmp = parts[i].tmp; if((r>>8)>i) //If the other particle hasn't been life updated parts[r>>8].tmp++; } }