More fixes, redid a bunch of SPRK, so far everything I've tested works fine.

This commit is contained in:
cracker64 2013-03-02 00:42:07 -05:00
parent a9f4b5fe34
commit d58100dc07
15 changed files with 307 additions and 261 deletions

View File

@ -104,13 +104,16 @@ int Element_CBNW::update(UPDATE_FUNC_ARGS)
} }
if ((r&0xFF)==PT_CBNW) if ((r&0xFF)==PT_CBNW)
{ {
if(!parts[i].tmp && parts[r>>8].tmp) if(!parts[i].tmp)
{
if (parts[r>>8].tmp)
{ {
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 if((r>>8)>i) //If the other particle hasn't been life updated
parts[i].tmp--; parts[i].tmp--;
} }
else if(parts[i].tmp && !parts[r>>8].tmp) }
else if(!parts[r>>8].tmp)
{ {
parts[r>>8].tmp = parts[i].tmp; parts[r>>8].tmp = parts[i].tmp;
if((r>>8)>i) //If the other particle hasn't been life updated if((r>>8)>i) //If the other particle hasn't been life updated

View File

@ -77,16 +77,13 @@ int Element_DLAY::update(UPDATE_FUNC_ARGS)
parts[i].life--; parts[i].life--;
} }
} }
else else if (!parts[r>>8].life)
{
if (!parts[r>>8].life)
{ {
parts[r>>8].life = parts[i].life; parts[r>>8].life = parts[i].life;
if((r>>8)>i) //If the other particle hasn't been life updated if((r>>8)>i) //If the other particle hasn't been life updated
parts[r>>8].life++; parts[r>>8].life++;
} }
} }
}
else if((r&0xFF)==PT_NSCN && oldl==1) else if((r&0xFF)==PT_NSCN && oldl==1)
{ {
sim->create_part(-1, x+rx, y+ry, PT_SPRK); sim->create_part(-1, x+rx, y+ry, PT_SPRK);

View File

@ -82,7 +82,7 @@ int Element_DTEC::update(UPDATE_FUNC_ARGS)
r = sim->photons[y+ry][x+rx]; r = sim->photons[y+ry][x+rx];
if(!r) if(!r)
continue; continue;
if ((r&0xFF) == parts[i].ctype && (parts[i].ctype != PT_LIFE || parts[i].tmp == parts[r>>8].ctype || !parts[i].tmp)) if (parts[r>>8].type == parts[i].ctype && (parts[i].ctype != PT_LIFE || parts[i].tmp == parts[r>>8].ctype || !parts[i].tmp))
parts[i].life = 1; parts[i].life = 1;
} }
return 0; return 0;

View File

@ -50,13 +50,8 @@ Element_ELEC::Element_ELEC()
int Element_ELEC::update(UPDATE_FUNC_ARGS) int Element_ELEC::update(UPDATE_FUNC_ARGS)
{ {
int r, rt, rx, ry, nb, rrx, rry; int r, rt, rx, ry, nb, rrx, rry;
float rr, rrr;
parts[i].pavg[0] = x; parts[i].pavg[0] = x;
parts[i].pavg[1] = y; parts[i].pavg[1] = y;
if(pmap[y][x]==PT_GLOW)//move into movement code
{
sim->part_change_type(i, x, y, PT_PHOT);
}
for (rx=-2; rx<=2; rx++) for (rx=-2; rx<=2; rx++)
for (ry=-2; ry<=2; ry++) for (ry=-2; ry<=2; ry++)
if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) { if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) {
@ -110,6 +105,12 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS)
parts[r>>8].tmp2 += 5; parts[r>>8].tmp2 += 5;
parts[r>>8].life = 1000; parts[r>>8].life = 1000;
break; break;
case PT_GLOW:
if (!rx && !ry)//if on GLOW
sim->part_change_type(i, x, y, PT_PHOT);
break;
case PT_NONE: //seems to speed up ELEC even if it isn't used
break;
default: default:
if ((sim->elements[rt].Properties & PROP_CONDUCTS) && (rt!=PT_NBLE||parts[i].temp<2273.15)) if ((sim->elements[rt].Properties & PROP_CONDUCTS) && (rt!=PT_NBLE||parts[i].temp<2273.15))
{ {
@ -117,7 +118,7 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS)
sim->kill_part(i); sim->kill_part(i);
return 1; return 1;
} }
continue; break;
} }
} }
return 0; return 0;

