From 2f46dca7c1d0016957dfd88831f453f06e080fef Mon Sep 17 00:00:00 2001 From: jacksonmj Date: Wed, 12 Oct 2011 00:11:20 +0800 Subject: [PATCH] Some work on DEST, EMP, LIGH Change indentation to tabs, respect temperature limit (if a hotter reaction is required, should raise temp limit instead of ignoring it). DEST: fix TYPE_SOLID check, and prevent it displacing DMND EMP: randomise DLAY delay instead of heating it (since DLAY does not melt and does not transfer heat) Fix nearest_part so that t=-1 does not include dead particles --- includes/powder.h | 2 +- src/elements/dest.c | 97 ++++++------- src/elements/emp.c | 180 ++++++++++++----------- src/elements/ligh.c | 337 ++++++++++++++++++++++---------------------- src/elements/sprk.c | 48 +++---- src/powder.c | 3 +- 6 files changed, 336 insertions(+), 331 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 9b1e0e74a..b2819540b 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -465,7 +465,7 @@ static const part_type ptypes[PT_NUM] = {"PTCT", PIXPACK(0x405050), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Semi-conductor. Only conducts electricity when cold (Less than 100C)", ST_SOLID, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, &update_NPTCT}, {"BGLA", PIXPACK(0x606060), 0.4f, 0.04f * CFDS, 0.94f, 0.95f, -0.1f, 0.3f, 0.00f, 0.000f * CFDS, 1, 0, 0, 5, 2, 1, 1, 90, SC_POWDERS, R_TEMP+0.0f +273.15f, 150, "Broken Glass, Heavy particles. Meltable. Bagels.", ST_SOLID, TYPE_PART | PROP_HOT_GLOW, NULL}, {"THDR", PIXPACK(0xFFFFA0), 0.0f, 0.00f * CFDS, 1.0f, 0.30f, -0.99f, 0.6f, 0.62f, 0.000f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_EXPLOSIVE, 9000.0f +273.15f, 1, "Lightning! Very hot, inflicts damage upon most materials, transfers current to metals.", ST_NONE, TYPE_ENERGY, &update_THDR}, - {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_GAS, 10000.0f +273.15f, 5, "Plasma, extremely hot.", ST_NONE, TYPE_GAS|PROP_LIFE_DEC|PROP_LIFE_KILL, &update_PYRO}, + {"PLSM", PIXPACK(0xBB99FF), 0.9f, 0.04f * CFDS, 0.97f, 0.20f, 0.0f, -0.1f, 0.30f, 0.001f * CFDS, 0, 0, 0, 0, 0, 1, 1, 1, SC_GAS, 9999.0f, 5, "Plasma, extremely hot.", ST_NONE, TYPE_GAS|PROP_LIFE_DEC|PROP_LIFE_KILL, &update_PYRO}, {"ETRD", PIXPACK(0x404040), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, 0.000f * CFDS, 0, 0, 0, 1, 1, 1, 1, 100, SC_ELEC, R_TEMP+0.0f +273.15f, 251, "Electrode. Creates a surface that allows Plasma arcs. (Use sparingly)", ST_NONE, TYPE_SOLID|PROP_CONDUCTS|PROP_LIFE_DEC, NULL}, {"NICE", PIXPACK(0xC0E0FF), 0.0f, 0.00f * CFDS, 0.90f, 0.00f, 0.0f, 0.0f, 0.00f, -0.0005f* CFDS, 0, 0, 0, 0, 20, 1, 1, 100, SC_SOLIDS, 35.0f, 46, "Nitrogen Ice.", ST_SOLID, TYPE_SOLID, NULL}, {"NBLE", PIXPACK(0xEB4917), 1.0f, 0.01f * CFDS, 0.99f, 0.30f, -0.1f, 0.0f, 0.75f, 0.001f * CFDS, 0, 0, 0, 0, 1, 1, 1, 1, SC_GAS, R_TEMP+2.0f +273.15f, 106, "Noble Gas. Diffuses. Conductive. Ionizes into plasma when introduced to electricity", ST_GAS, TYPE_GAS|PROP_CONDUCTS|PROP_LIFE_DEC, NULL}, diff --git a/src/elements/dest.c b/src/elements/dest.c index fb2a9d76e..a50dfaa6f 100644 --- a/src/elements/dest.c +++ b/src/elements/dest.c @@ -5,55 +5,50 @@ int update_DEST(UPDATE_FUNC_ARGS) { rx=rand()%5-2; ry=rand()%5-2; - r = pmap[y+ry][x+rx]; - if ((r>>8)>=NPART || !r) - return 0; - if ((r&0xFF)!=PT_DEST && (r&0xFF)!=PT_DMND) - { - if (parts[i].life<=0 || parts[i].life>37) - { - parts[i].life=30+rand()%20; - parts[i].temp+=20000; - pv[y/CELL][x/CELL]+=60.0f; - } - parts[i].temp+=10000; - if ((r&0xFF)==PT_PLUT || (r&0xFF)==PT_DEUT) - { - pv[y/CELL][x/CELL]+=20.0f; - parts[i].temp+=18000; - if (rand()%2==0) - { - part_change_type(r>>8, x+rx, y+ry, PT_NEUT); - float rad = (rand()%128+128)/127.0f; - float a = (rand()%360)*M_PI/180.0f; - parts[r>>8].vx = rad*cosf(a); - parts[r>>8].vy = rad*sinf(a); - parts[r>>8].temp+=40000; - pv[y/CELL][x/CELL]+=10.0f; - parts[i].life-=4; - } - } - if ((r&0xFF)==PT_INSL) - { - create_part(r>>8, x+rx, y+ry, PT_FIRE); - parts[r>>8].temp=10000; - } - else if (rand()%3==0) - { - kill_part(r>>8); - parts[i].life-=4*(ptypes[r&0xFF].properties==TYPE_SOLID?3:1); - if (parts[i].life<=0) - parts[i].life=1; - parts[i].temp+=10000; - } - else - { - parts[r>>8].temp+=10000; - } - int topv=pv[y/CELL][x/CELL]/9+parts[r>>8].temp/900; - if (topv>40.0f) - topv=40.0f; - pv[y/CELL][x/CELL]+=40.0f+topv; - } - return 0; + r = pmap[y+ry][x+rx]; + if (!r || (r&0xFF)==PT_DEST || (r&0xFF)==PT_DMND) + return 0; + + if (parts[i].life<=0 || parts[i].life>37) + { + parts[i].life=30+rand()%20; + parts[i].temp+=20000; + pv[y/CELL][x/CELL]+=60.0f; + } + parts[i].temp+=10000; + if ((r&0xFF)==PT_PLUT || (r&0xFF)==PT_DEUT) + { + pv[y/CELL][x/CELL]+=20.0f; + parts[i].temp+=18000; + if (rand()%2==0) + { + float orig_temp = parts[r>>8].temp; + create_part(r>>8, x+rx, y+ry, PT_NEUT); + parts[r>>8].temp = restrict_flt(orig_temp+40000.0f, MIN_TEMP, MAX_TEMP); + pv[y/CELL][x/CELL] += 10.0f; + parts[i].life-=4; + } + } + else if ((r&0xFF)==PT_INSL) + { + create_part(r>>8, x+rx, y+ry, PT_PLSM); + } + else if (rand()%3==0) + { + kill_part(r>>8); + parts[i].life -= 4*((ptypes[r&0xFF].properties&TYPE_SOLID)?3:1); + if (parts[i].life<=0) + parts[i].life=1; + parts[i].temp+=10000; + } + else + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+10000.0f, MIN_TEMP, MAX_TEMP); + } + int topv=pv[y/CELL][x/CELL]/9+parts[r>>8].temp/900; + if (topv>40.0f) + topv=40.0f; + pv[y/CELL][x/CELL]+=40.0f+topv; + parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); + return 0; } diff --git a/src/elements/emp.c b/src/elements/emp.c index 3017bc607..96d1a6d0a 100644 --- a/src/elements/emp.c +++ b/src/elements/emp.c @@ -3,100 +3,108 @@ int update_EMP(UPDATE_FUNC_ARGS) { int r,rx,ry,ok=0,t; if (parts[i].life) - return 0; + return 0; for (rx=-2; rx<3; rx++) for (ry=-2; ry<3; ry++) - if (x+rx>=0 && y+ry>0 && x+rx=0 && y+ry>=0 && x+rx>8)>=NPART || !r) + if (!r) continue; - if ((r&0xFF)==PT_SPRK) - { - ok=1; - break; - } + if ((r&0xFF)==PT_SPRK) + { + ok=1; + break; + } } - if (!ok) - return 0; - parts[i].life=220; - emp_decor+=7; - if (emp_decor>100) - emp_decor=100; + if (!ok) + return 0; + parts[i].life=220; + emp_decor+=7; + if (emp_decor>100) + emp_decor=100; for (r=0; r<=parts_lastActiveIndex; r++) { - t=parts[r].type; - rx=parts[r].x; - ry=parts[r].y; - 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) - { - is_elec=1; - if (rand()%100==0) - parts[r].temp+=3000; - if (rand()%80==0) - part_change_type(r, rx, ry, PT_BREC); - else if (rand()%120==0) - part_change_type(r, rx, ry, PT_NTCT); - } - int n,nx,ny; - for (nx=-2; nx<3; nx++) - for (ny=-2; ny<3; ny++) - if (rx+nx>=0 && ry+ny>0 && rx+nx>8)>=NPART || !n) - continue; - /*if ((n&0xFF)==PT_BTRY && rand()%60==0) - { - part_change_type(n>>8, rx+nx, ry+ny, PT_PLSM); - parts[n>>8].life=rand()%100+70; - parts[n>>8].temp+=3000; - }*/ - if (is_elec && ((n&0xFF)==PT_METL || (n&0xFF)==PT_BMTL) && rand()%280==0) - { - parts[n>>8].temp+=3000; - } - if (is_elec && (n&0xFF)==PT_BMTL && rand()%160==0) - { - part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL); - parts[n>>8].temp+=1000; - } - if (is_elec && (n&0xFF)==PT_METL && rand()%300==0) - { - part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL); - } - if ((t==PT_PSCN || t==PT_NSCN) && (n&0xFF)==PT_SWCH && rand()%100==0) - { - part_change_type(n>>8, rx+nx, ry+ny, PT_BREC); - } - if ((t==PT_PSCN || t==PT_NSCN) && (n&0xFF)==PT_SWCH && rand()%100==0) - { - parts[n>>8].temp+=2000; - } - if (is_elec && (n&0xFF)==PT_WIFI && rand()%8==0) - { - parts[n>>8].temp=rand()%10000; - } - if (is_elec && (n&0xFF)==PT_WIFI && rand()%16==0) - { - create_part(n>>8, rx+nx, ry+ny, PT_BREC); - parts[n>>8].temp+=1000; - } - if ((n&0xFF)==PT_ARAY && rand()%60==0) - { - create_part(n>>8, rx+nx, ry+ny, PT_BREC); - parts[n>>8].temp+=1000; - } - if (t==PT_DLAY && rand()%70==0) - { - parts[n>>8].temp+=2000; - } - } - } + t=parts[r].type; + rx=parts[r].x; + ry=parts[r].y; + 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) + { + is_elec=1; + if (rand()%100==0) + parts[r].temp = restrict_flt(parts[r].temp+3000.0f, MIN_TEMP, MAX_TEMP); + if (rand()%80==0) + part_change_type(r, rx, ry, PT_BREC); + else if (rand()%120==0) + part_change_type(r, rx, ry, PT_NTCT); + } + int n,nx,ny; + for (nx=-2; nx<3; nx++) + for (ny=-2; ny<3; ny++) + if (rx+nx>=0 && ry+ny>=0 && rx+nx>8, rx+nx, ry+ny, PT_PLSM); + parts[n>>8].life=rand()%100+70; + parts[n>>8].temp+=3000; + }*/ + + //Some elements should only be affected by wire/swch, or by a spark on inst/semiconductor + //So not affected by spark on metl, watr etc + if (is_elec) + { + if (((n&0xFF)==PT_METL || (n&0xFF)==PT_BMTL) && rand()%280==0) + { + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+3000.0f, MIN_TEMP, MAX_TEMP); + } + if ((n&0xFF)==PT_BMTL && rand()%160==0) + { + part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL);//TODO: Redundant, was this meant to be BRMT or something? + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+1000.0f, MIN_TEMP, MAX_TEMP); + } + if ((n&0xFF)==PT_METL && rand()%300==0) + { + part_change_type(n>>8, rx+nx, ry+ny, PT_BMTL); + } + if ((n&0xFF)==PT_WIFI && rand()%8==0) + { + //Randomise channel + parts[n>>8].temp = rand()%MAX_TEMP; + } + if ((n&0xFF)==PT_WIFI && rand()%16==0) + { + 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 ((n&0xFF)==PT_SWCH && rand()%100==0) + { + part_change_type(n>>8, rx+nx, ry+ny, PT_BREC); + } + if ((n&0xFF)==PT_SWCH && rand()%100==0) + { + parts[n>>8].temp = restrict_flt(parts[n>>8].temp+2000.0f, MIN_TEMP, MAX_TEMP); + } + if ((n&0xFF)==PT_ARAY && rand()%60==0) + { + 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 (t==PT_DLAY && rand()%70==0) + { + //Randomise delay + parts[n>>8].temp = (rand()%256) + 273.15f; + } + } + } } return 0; } diff --git a/src/elements/ligh.c b/src/elements/ligh.c index 188ff97b0..f3eb31663 100644 --- a/src/elements/ligh.c +++ b/src/elements/ligh.c @@ -4,26 +4,26 @@ int contact_part(int i, int tp) { - int x=parts[i].x, y=parts[i].y; - 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=0 && y+ry>=0 && x+rx>8)>=NPART || !r) + if (!r) continue; - if ((r&0xFF)==tp) - return r>>8; + if ((r&0xFF)==tp) + return r>>8; } - return -1; + return -1; } void create_line_par(int x1, int y1, int x2, int y2, int c, int temp, int life, int tmp, int tmp2) { - if (c==WL_EHOLE || c==WL_ALLOWGAS || c==WL_ALLOWALLELEC || c==WL_ALLOWSOLID || c==WL_ALLOWAIR || c==WL_WALL || c==WL_DESTROYALL || c==WL_ALLOWLIQUID || c==WL_FAN || c==WL_STREAM || c==WL_DETECT || c==WL_EWALL || c==WL_WALLELEC) - return; // this function only for particles, no walls - int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + if (c==WL_EHOLE || c==WL_ALLOWGAS || c==WL_ALLOWALLELEC || c==WL_ALLOWSOLID || c==WL_ALLOWAIR || c==WL_WALL || c==WL_DESTROYALL || c==WL_ALLOWLIQUID || c==WL_FAN || c==WL_STREAM || c==WL_DETECT || c==WL_EWALL || c==WL_WALLELEC) + return; // this function only for particles, no walls + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; float e, de; if (cp) { @@ -54,18 +54,18 @@ void create_line_par(int x1, int y1, int x2, int y2, int c, int temp, int life, sy = (y1= 0.5f) { @@ -77,136 +77,137 @@ void create_line_par(int x1, int y1, int x2, int y2, int c, int temp, int life, int update_LIGH(UPDATE_FUNC_ARGS) { - /* - * - * tmp2: - * -1 - part will be removed - * 0 - "branches" of the lightning - * 1 - bending - * 2 - branching - * 3 - transfer spark or make destruction - * 4 - first pixel - * - * life - "thickness" of lighting (but anyway one pixel) - * - * tmp - angle of lighting - * - */ + /* + * + * tmp2: + * -1 - part will be removed + * 0 - "branches" of the lightning + * 1 - bending + * 2 - branching + * 3 - transfer spark or make destruction + * 4 - first pixel + * + * life - "thickness" of lighting (but anyway one pixel) + * + * tmp - angle of lighting + * + */ int r,rx,ry, multipler, powderful=parts[i].temp*(1+parts[i].life/40)*LIGHTING_POWER; hv[y/CELL][x/CELL]+=powderful/40; if (hv[y/CELL][x/CELL]>MAX_TEMP) - hv[y/CELL][x/CELL]=MAX_TEMP; - for (rx=-2; rx<3; rx++) // destruction - for (ry=-2; ry<3; ry++) - if (x+rx>=0 && y+ry>0 && x+rx=0 && y+ry>=0 && x+rx>8)>=NPART || !r) + if (!r) continue; - if ((r&0xFF)!=PT_LIGH && (r&0xFF)!=PT_TESC) + if ((r&0xFF)!=PT_LIGH && (r&0xFF)!=PT_TESC) { - if (parts[i].tmp2==3) - { - if ((ptypes[r&0xFF].properties&PROP_CONDUCTS) && parts[r>>8].life==0 && parts[r>>8].ctype!=PT_SPRK) - { - parts[r>>8].ctype = parts[r>>8].type; - part_change_type(r>>8,x+rx,y+ry,PT_SPRK); - parts[r>>8].life = 4; + if (parts[i].tmp2==3) + { + if ((ptypes[r&0xFF].properties&PROP_CONDUCTS) && parts[r>>8].life==0) + { + parts[r>>8].ctype = parts[r>>8].type; + create_part(r>>8,x+rx,y+ry,PT_SPRK); + parts[r>>8].life = 4; - pv[y/CELL][x/CELL] += powderful/1200; - parts[r>>8].temp+=powderful/20; - } - else if ((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT) - { - pv[y/CELL][x/CELL] += powderful/110; - parts[r>>8].temp+=powderful/1.5; - } - if ((r&0xFF)==PT_DEUT || (r&0xFF)==PT_PLUT) - { - parts[r>>8].temp+=powderful; - pv[y/CELL][x/CELL] +=powderful/35; - if (rand()%3==0) - { - part_change_type(r>>8,x+rx,y+ry,PT_NEUT); - parts[r>>8].vx=rand()%10-5; - parts[r>>8].vy=rand()%10-5; - } - } - } - if ((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT) - parts[r>>8].temp+=powderful/16; - else - parts[r>>8].temp+=powderful/70; + pv[y/CELL][x/CELL] += powderful/1200; + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/20, MIN_TEMP, MAX_TEMP); + } + else if ((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT) + { + pv[y/CELL][x/CELL] += powderful/110; + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/1.5, MIN_TEMP, MAX_TEMP); + } + if ((r&0xFF)==PT_DEUT || (r&0xFF)==PT_PLUT) + { + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful, MIN_TEMP, MAX_TEMP); + pv[y/CELL][x/CELL] +=powderful/35; + if (rand()%3==0) + { + 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; + } + } + } + if ((r&0xFF)!=PT_CLNE&&(r&0xFF)!=PT_THDR&&(r&0xFF)!=PT_SPRK&&(r&0xFF)!=PT_DMND&&(r&0xFF)!=PT_FIRE&&(r&0xFF)!=PT_NEUT&&(r&0xFF)!=PT_PHOT) + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/16, MIN_TEMP, MAX_TEMP); + else + parts[r>>8].temp = restrict_flt(parts[r>>8].temp+powderful/70, MIN_TEMP, MAX_TEMP); } - } - if (parts[i].tmp2==3) - { - //if (rand()&1) - parts[i].tmp2=1; - /*else - parts[i].tmp2=0;*/ - return 1; - } + } + if (parts[i].tmp2==3) + { + //if (rand()&1) + parts[i].tmp2=1; + /*else + parts[i].tmp2=0;*/ + return 1; + } if (parts[i].tmp2==-1) { - kill_part(i); - return 0; + kill_part(i); + return 1; } if (parts[i].tmp2<=0 || parts[i].life<=1) { - /*if (parts[i].tmp2!=3 && rand()%3000<400/(parts[i].life+1)) - { - parts[i].tmp2=1; - return 1; - }*/ - if (parts[i].tmp2>0) - parts[i].tmp2=0; - parts[i].tmp2--; - return 1; + /*if (parts[i].tmp2!=3 && rand()%3000<400/(parts[i].life+1)) + { + parts[i].tmp2=1; + return 1; + }*/ + if (parts[i].tmp2>0) + parts[i].tmp2=0; + parts[i].tmp2--; + return 1; } if (parts[i].tmp2<=-2) { - kill_part(i); - return 0; + kill_part(i); + return 1; } float angle, angle2=-1; int near=nearest_part(i, -1, parts[i].life*3.5); if (near!=-1 && (parts[near].type==PT_LIGH || parts[near].type==PT_THDR || parts[near].type==PT_NEUT)) - near=-1; + near=-1; if (near!=-1) { - int t=parts[near].type; + int t=parts[near].type; - rx=parts[near].x-x; - ry=parts[near].y-y; - if (asin(ry-sqrt(rx*rx+ry*ry))rand()%2000) - { - part_change_type(near, x+rx, y+ry, PT_LIGH); - parts[near].tmp2=3; - parts[near].life=(int)(1.0*parts[i].life/2-1); - parts[near].tmp=parts[i].tmp-180; - parts[near].temp=parts[i].temp; - }*/ - if (t!=PT_TESC) - { - near=contact_part(near, PT_LIGH); - if (near!=-1) - { - parts[near].tmp2=3; - parts[near].life=(int)(1.0*parts[i].life/2-1); - parts[near].tmp=parts[i].tmp-180; - parts[near].temp=parts[i].temp; - } - } - } - else near=-1; + /*if (t!=PT_DMND && t!=PT_UDMT && t!=PT_TESC && parts[i].temp-300>rand()%2000) + { + part_change_type(near, x+rx, y+ry, PT_LIGH); + parts[near].tmp2=3; + parts[near].life=(int)(1.0*parts[i].life/2-1); + parts[near].tmp=parts[i].tmp-180; + parts[near].temp=parts[i].temp; + }*/ + if (t!=PT_TESC) + { + near=contact_part(near, PT_LIGH); + if (near!=-1) + { + parts[near].tmp2=3; + parts[near].life=(int)(1.0*parts[i].life/2-1); + parts[near].tmp=parts[i].tmp-180; + parts[near].temp=parts[i].temp; + } + } + } + else near=-1; } //if (parts[i].tmp2==1/* || near!=-1*/) @@ -222,66 +223,66 @@ int update_LIGH(UPDATE_FUNC_ARGS) case 2: angle = atan2(x-XCNTR, y-YCNTR)*(180.0f/M_PI)+90; } - //angle=0;//parts[i].tmp-30+rand()%60; - if (angle<0) - angle+=360; - if (angle>=360) - angle-=360; + //angle=0;//parts[i].tmp-30+rand()%60; + if (angle<0) + angle+=360; + if (angle>=360) + angle-=360; if (parts[i].tmp2==2) { - angle2=angle+100-rand()%200; - if (angle2<0) - angle2+=360; - if (angle2>=360) - angle-=360; - /*angle=parts[i].tmp-70+rand()%50; - if (angle<0) - angle+=360; - if (angle>=360) - angle-=360;*/ + angle2=angle+100-rand()%200; + if (angle2<0) + angle2+=360; + if (angle2>=360) + angle-=360; + /*angle=parts[i].tmp-70+rand()%50; + if (angle<0) + angle+=360; + if (angle>=360) + angle-=360;*/ } multipler=parts[i].life*1.5+rand()%((int)(parts[i].life+1)); - rx=cos(angle*M_PI/180)*multipler; - ry=-sin(angle*M_PI/180)*multipler; + rx=cos(angle*M_PI/180)*multipler; + ry=-sin(angle*M_PI/180)*multipler; create_line_par(x, y, x+rx, y+ry, PT_LIGH, parts[i].temp, parts[i].life, angle, 0); - if (x+rx>=0 && y+ry>0 && x+rx=0 && y+ry>=0 && x+rx>8, x+rx, y+ry, PT_LIGH);*/ - if ((r&0xFF)==PT_LIGH && !((r>>8)>=NPART || !r)) - { - parts[r>>8].tmp2=1+(rand()%200>parts[i].tmp2*parts[i].tmp2/10+60); - parts[r>>8].life=(int)(1.0*parts[i].life/1.5-rand()%2); - parts[r>>8].tmp=angle; - parts[r>>8].temp=parts[i].temp; - } + r = pmap[y+ry][x+rx]; + /*if ((r&0xFF)!=PT_LIGH && (r&0xFF)!=PT_DMND && (r&0xFF)!=PT_UDMT && (r&0xFF)!=PT_TESC) + part_change_type(r>>8, x+rx, y+ry, PT_LIGH);*/ + if ((r&0xFF)==PT_LIGH) + { + parts[r>>8].tmp2=1+(rand()%200>parts[i].tmp2*parts[i].tmp2/10+60); + parts[r>>8].life=(int)(1.0*parts[i].life/1.5-rand()%2); + parts[r>>8].tmp=angle; + parts[r>>8].temp=parts[i].temp; + } } if (angle2!=-1) { - multipler=parts[i].life*1.5+rand()%((int)(parts[i].life+1)); - rx=cos(angle2*M_PI/180)*multipler; - ry=-sin(angle2*M_PI/180)*multipler; - create_line_par(x, y, x+rx, y+ry, PT_LIGH, parts[i].temp, parts[i].life, angle2, 0); + multipler=parts[i].life*1.5+rand()%((int)(parts[i].life+1)); + rx=cos(angle2*M_PI/180)*multipler; + ry=-sin(angle2*M_PI/180)*multipler; + create_line_par(x, y, x+rx, y+ry, PT_LIGH, parts[i].temp, parts[i].life, angle2, 0); - if (x+rx>=0 && y+ry>0 && x+rx>8, x+rx, y+ry, PT_LIGH);*/ - if ((r&0xFF)==PT_LIGH && !((r>>8)>=NPART || !r)) - { - parts[r>>8].tmp2=1+(rand()%200>parts[i].tmp2*parts[i].tmp2/10+40); - parts[r>>8].life=(int)(1.0*parts[i].life/1.5-rand()%2); - parts[r>>8].tmp=angle; - parts[r>>8].temp=parts[i].temp; - } - } + if (x+rx>=0 && y+ry>0 && x+rx>8, x+rx, y+ry, PT_LIGH);*/ + if ((r&0xFF)==PT_LIGH && !((r>>8)>=NPART || !r)) + { + parts[r>>8].tmp2=1+(rand()%200>parts[i].tmp2*parts[i].tmp2/10+40); + parts[r>>8].life=(int)(1.0*parts[i].life/1.5-rand()%2); + parts[r>>8].tmp=angle; + parts[r>>8].temp=parts[i].temp; + } + } } - parts[i].tmp2=-1; + parts[i].tmp2=-1; return 1; } diff --git a/src/elements/sprk.c b/src/elements/sprk.c index 2633a65e3..f8f64f892 100644 --- a/src/elements/sprk.c +++ b/src/elements/sprk.c @@ -54,38 +54,38 @@ int update_SPRK(UPDATE_FUNC_ARGS) { } else if (ct==PT_TESC) // tesla coil code { - if (parts[i].tmp>300) - parts[i].tmp=300; - for (rx=-1; rx<2; rx++) + if (parts[i].tmp>300) + parts[i].tmp=300; + for (rx=-1; rx<2; rx++) for (ry=-1; ry<2; ry++) - if (x+rx>=0 && y+ry>0 && x+rx=0 && y+ry>0 && x+rx>8)>=NPART || r) continue; - if (rand()%(parts[i].tmp*parts[i].tmp/20+6)==0) - { - int p=create_part(-1, x+rx*2, y+ry*2, PT_LIGH); - if (p!=-1) - { + if (rand()%(parts[i].tmp*parts[i].tmp/20+6)==0) + { + int p=create_part(-1, x+rx*2, y+ry*2, PT_LIGH); + if (p!=-1) + { if(parts[i].tmp<=4) //Prevent Arithmetic errors with zero values continue; parts[p].life=rand()%(2+parts[i].tmp/15)+4+parts[i].tmp/7; - if (parts[i].life>60) - parts[i].life=60; - parts[p].temp=parts[p].life*parts[i].tmp/2.5; - parts[p].tmp2=1; - parts[p].tmp=acos(1.0*rx/sqrt(rx*rx+ry*ry))/M_PI*360; - parts[i].temp-=parts[i].tmp*2+parts[i].temp/5; // slight self-cooling - if (fabs(pv[y/CELL][x/CELL])!=0.0f) - { - if (fabs(pv[y/CELL][x/CELL])<=0.5f) - pv[y/CELL][x/CELL]=0; - else - pv[y/CELL][x/CELL]-=(pv[y/CELL][x/CELL]>0)?0.5:-0.5; - } - } - } + if (parts[i].life>60) + parts[i].life=60; + parts[p].temp=parts[p].life*parts[i].tmp/2.5; + parts[p].tmp2=1; + parts[p].tmp=acos(1.0*rx/sqrt(rx*rx+ry*ry))/M_PI*360; + parts[i].temp-=parts[i].tmp*2+parts[i].temp/5; // slight self-cooling + if (fabs(pv[y/CELL][x/CELL])!=0.0f) + { + if (fabs(pv[y/CELL][x/CELL])<=0.5f) + pv[y/CELL][x/CELL]=0; + else + pv[y/CELL][x/CELL]-=(pv[y/CELL][x/CELL]>0)?0.5:-0.5; + } + } + } } } else if (ct==PT_IRON) { diff --git a/src/powder.c b/src/powder.c index be22ca6ba..88d26a0cb 100644 --- a/src/powder.c +++ b/src/powder.c @@ -98,6 +98,7 @@ void init_can_move() can_move[t][rt] = 2; } } + can_move[PT_DEST][PT_DMND] = 0; can_move[PT_BIZR][PT_FILT] = 2; can_move[PT_BIZRG][PT_FILT] = 2; for (t=0;t