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(!parts[i].tmp && parts[r>>8].tmp)
if(!parts[i].tmp)
{
if (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)
}
else if(!parts[r>>8].tmp)
{
parts[r>>8].tmp = parts[i].tmp;
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--;
}
}
else
{
if (!parts[r>>8].life)
else if (!parts[r>>8].life)
{
parts[r>>8].life = parts[i].life;
if((r>>8)>i) //If the other particle hasn't been life updated
parts[r>>8].life++;
}
}
}
else if((r&0xFF)==PT_NSCN && oldl==1)
{
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];
if(!r)
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;
}
return 0;

View File

@ -50,13 +50,8 @@ Element_ELEC::Element_ELEC()
int Element_ELEC::update(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)//move into movement code
{
sim->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) {
@ -110,6 +105,12 @@ int Element_ELEC::update(UPDATE_FUNC_ARGS)
parts[r>>8].tmp2 += 5;
parts[r>>8].life = 1000;
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:
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);
return 1;
}
continue;
break;
}
}
return 0;

View File

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

View File

@ -107,8 +107,7 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
parts[r>>8].life = 10;
}
}
}
if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && sim->elements[parts[i].ctype].Enabled && parts[i].life==10)
if (parts[i].ctype>0 && parts[i].ctype<PT_NUM && sim->elements[parts[i].ctype].Enabled)
{
if (parts[i].ctype==PT_PHOT) {//create photons a different way
for (rx=-1; rx<2; rx++)
@ -143,6 +142,8 @@ int Element_PBCN::update(UPDATE_FUNC_ARGS)
}
}
}
}
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);
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)) {
if (x+rx>=0 && y+ry>=0 && x+rx<XRES && y+ry<YRES) {
r = pmap[y+ry][x+rx];
if (!r)
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].vy *= 0.90;
@ -76,20 +78,8 @@ int Element_PHOT::update(UPDATE_FUNC_ARGS)
parts[r>>8].vy = rr*sinf(rrr);
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;
}
}
r = pmap[y][x];
if((r&0xFF) == PT_QRTZ)// && parts[i].ctype==0x3FFFFFFF)
else if((r&0xFF) == PT_QRTZ && !ry && !rx)//if on QRTZ
{
float a = (rand()%360)*3.14159f/180.0f;
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].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;
}

View File