View File

@ -163,6 +163,9 @@ int Element_NEUT::update(UPDATE_FUNC_ARGS)
case PT_EXOT: case PT_EXOT:
if (!(rand()%20)) if (!(rand()%20))
parts[r>>8].life = 1500; parts[r>>8].life = 1500;
break;
default:
break;
} }
} }
return 0; return 0;

View File

@ -107,8 +107,7 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
parts[r>>8].life = 10; parts[r>>8].life = 10;
} }
} }
} if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && sim->elements[parts[i].ctype].Enabled)
if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && sim->elements[parts[i].ctype].Enabled && parts[i].life==10)
{ {
if (parts[i].ctype==PT_PHOT) {//create photons a different way if (parts[i].ctype==PT_PHOT) {//create photons a different way
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
@ -143,6 +142,8 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
} }
} }
} }
}
return 0; return 0;
} }

View File

@ -61,11 +61,13 @@ int Element_PHOT::update(UPDATE_FUNC_ARGS)
if (!(rand()%10)) Element_FIRE::update(UPDATE_FUNC_SUBCALL_ARGS); if (!(rand()%10)) Element_FIRE::update(UPDATE_FUNC_SUBCALL_ARGS);
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES && (rx || ry)) { if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) {
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if ((r&0xFF)==PT_ISOZ && !(rand()%400)) if ((r&0xFF)==PT_ISOZ || (r&0xFF)==PT_ISZS)
{
if (!(rand()%400))
{ {
parts[i].vx *= 0.90; parts[i].vx *= 0.90;
parts[i].vy *= 0.90; parts[i].vy *= 0.90;
@ -76,20 +78,8 @@ int Element_PHOT::update(UPDATE_FUNC_ARGS)
parts[r>>8].vy = rr*sinf(rrr); parts[r>>8].vy = rr*sinf(rrr);
sim->pv[y/CELL][x/CELL] -= 15.0f * CFDS; sim->pv[y/CELL][x/CELL] -= 15.0f * CFDS;
} }
if ((r&0xFF)==PT_ISZS && !(rand()%400))
{
parts[i].vx *= 0.90;
parts[i].vy *= 0.90;
sim->create_part(r>>8, x+rx, y+ry, PT_PHOT);
rr = (rand()%228+128)/127.0f;
rrr = (rand()%360)*3.14159f/180.0f;
parts[r>>8].vx = rr*cosf(rrr);
parts[r>>8].vy = rr*sinf(rrr);
sim->pv[y/CELL][x/CELL] -= 15.0f * CFDS;
} }
} else if((r&0xFF) == PT_QRTZ && !ry && !rx)//if on QRTZ
r = pmap[y][x];
if((r&0xFF) == PT_QRTZ)// && parts[i].ctype==0x3FFFFFFF)
{ {
float a = (rand()%360)*3.14159f/180.0f; float a = (rand()%360)*3.14159f/180.0f;
parts[i].vx = 3.0f*cosf(a); parts[i].vx = 3.0f*cosf(a);
@ -98,13 +88,7 @@ int Element_PHOT::update(UPDATE_FUNC_ARGS)
parts[i].ctype = 0x1F<<(rand()%26); parts[i].ctype = 0x1F<<(rand()%26);
parts[i].life++; //Delay death parts[i].life++; //Delay death
} }
//r = pmap[y][x]; }
//rt = r&0xFF;
/*if (rt==PT_CLNE || rt==PT_PCLN || rt==PT_BCLN || rt==PT_PBCN) {
if (!parts[r>>8].ctype)
parts[r>>8].ctype = PT_PHOT;
}*/
return 0; return 0;
} }

View File

