예제 #1
0
파일: shld.c 프로젝트: 1dev2/The-Powder-Toy
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;
}
예제 #2
0
파일: thrm.c 프로젝트: BRMT/The-Powder-Toy
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;
}
예제 #3
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);
				}
예제 #4
0
파일: wste.c 프로젝트: Ties85/Powder-Sim
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;
                    }
예제 #5
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;
}
예제 #6
0
파일: shld.c 프로젝트: 1dev2/The-Powder-Toy
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;
				}
예제 #7
0
파일: qrtz.c 프로젝트: BRMT/The-Powder-Toy
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 ++;
					}
예제 #8
0
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;
}
예제 #9
0
파일: fwrk.c 프로젝트: Ties85/Powder-Sim
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;
}
예제 #10
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);
				}
예제 #11
0
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);
				}	
예제 #12
0
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);
				}
예제 #13
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;
				}
예제 #14
0
파일: ice.c 프로젝트: BRMT/The-Powder-Toy
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);
				}
예제 #15
0
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);
				}
예제 #16
0
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)
예제 #17
0
파일: wtrv.c 프로젝트: 1dev2/The-Powder-Toy
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;
}
예제 #18
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;
}
예제 #19
0
파일: bari.c 프로젝트: tommig/Powder-Sim
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;
				}
예제 #20
0
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;
                                        }
                                }
예제 #21
0
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;
}
예제 #22
0
파일: cbnw.c 프로젝트: BRMT/The-Powder-Toy
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++;
					}
				}