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 = (float)(rand()%8-22); parts[np].vx = (float)(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.0f); parts[np].vx = ((rand()%2)*2-1)*rand()%(5+5)+(parts[i].vx)*2.0f ; parts[np].life= rand()%37+18; parts[np].tmp=q; parts[np].flags=w; parts[np].ctype=e; parts[np].temp= rand()%20+6000.0f; parts[np].dcolour = parts[i].dcolour; } } } } kill_part(i); return 1; } return 0; }
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_BCOL(UPDATE_FUNC_ARGS) { int r, rx, ry, trade, temp; if (parts[i].life<=0) { create_part(i, x, y, PT_FIRE); return 1; } else if (parts[i].life < 100) { parts[i].life--; create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE); } 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) && 1>(rand()%500)) { if (parts[i].life>100) { parts[i].life = 99; } } if ((r&0xFF)==PT_LAVA && 1>(rand()%500)) { if (parts[r>>8].ctype == PT_IRON) { parts[r>>8].ctype = PT_METL; kill_part(i); return 1; } } }
int update_PHOT(UPDATE_FUNC_ARGS) { int r, rt, rx, ry; float rr, rrr; parts[i].pavg[0] = x; parts[i].pavg[1] = y; if (!(parts[i].ctype&0x3FFFFFFF)) { kill_part(i); return 1; } if (1>rand()%10) update_PYRO(UPDATE_FUNC_SUBCALL_ARGS); 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_ISOZ && 5>(rand()%2000)) { parts[i].vx *= 0.90; parts[i].vy *= 0.90; create_part(r>>8, x+rx, y+ry, PT_PHOT); rrr = (rand()%360)*3.14159f/180.0f; rr = (rand()%128+128)/127.0f; parts[r>>8].vx = rr*cosf(rrr); parts[r>>8].vy = rr*sinf(rrr); pv[y/CELL][x/CELL] -= 15.0f * CFDS; }
int update_SUGC(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 ((pv[y/CELL][x/CELL]>2.5f) && 1>(rand()%250)) { if(1>rand()%2) { create_part(-1,x,y-1,PT_SUGR); parts[i].life +=1; } else { create_part(-1,x,y-1,PT_MOLS); parts[i].life +=1; } } if (parts[i].life >= 5) { kill_part(i); } } 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 r = (rand()%245+11); int g = (rand()%245+11); int b = (rand()%245+11); int n; float angle, magnitude; unsigned col = (r<<16) | (g<<8) | b; for (n=0; n<40; n++) { np = create_part(-3, x, y, PT_EMBR); if (np>-1) { magnitude = ((rand()%60)+40)*0.05f; angle = (rand()%6284)*0.001f;//(in radians, between 0 and 2*pi) parts[np].vx = parts[i].vx + cosf(angle)*magnitude; parts[np].vy = parts[i].vy + sinf(angle)*magnitude - 2.5f; parts[np].ctype = col; parts[np].tmp = 1; parts[np].life = rand()%40+70; parts[np].temp = (rand()%500)+5750.0f; parts[np].dcolour = parts[i].dcolour; } } pv[y/CELL][x/CELL] += 8.0f; kill_part(i); return 1; } return 0; }
int update_COAL(UPDATE_FUNC_ARGS) { int r, rx, ry, trade, temp; if (parts[i].life<=0) { create_part(i, x, y, PT_FIRE); parts[i].life = 10; return 1; } else if (parts[i].life < 100) { int p; parts[i].life--; if (p = create_part(-1, x+rand()%3-1, y+rand()%3-1, PT_FIRE)) { parts[p].tmp = PT_COAL; } } if ((pv[y/CELL][x/CELL] > 4.3f)&&parts[i].tmp>40) parts[i].tmp=39; else if (parts[i].tmp<40&&parts[i].tmp>0) parts[i].tmp--; else if (parts[i].tmp<=0) { create_part(i, x, y, PT_BCOL); return 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 (((r&0xFF)==PT_FIRE || (r&0xFF)==PT_PLSM) && 1>(rand()%500)) { if (parts[i].life>100) { parts[i].life = 99; } } if ((r&0xFF)==PT_LAVA && 1>(rand()%500)) { if (parts[r>>8].ctype == PT_IRON) { parts[r>>8].ctype = PT_METL; kill_part(i); return 1; } } }
int update_BOMB(UPDATE_FUNC_ARGS) { int r, rx, ry, nb; 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_BOMB && (r&0xFF)!=PT_EMBR && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_BCLN) { int rad = 8; int nxi; int nxj; pmap[y][x] = 0; for (nxj=-rad; nxj<=rad; nxj++) for (nxi=-rad; nxi<=rad; nxi++) if ((pow(nxi,2))/(pow(rad,2))+(pow(nxj,2))/(pow(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) { delete_part(x+nxi, y+nxj, 0); pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f; nb = create_part(-3, x+nxi, y+nxj, PT_EMBR); if (nb!=-1) { parts[nb].tmp = 2; parts[nb].life = 2; parts[nb].temp = MAX_TEMP; } } for (nxj=-(rad+1); nxj<=(rad+1); nxj++) for (nxi=-(rad+1); nxi<=(rad+1); nxi++) if ((pow(nxi,2))/(pow((rad+1),2))+(pow(nxj,2))/(pow((rad+1),2))<=1 && !(pmap[y+nxj][x+nxi]&0xFF)) { nb = create_part(-3, x+nxi, y+nxj, PT_EMBR); if (nb!=-1) { parts[nb].tmp = 0; parts[nb].life = 50; parts[nb].temp = MAX_TEMP; parts[nb].vx = rand()%40-20; parts[nb].vy = rand()%40-20; } } kill_part(i); return 1; } } return 0; }
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_RADI(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>>8)>=NPART || !r) continue; if(10>rand()/(RAND_MAX/100)) parts[i].life--; if(parts[i].life <= 0) { kill_part(i); create_part(i,x,y,PT_RADO); } }
int update_PBCN(UPDATE_FUNC_ARGS) { int r, rx, ry; if (parts[i].life>0 && parts[i].life!=10) parts[i].life--; if (!parts[i].tmp2 && pv[y/CELL][x/CELL]>4.0f) parts[i].tmp2 = rand()%40+80; if (parts[i].tmp2) { float advection = 0.1f; parts[i].vx += advection*vx[y/CELL][x/CELL]; parts[i].vy += advection*vy[y/CELL][x/CELL]; parts[i].tmp2--; if(!parts[i].tmp2){ kill_part(i); return 1; } } if (parts[i].ctype<=0 || parts[i].ctype>=PT_NUM || (parts[i].ctype==PT_LIFE && (parts[i].tmp<0 || parts[i].tmp>=NGOLALT))) 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) { r = photons[y+ry][x+rx]; if (!r) r = pmap[y+ry][x+rx]; if (!r) continue; if ((r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_BCLN && (r&0xFF)!=PT_SPRK && (r&0xFF)!=PT_NSCN && (r&0xFF)!=PT_PSCN && (r&0xFF)!=PT_STKM && (r&0xFF)!=PT_STKM2 && (r&0xFF)!=PT_PBCN && (r&0xFF)<PT_NUM) { parts[i].ctype = r&0xFF; if ((r&0xFF)==PT_LIFE) parts[i].tmp = parts[r>>8].ctype; }
int run_stickman(playerst* playerp, UPDATE_FUNC_ARGS) { int r, rx, ry; int t = parts[i].type; float pp, d; float dt = 0.9;///(FPSB*FPSB); //Delta time in square float gvx, gvy; float gx, gy, dl, dr; if ((parts[i].ctype>0 && parts[i].ctype<PT_NUM && ptypes[parts[i].ctype].enabled && ptypes[parts[i].ctype].falldown>0) || parts[i].ctype==SPC_AIR || parts[i].ctype == PT_NEUT || parts[i].ctype == PT_PHOT || parts[i].ctype == PT_LIGH) playerp->elem = parts[i].ctype; playerp->frames++; //Temperature handling if (parts[i].temp<243) parts[i].life -= 1; if ((parts[i].temp<309.6f) && (parts[i].temp>=243)) parts[i].temp += 1; //Death if (parts[i].life<1 || (pv[y/CELL][x/CELL]>=4.5f && playerp->elem != SPC_AIR) ) //If his HP is less that 0 or there is very big wind... { for (r=-2; r<=1; r++) { create_part(-1, x+r, y-2, playerp->elem); create_part(-1, x+r+1, y+2, playerp->elem); create_part(-1, x-2, y+r+1, playerp->elem); create_part(-1, x+2, y+r, playerp->elem); } kill_part(i); //Kill him return 1; } //Follow gravity gvx = gvy = 0.0f; switch (gravityMode) { default: case 0: gvy = 1; break; case 1: gvy = gvx = 0.0f; break; case 2: { float gravd; gravd = 0.01f - hypotf((parts[i].x - XCNTR), (parts[i].y - YCNTR)); gvx = ((float)(parts[i].x - XCNTR) / gravd); gvy = ((float)(parts[i].y - YCNTR) / gravd); } } gvx += gravx[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; gvy += gravy[((int)parts[i].y/CELL)*(XRES/CELL)+((int)parts[i].x/CELL)]; parts[i].vx -= gvx*dt; //Head up! parts[i].vy -= gvy*dt; //Verlet integration pp = 2*playerp->legs[0]-playerp->legs[2]+playerp->accs[0]*dt*dt; playerp->legs[2] = playerp->legs[0]; playerp->legs[0] = pp; pp = 2*playerp->legs[1]-playerp->legs[3]+playerp->accs[1]*dt*dt; playerp->legs[3] = playerp->legs[1]; playerp->legs[1] = pp; pp = 2*playerp->legs[4]-playerp->legs[6]+(playerp->accs[2]+gvx)*dt*dt; playerp->legs[6] = playerp->legs[4]; playerp->legs[4] = pp; pp = 2*playerp->legs[5]-playerp->legs[7]+(playerp->accs[3]+gvy)*dt*dt; playerp->legs[7] = playerp->legs[5]; playerp->legs[5] = pp; pp = 2*playerp->legs[8]-playerp->legs[10]+playerp->accs[4]*dt*dt; playerp->legs[10] = playerp->legs[8]; playerp->legs[8] = pp; pp = 2*playerp->legs[9]-playerp->legs[11]+playerp->accs[5]*dt*dt; playerp->legs[11] = playerp->legs[9]; playerp->legs[9] = pp; pp = 2*playerp->legs[12]-playerp->legs[14]+(playerp->accs[6]+gvx)*dt*dt; playerp->legs[14] = playerp->legs[12]; playerp->legs[12] = pp; pp = 2*playerp->legs[13]-playerp->legs[15]+(playerp->accs[7]+gvy)*dt*dt; playerp->legs[15] = playerp->legs[13]; playerp->legs[13] = pp; //Setting acceleration to 0 playerp->accs[0] = 0; playerp->accs[1] = 0; playerp->accs[2] = 0; playerp->accs[3] = 0; playerp->accs[4] = 0; playerp->accs[5] = 0; playerp->accs[6] = 0; playerp->accs[7] = 0; gx = (playerp->legs[4] + playerp->legs[12])/2 - gvy; gy = (playerp->legs[5] + playerp->legs[13])/2 + gvx; dl = pow(gx - playerp->legs[4], 2) + pow(gy - playerp->legs[5], 2); dr = pow(gx - playerp->legs[12], 2) + pow(gy - playerp->legs[13], 2); //Go left if (((int)(playerp->comm)&0x01) == 0x01) { if (dl>dr) { if (INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) { playerp->accs[2] = -3*gvy-3*gvx; playerp->accs[3] = 3*gvx-3*gvy; playerp->accs[0] = -gvy; playerp->accs[1] = gvx; } } else { if (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)) { playerp->accs[6] = -3*gvy-3*gvx; playerp->accs[7] = 3*gvx-3*gvy; playerp->accs[0] = -gvy; playerp->accs[1] = gvx; } } } //Go right if (((int)(playerp->comm)&0x02) == 0x02) { if (dl<dr) { if (INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) { playerp->accs[2] = 3*gvy-3*gvx; playerp->accs[3] = -3*gvx-3*gvy; playerp->accs[0] = gvy; playerp->accs[1] = -gvx; } } else { if (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)) { playerp->accs[6] = 3*gvy-3*gvx; playerp->accs[7] = -3*gvx-3*gvy; playerp->accs[0] = gvy; playerp->accs[1] = -gvx; } } } //Jump if (((int)(playerp->comm)&0x04) == 0x04 && ((INBOND(playerp->legs[4], playerp->legs[5]) && !eval_move(t, playerp->legs[4], playerp->legs[5], NULL)) || (INBOND(playerp->legs[12], playerp->legs[13]) && !eval_move(t, playerp->legs[12], playerp->legs[13], NULL)))) { parts[i].vy -= 4*gvy; playerp->accs[3] -= gvy; playerp->accs[7] -= gvy; } //Charge detector wall if foot inside if (bmap[(int)(playerp->legs[5]+0.5)/CELL][(int)(playerp->legs[4]+0.5)/CELL]==WL_DETECT) set_emap((int)playerp->legs[4]/CELL, (int)playerp->legs[5]/CELL); if (bmap[(int)(playerp->legs[13]+0.5)/CELL][(int)(playerp->legs[12]+0.5)/CELL]==WL_DETECT) set_emap((int)(playerp->legs[12]+0.5)/CELL, (int)(playerp->legs[13]+0.5)/CELL); //Searching for particles near head 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 = photons[y+ry][x+rx]; if (!r && !bmap[(y+ry)/CELL][(x+rx)/CELL]) continue; if (ptypes[r&0xFF].falldown!=0 || ptypes[r&0xFF].state == ST_GAS || ptypes[r&0xFF].properties&TYPE_GAS || ptypes[r&0xFF].properties&TYPE_LIQUID || (r&0xFF) == PT_NEUT || (r&0xFF) == PT_PHOT) { playerp->elem = r&0xFF; //Current element } if ((r&0xFF)==PT_TESC || (r&0xFF)==PT_LIGH) playerp->elem = PT_LIGH; if ((r&0xFF) == PT_PLNT && parts[i].life<100) //Plant gives him 5 HP { if (parts[i].life<=95) parts[i].life += 5; else parts[i].life = 100; kill_part(r>>8); } if ((r&0xFF) == PT_NEUT) { if (parts[i].life<=100) parts[i].life -= (102-parts[i].life)/2; else parts[i].life *= 0.9f; kill_part(r>>8); } if (bmap[(ry+y)/CELL][(rx+x)/CELL]==WL_FAN) playerp->elem = SPC_AIR; if ((r&0xFF)==PT_PRTI) STKM_interact(playerp, i, rx, ry); if (!parts[i].type)//STKM_interact may kill STKM return 1; }
int update_BOMB(UPDATE_FUNC_ARGS) { int r, rx, ry, nb; if (parts[i].tmp==1) { 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 (ptypes[r&0xFF].properties & (TYPE_SOLID | TYPE_PART | TYPE_LIQUID) && (r&0xFF)!=PT_BOMB) { kill_part(i); return 1; } } } else if (parts[i].tmp==0) { 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_BOMB && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_CLNE && (r&0xFF)!=PT_PCLN && (r&0xFF)!=PT_BCLN) { int rad = 8; int nxi; int nxj; pmap[y][x] = 0; for (nxj=-(rad+1); nxj<=(rad+1); nxj++) for (nxi=-(rad+1); nxi<=(rad+1); nxi++) if ((pow(nxi,2))/(pow((rad+1),2))+(pow(nxj,2))/(pow((rad+1),2))<=1) { nb = create_part(-1, x+nxi, y+nxj, PT_BOMB); if (nb!=-1) { parts[nb].tmp = 1; parts[nb].life = 50; parts[nb].temp = MAX_TEMP; parts[nb].vx = rand()%20-10; parts[nb].vy = rand()%20-10; } } for (nxj=-rad; nxj<=rad; nxj++) for (nxi=-rad; nxi<=rad; nxi++) if ((pow(nxi,2))/(pow(rad,2))+(pow(nxj,2))/(pow(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) { delete_part(x+nxi, y+nxj, 0);//it SHOULD kill anything but the exceptions above, doesn't seem to always work pv[(y+nxj)/CELL][(x+nxi)/CELL] += 0.1f; nb = create_part(-1, x+nxi, y+nxj, PT_BOMB); if (nb!=-1) { parts[nb].tmp = 2; parts[nb].life = 2; parts[nb].temp = MAX_TEMP; } } //create_parts(x, y, 9, 9, PT_BOMB); //create_parts(x, y, 8, 8, PT_NONE); kill_part(i); return 1; } } } return 0; }
int update_BANG(UPDATE_FUNC_ARGS) { int r, rx, ry, nb; if(parts[i].tmp==0) { if(parts[i].temp>=673.0f) parts[i].tmp = 1; else 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_FIRE || (r&0xFF)==PT_PLSM) { parts[i].tmp = 1; } else if ((r&0xFF)==PT_SPRK || (r&0xFF)==PT_LIGH) { parts[i].tmp = 1; } } } else if(parts[i].tmp==1) { int tempvalue = 2; flood_prop(x, y, offsetof(particle, tmp), &tempvalue, 0); } else if(parts[i].tmp==2) { parts[i].tmp = 3; } else if(parts[i].tmp>=3) { float otemp = parts[i].temp-275.13f; //Explode!! pv[y/CELL][x/CELL] += 0.5f; parts[i].tmp = 0; if(!(rand()%3)) { if(!(rand()%2)) { create_part(i, x, y, PT_FIRE); parts[i].temp = (MAX_TEMP/4)+otemp; } else { create_part(i, x, y, PT_SMKE); parts[i].temp = (MAX_TEMP/4)+otemp; } } else { if(!(rand()%15)) { create_part(i, x, y, PT_BOMB); parts[i].tmp = 1; parts[i].life = 50; parts[i].temp = (MAX_TEMP/3)+otemp; parts[i].vx = rand()%20-10; parts[i].vy = rand()%20-10; } else { kill_part(i); } } return 1; } return 0; }