@ -65,19 +65,26 @@ int Element_PQRT::update(UPDATE_FUNC_ARGS)
parts[i].ctype ++; parts[i].ctype ++;
} }
} }
// grow if absorbed SLTW // grow and diffuse
if (parts[i].ctype>0) if (parts[i].ctype>0)
{ {
for ( trade = 0; trade<5; trade ++) bool stopgrow=false;
int rnd, sry, srx;
for ( trade = 0; trade<9; trade ++)
{ {
rx = rand()%3-1; rnd = rand()%0x3FF;
ry = rand()%3-1; rx = (rnd%5)-2;
srx = (rnd%3)-1;
rnd = rnd>>3;
ry = (rnd%5)-2;
sry = (rnd%3)-1;
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{ {
r = pmap[y+ry][x+rx]; if (!stopgrow)//try to grow
if (!r && parts[i].ctype!=0)
{ {
np = sim->create_part(-1,x+rx,y+ry,PT_QRTZ); if (!pmap[y+sry][x+srx] && parts[i].ctype!=0)
{
np = sim->create_part(-1,x+srx,y+sry,PT_QRTZ);
if (np>-1) if (np>-1)
{ {
parts[np].tmp = parts[i].tmp; parts[np].tmp = parts[i].tmp;
@ -90,25 +97,15 @@ int Element_PQRT::update(UPDATE_FUNC_ARGS)
{ {
parts[i].ctype=-1; parts[i].ctype=-1;
} }
break; stopgrow=true;
} }
} }
} }
} //diffusion
}
// diffuse absorbed SLTW
if (parts[i].ctype>0)
{
for ( trade = 0; trade<9; trade ++)
{
rx = rand()%5-2;
ry = rand()%5-2;
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if ((r&0xFF)==PT_PQRT && (parts[i].ctype>parts[r>>8].ctype) && parts[r>>8].ctype>=0 )//diffusion else if ((r&0xFF)==PT_PQRT && (parts[i].ctype>parts[r>>8].ctype) && parts[r>>8].ctype>=0 )
{ {
tmp = parts[i].ctype - parts[r>>8].ctype; tmp = parts[i].ctype - parts[r>>8].ctype;
if (tmp ==1) if (tmp ==1)

View File

@ -71,19 +71,26 @@ int Element_QRTZ::update(UPDATE_FUNC_ARGS)
parts[i].ctype ++; parts[i].ctype ++;
} }
} }
// grow if absorbed SLTW // grow and diffuse
if (parts[i].ctype>0) if (parts[i].ctype>0)
{ {
for ( trade = 0; trade<5; trade ++) bool stopgrow=false;
int rnd, sry, srx;
for ( trade = 0; trade<9; trade ++)
{ {
rx = rand()%3-1; rnd = rand()%0x3FF;
ry = rand()%3-1; rx = (rnd%5)-2;
srx = (rnd%3)-1;
rnd >>= 3;
ry = (rnd%5)-2;
sry = (rnd%3)-1;
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{ {
r = pmap[y+ry][x+rx]; if (!stopgrow)//try to grow
if (!r && parts[i].ctype!=0)
{ {
np = sim->create_part(-1,x+rx,y+ry,PT_QRTZ); if (!pmap[y+sry][x+srx] && parts[i].ctype!=0)
{
np = sim->create_part(-1,x+srx,y+sry,PT_QRTZ);
if (np>-1) if (np>-1)
{ {
parts[np].tmp = parts[i].tmp; parts[np].tmp = parts[i].tmp;
@ -96,26 +103,15 @@ int Element_QRTZ::update(UPDATE_FUNC_ARGS)
{ {
parts[i].ctype=-1; parts[i].ctype=-1;
} }
stopgrow=true;
break;
} }
} }
} }
} //diffusion
}
// diffuse absorbed SLTW
if (parts[i].ctype>0)
{
for ( trade = 0; trade<9; trade ++)
{
rx = rand()%5-2;
ry = rand()%5-2;
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
{
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if ((r&0xFF)==PT_QRTZ && (parts[i].ctype>parts[r>>8].ctype) && parts[r>>8].ctype>=0 )//diffusion else if ((r&0xFF)==PT_QRTZ && (parts[i].ctype>parts[r>>8].ctype) && parts[r>>8].ctype>=0 )
{ {
tmp = parts[i].ctype - parts[r>>8].ctype; tmp = parts[i].ctype - parts[r>>8].ctype;
if (tmp ==1) if (tmp ==1)

View File

@ -84,6 +84,8 @@ int Element_SLTW::update(UPDATE_FUNC_ARGS)
} }
} }
break; break;
case PT_NONE:
break;
default: default:
continue; continue;
} }

View File

@ -210,10 +210,8 @@ int Element_SOAP::update(UPDATE_FUNC_ARGS)
if ((r&0xFF) == PT_OIL) if ((r&0xFF) == PT_OIL)
{ {
float ax, ay; float ax, ay;
parts[i].vy = (parts[i].vy-0.1f)*0.5f; ax = (parts[i].vx*0.5f + parts[r>>8].vx)/2;
parts[i].vx *= 0.5f; ay = ((parts[i].vy-0.1f)*0.5f + parts[r>>8].vy)/2;
ax = (parts[i].vx + parts[r>>8].vx)/2;
ay = (parts[i].vy + parts[r>>8].vy)/2;
parts[i].vx = parts[r>>8].vx = ax; parts[i].vx = parts[r>>8].vx = ax;
parts[i].vy = parts[r>>8].vy = ay; parts[i].vy = parts[r>>8].vy = ay;
} }

View File

@ -63,23 +63,22 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
parts[i].life = 4; parts[i].life = 4;
if (ct == PT_WATR) if (ct == PT_WATR)
parts[i].life = 64; parts[i].life = 64;
if (ct == PT_SLTW) else if (ct == PT_SLTW)
parts[i].life = 54; parts[i].life = 54;
if (ct == PT_SWCH) else if (ct == PT_SWCH)
parts[i].life = 14; parts[i].life = 14;
return 0; return 0;
} }
if (ct==PT_SPRK) switch(ct)
{ {
case PT_SPRK:
sim->kill_part(i); sim->kill_part(i);
return 1; return 1;
} case PT_NTCT:
else if (ct==PT_NTCT || ct==PT_PTCT) case PT_PTCT:
{
Element_NTCT::update(UPDATE_FUNC_SUBCALL_ARGS); Element_NTCT::update(UPDATE_FUNC_SUBCALL_ARGS);
} break;
else if (ct==PT_ETRD) case PT_ETRD:
{
if (parts[i].life==1) if (parts[i].life==1)
{ {
nearp = sim->nearest_part(i, PT_ETRD, -1); nearp = sim->nearest_part(i, PT_ETRD, -1);
@ -94,9 +93,8 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
parts[nearp].ctype = PT_ETRD; parts[nearp].ctype = PT_ETRD;
} }
} }
} break;
else if (ct==PT_NBLE) case PT_NBLE:
{
if (parts[i].life<=1&&parts[i].tmp!=1) if (parts[i].life<=1&&parts[i].tmp!=1)
{ {
parts[i].life = rand()%150+50; parts[i].life = rand()%150+50;
@ -107,9 +105,8 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
parts[i].temp = 3500; parts[i].temp = 3500;
sim->pv[y/CELL][x/CELL] += 1; sim->pv[y/CELL][x/CELL] += 1;
} }
} break;
else if (ct==PT_TESC) // tesla coil code case PT_TESC:
{
if (parts[i].tmp>300) if (parts[i].tmp>300)
parts[i].tmp=300; parts[i].tmp=300;
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
@ -141,8 +138,8 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
} }
} }
} }
} break;
else if (ct==PT_IRON) { case PT_IRON:
for (rx=-1; rx<2; rx++) for (rx=-1; rx<2; rx++)
for (ry=-1; ry<2; ry++) for (ry=-1; ry<2; ry++)
if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry))
@ -150,16 +147,18 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
r = pmap[y+ry][x+rx]; r = pmap[y+ry][x+rx];
if (!r) if (!r)
continue; continue;
if (((r&0xFF) == PT_DSTW && 30>(rand()/(RAND_MAX/1000))) || if ((r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || (r&0xFF)==PT_WATR)
((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/1000))) ||
((r&0xFF) == PT_WATR && 30>(rand()/(RAND_MAX/1000))))
{ {
if (rand()<RAND_MAX/3) int rnd = rand()%100;
if (!rnd)
sim->part_change_type(r>>8,x+rx,y+ry,PT_O2); sim->part_change_type(r>>8,x+rx,y+ry,PT_O2);
else else if (3>rnd)
sim->part_change_type(r>>8,x+rx,y+ry,PT_H2); sim->part_change_type(r>>8,x+rx,y+ry,PT_H2);
} }
} }
break;
default:
break;
} }
for (rx=-2; rx<3; rx++) for (rx=-2; rx<3; rx++)
for (ry=-2; ry<3; ry++) for (ry=-2; ry<3; ry++)
@ -172,69 +171,134 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
conduct_sprk = 1; conduct_sprk = 1;
// ct = spark from material, rt = spark to material. Make conduct_sprk = 0 if conduction not allowed // 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); 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 switch (rt)
{ {
if (rt==PT_SWCH&&ct==PT_PSCN&&parts[r>>8].life<10) { case PT_SWCH:
if (pavg!=PT_INSL && parts[i].life<4)
{
if(ct==PT_PSCN && parts[r>>8].life<10) {
parts[r>>8].life = 10; parts[r>>8].life = 10;
} }
if (ct==PT_NSCN) { else if (ct==PT_NSCN)
{
parts[r>>8].ctype = PT_NONE;
parts[r>>8].life = 9;
}
}
break;
case PT_SPRK:
if (pavg!=PT_INSL && parts[i].life<4)
{
if (parts[r>>8].ctype==PT_SWCH)
{
if (ct==PT_NSCN)
{
sim->part_change_type(r>>8,x+rx,y+ry,PT_SWCH); sim->part_change_type(r>>8,x+rx,y+ry,PT_SWCH);
parts[r>>8].ctype = PT_NONE; parts[r>>8].ctype = PT_NONE;
parts[r>>8].life = 9; parts[r>>8].life = 9;
} }
} }
else if ((ct==PT_PSCN||ct==PT_NSCN) && (rt==PT_PUMP||rt==PT_GPMP||rt==PT_HSWC||rt==PT_PBCN) && parts[i].life<4) // PROP_PTOGGLE, Maybe? We seem to use 2 different methods for handling actived elements, this one seems better. Yes, use this one for new elements, PCLN is different for compatibility with existing saves else if(parts[r>>8].ctype==PT_NTCT||parts[r>>8].ctype==PT_PTCT)
if (ct==PT_METL)
{
parts[r>>8].temp = 473.0f;
}
}
continue;
case PT_PUMP:
case PT_GPMP:
case PT_HSWC:
case PT_PBCN:
if (parts[i].life<4)// PROP_PTOGGLE, Maybe? We seem to use 2 different methods for handling actived elements, this one seems better. Yes, use this one for new elements, PCLN is different for compatibility with existing saves
{ {
if (ct==PT_PSCN) parts[r>>8].life = 10; if (ct==PT_PSCN) parts[r>>8].life = 10;
else if (ct==PT_NSCN && parts[r>>8].life>=10) parts[r>>8].life = 9; else if (ct==PT_NSCN && parts[r>>8].life>=10) parts[r>>8].life = 9;
} }
else if ((ct==PT_PSCN||ct==PT_NSCN) && (rt==PT_LCRY&&abs(rx)<2&&abs(ry)<2) && parts[i].life<4) continue;
case PT_LCRY:
if (abs(rx)<2&&abs(ry)<2 && parts[i].life<4)
{ {
if (ct==PT_PSCN && parts[r>>8].tmp == 0) parts[r>>8].tmp = 2; if (ct==PT_PSCN && parts[r>>8].tmp == 0) parts[r>>8].tmp = 2;
else if (ct==PT_NSCN && parts[r>>8].tmp == 3) parts[r>>8].tmp = 1; else if (ct==PT_NSCN && parts[r>>8].tmp == 3) parts[r>>8].tmp = 1;
} }
continue;
if (rt == PT_PPIP && parts[i].life == 3 && pavg!=PT_INSL) case PT_PPIP:
if (parts[i].life == 3 && pavg!=PT_INSL)
{ {
if (ct == PT_NSCN || ct == PT_PSCN || ct == PT_INST) if (ct == PT_NSCN || ct == PT_PSCN || ct == PT_INST)
Element_PPIP::flood_trigger(sim, x+rx, y+ry, ct); Element_PPIP::flood_trigger(sim, x+rx, y+ry, ct);
} }
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) continue;
case PT_NTCT: case PT_PTCT: case PT_INWR:
if (ct==PT_METL && pavg!=PT_INSL && parts[i].life<4)
{ {
parts[r>>8].temp = 473.0f; parts[r>>8].temp = 473.0f;
if (rt==PT_NTCT||rt==PT_PTCT) if (rt==PT_NTCT||rt==PT_PTCT)
continue; continue;
} }
break;
}
//the crazy conduct checks
if (pavg == PT_INSL) continue; if (pavg == PT_INSL) continue;
if (!((sim->elements[rt].Properties&PROP_CONDUCTS)||rt==PT_INST||rt==PT_QRTZ)) 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) if (abs(rx)+abs(ry)>=4 &&ct!=PT_SWCH&&rt!=PT_SWCH)
continue; continue;
//if (rt==ct && rt!=PT_INST) goto conduct; 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)))
switch (ct)
{
case PT_INST:
if (rt==PT_NSCN)
goto conduct;
continue; continue;
else if (ct==PT_PTCT && !(rt==PT_PSCN || rt==PT_PTCT || (rt==PT_NSCN&&parts[i].temp<373.0f))) case PT_SWCH:
if (rt==PT_PSCN||rt==PT_NSCN||rt==PT_WATR||rt==PT_SLTW||rt==PT_NTCT||rt==PT_PTCT||rt==PT_INWR)
continue; continue;
else if (ct==PT_INWR && !(rt==PT_NSCN || rt==PT_INWR || rt==PT_PSCN)) goto conduct;
case PT_ETRD:
if (rt==PT_METL||rt==PT_BMTL||rt==PT_BRMT||rt==PT_LRBD||rt==PT_RBDM||rt==PT_PSCN||rt==PT_NSCN)
goto conduct;
continue; continue;
else if (ct==PT_NSCN && rt==PT_PSCN) case PT_NTCT:
if (rt==PT_PSCN || (rt==PT_NSCN && parts[i].temp>373.0f))
goto conduct;
continue; 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)) case PT_PTCT:
if (rt==PT_PSCN || (rt==PT_NSCN && parts[i].temp<373.0f))
goto conduct;
continue; 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)) switch (rt)
{
case PT_QRTZ:
if ((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))
goto conduct;
continue; 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))) case PT_NTCT:
if (ct==PT_NSCN || (ct==PT_PSCN&&parts[r>>8].temp>373.0f))
goto conduct;
continue; continue;
else if (rt==PT_NTCT && !(ct==PT_NSCN || ct==PT_NTCT || (ct==PT_PSCN&&parts[r>>8].temp>373.0f))) case PT_PTCT:
if (ct==PT_NSCN || (ct==PT_PSCN&&parts[r>>8].temp<373.0f))
goto conduct;
continue; continue;
else if (rt==PT_PTCT && !(ct==PT_NSCN || ct==PT_PTCT || (ct==PT_PSCN&&parts[r>>8].temp<373.0f))) case PT_INWR:
if (ct==PT_NSCN || ct==PT_PSCN)
goto conduct;
continue; continue;
else if (rt==PT_INWR && !(ct==PT_NSCN || ct==PT_INWR || ct==PT_PSCN)) case PT_INST:
if (ct==PT_PSCN)
goto conduct;
continue; continue;
else if (rt==PT_INST && ct!=PT_PSCN) case PT_NBLE:
if (parts[r>>8].tmp != 1)
goto conduct;
continue; continue;
else if (rt==PT_NBLE && parts[r>>8].tmp == 1) case PT_PSCN:
if (ct!=PT_NSCN)
goto conduct;
continue; continue;
}
conduct: conduct:
if (rt==PT_WATR||rt==PT_SLTW) { if (rt==PT_WATR||rt==PT_SLTW) {
if (parts[r>>8].life==0 && parts[i].life<3) if (parts[r>>8].life==0 && parts[i].life<3)