@ -65,19 +65,26 @@ int Element_PQRT::update(UPDATE_FUNC_ARGS)
parts[i].ctype ++;
}
}
// grow if absorbed SLTW
// grow and diffuse
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;
ry = rand()%3-1;
rnd = rand()%0x3FF;
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))
{
r = pmap[y+ry][x+rx];
if (!r && parts[i].ctype!=0)
if (!stopgrow)//try to grow
{
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)
{
parts[np].tmp = parts[i].tmp;
@ -90,25 +97,15 @@ int Element_PQRT::update(UPDATE_FUNC_ARGS)
{
parts[i].ctype=-1;
}
break;
stopgrow=true;
}
}
}
}
}
// 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))
{
//diffusion
r = pmap[y+ry][x+rx];
if (!r)
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;
if (tmp ==1)

View File

@ -71,19 +71,26 @@ int Element_QRTZ::update(UPDATE_FUNC_ARGS)
parts[i].ctype ++;
}
}
// grow if absorbed SLTW
// grow and diffuse
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;
ry = rand()%3-1;
rnd = rand()%0x3FF;
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))
{
r = pmap[y+ry][x+rx];
if (!r && parts[i].ctype!=0)
if (!stopgrow)//try to grow
{
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)
{
parts[np].tmp = parts[i].tmp;
@ -96,26 +103,15 @@ int Element_QRTZ::update(UPDATE_FUNC_ARGS)
{
parts[i].ctype=-1;
}
break;
stopgrow=true;
}
}
}
}
}
// 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))
{
//diffusion
r = pmap[y+ry][x+rx];
if (!r)
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;
if (tmp ==1)

View File

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

View File

@ -210,10 +210,8 @@ int Element_SOAP::update(UPDATE_FUNC_ARGS)
if ((r&0xFF) == PT_OIL)
{
float ax, ay;
parts[i].vy = (parts[i].vy-0.1f)*0.5f;
parts[i].vx *= 0.5f;
ax = (parts[i].vx + parts[r>>8].vx)/2;
ay = (parts[i].vy + parts[r>>8].vy)/2;
ax = (parts[i].vx*0.5f + parts[r>>8].vx)/2;
ay = ((parts[i].vy-0.1f)*0.5f + parts[r>>8].vy)/2;
parts[i].vx = parts[r>>8].vx = ax;
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;
if (ct == PT_WATR)
parts[i].life = 64;
if (ct == PT_SLTW)
else if (ct == PT_SLTW)
parts[i].life = 54;
if (ct == PT_SWCH)
else if (ct == PT_SWCH)
parts[i].life = 14;
return 0;
}
if (ct==PT_SPRK)
switch(ct)
{
case PT_SPRK:
sim->kill_part(i);
return 1;
}
else if (ct==PT_NTCT || ct==PT_PTCT)
{
case PT_NTCT:
case PT_PTCT:
Element_NTCT::update(UPDATE_FUNC_SUBCALL_ARGS);
}
else if (ct==PT_ETRD)
{
break;
case PT_ETRD:
if (parts[i].life==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;
}
}
}
else if (ct==PT_NBLE)
{
break;
case PT_NBLE:
if (parts[i].life<=1&&parts[i].tmp!=1)
{
parts[i].life = rand()%150+50;
@ -107,9 +105,8 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
parts[i].temp = 3500;
sim->pv[y/CELL][x/CELL] += 1;
}
}
else if (ct==PT_TESC) // tesla coil code
{
break;
case PT_TESC:
if (parts[i].tmp>300)
parts[i].tmp=300;
for (rx=-1; rx<2; rx++)
@ -141,8 +138,8 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
}
}
}
}
else if (ct==PT_IRON) {
break;
case PT_IRON:
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))
@ -150,16 +147,18 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
r = pmap[y+ry][x+rx];
if (!r)
continue;
if (((r&0xFF) == PT_DSTW && 30>(rand()/(RAND_MAX/1000))) ||
((r&0xFF) == PT_SLTW && 30>(rand()/(RAND_MAX/1000))) ||
((r&0xFF) == PT_WATR && 30>(rand()/(RAND_MAX/1000))))
if ((r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || (r&0xFF)==PT_WATR)
{
if (rand()<RAND_MAX/3)
int rnd = rand()%100;
if (!rnd)
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);
}
}
break;
default:
break;
}
for (rx=-2; rx<3; rx++)
for (ry=-2; ry<3; ry++)
@ -172,69 +171,134 @@ int Element_SPRK::update(UPDATE_FUNC_ARGS)
conduct_sprk = 1;
// 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);
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;
}
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);
parts[r>>8].ctype = PT_NONE;
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;
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;
else if (ct==PT_NSCN && parts[r>>8].tmp == 3) parts[r>>8].tmp = 1;
}
if (rt == PT_PPIP && parts[i].life == 3 && pavg!=PT_INSL)
continue;
case PT_PPIP:
if (parts[i].life == 3 && pavg!=PT_INSL)
{
if (ct == PT_NSCN || ct == PT_PSCN || ct == PT_INST)
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;
if (rt==PT_NTCT||rt==PT_PTCT)
continue;
}
break;
}
//the crazy conduct checks
if (pavg == PT_INSL) 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)
continue;
//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)))
if (rt==ct && rt!=PT_INST) goto conduct;
switch (ct)
{
case PT_INST:
if (rt==PT_NSCN)
goto conduct;
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;
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;
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;
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;
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;
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;
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;
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;
else if (rt==PT_INWR && !(ct==PT_NSCN || ct==PT_INWR || ct==PT_PSCN))
case PT_INST:
if (ct==PT_PSCN)
goto conduct;
continue;
else if (rt==PT_INST && ct!=PT_PSCN)
case PT_NBLE:
if (parts[r>>8].tmp != 1)
goto conduct;
continue;
else if (rt==PT_NBLE && parts[r>>8].tmp == 1)
case PT_PSCN:
if (ct!=PT_NSCN)
goto conduct;
continue;
}
conduct:
if (rt==PT_WATR||rt==PT_SLTW) {
if (parts[r>>8].life==0 && parts[i].life<3)