From b661418d7ecd44960f0e24eb7abd79cfc5eb5f0e Mon Sep 17 00:00:00 2001 From: jacksonmj Date: Fri, 7 Jan 2011 14:47:10 +0000 Subject: [PATCH] Replace pstates and some pressure ifs with array. --- includes/powder.h | 180 +++++++++++++++++++++++++++++++++++- src/powder.c | 226 ++++++++++++++++++++++------------------------ 2 files changed, 285 insertions(+), 121 deletions(-) diff --git a/includes/powder.h b/includes/powder.h index 650487639..dec45994f 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -284,8 +284,22 @@ struct part_state int burn; float btemp; }; - typedef struct part_state part_state; + +struct part_transition +{ + float plv; // transition occurs if pv is lower than this + int plt; + float phv; // transition occurs if pv is higher than this + int pht; + float tlv; // transition occurs if t is lower than this + int tlt; + float thv; // transition occurs if t is higher than this + int tht; +}; +typedef struct part_transition part_transition; + + //Should probably be const. /* Weight Help * 1 = Gas || @@ -586,6 +600,170 @@ static part_state pstates[PT_NUM] = /* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, /* GOL */ {ST_NONE, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f, PT_NONE, 0.0f}, }; + +// temporarily define abbreviations for impossible p/t values +#define IPL -257.0f +#define IPH 257.0f +#define ITL MIN_TEMP-1 +#define ITH MAX_TEMP+1 +// no transition (PT_NONE means kill part) +#define NT -1 +// special transition - lava ctypes etc need extra code +// TODO: use update_ELEM functions for special transitions, only use this table for the simple ones +#define ST PT_NUM +static part_transition ptransitions[PT_NUM] = +{ + // Name plv plt phv pht tlv tlt thv tht + /* NONE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* DUST */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WATR */ {IPL, NT, IPH, NT, 273.15f,PT_ICEI, 373.0f, PT_WTRV}, + /* OIL */ {IPL, NT, IPH, NT, ITL, NT, 333.0f, PT_GAS}, + /* FIRE */ {IPL, NT, IPH, NT, ITL, NT, 2773.0f,PT_PLSM}, + /* STNE */ {IPL, NT, IPH, NT, ITL, NT, 983.0f, PT_LAVA}, + /* LAVA */ {IPL, NT, IPH, NT, 2573.15f,ST, ITH, NT}, // 2573.15f is highest melt pt of possible ctypes + /* GUN */ {IPL, NT, IPH, NT, ITL, NT, 673.0f, PT_FIRE}, + /* NITR */ {IPL, NT, IPH, NT, ITL, NT, 673.0f, PT_FIRE}, + /* CLNE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GAS */ {-6.0f, PT_OIL, 6.0f, PT_OIL, ITL, NT, 573.0f, PT_FIRE}, + /* C-4 */ {IPL, NT, IPH, NT, ITL, NT, 673.0f, PT_FIRE}, + /* GOO */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* ICE */ {IPL, NT, 0.8f, PT_SNOW, ITL, NT, 233.0f, ST}, + /* METL */ {IPL, NT, IPH, NT, ITL, NT, 1273.0f,PT_LAVA}, + /* SPRK */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SNOW */ {IPL, NT, IPH, NT, ITL, NT, 273.0f, PT_WATR}, + /* WOOD */ {IPL, NT, IPH, NT, ITL, NT, 873.0f, PT_FIRE}, + /* NEUT */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PLUT */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PLNT */ {IPL, NT, IPH, NT, ITL, NT, 573.0f, PT_FIRE}, + /* ACID */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* VOID */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WTRV */ {IPL, NT, IPH, NT, 371.0f, ST, ITH, NT}, + /* CNCT */ {IPL, NT, IPH, NT, ITL, NT, 1123.0f,PT_LAVA}, + /* DSTW */ {IPL, NT, IPH, NT, 273.15f,PT_ICEI, 373.0f, PT_WTRV}, + /* SALT */ {IPL, NT, IPH, NT, ITL, NT, 1173.0f,PT_LAVA}, + /* SLTW */ {IPL, NT, IPH, NT, 233.0f, PT_ICEI, 483.0f, ST}, + /* DMND */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BMTL */ {IPL, NT, 1.0f, ST, ITL, NT, 1273.0f,PT_LAVA}, + /* BRMT */ {IPL, NT, IPH, NT, ITL, NT, 1273.0f,PT_LAVA}, + /* PHOT */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* URAN */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WAX */ {IPL, NT, IPH, NT, ITL, NT, 319.0f, PT_MWAX}, + /* MWAX */ {IPL, NT, IPH, NT, 318.0f, PT_WAX, 673.0f, PT_FIRE}, + /* PSCN */ {IPL, NT, IPH, NT, ITL, NT, 1687.0f,PT_LAVA}, + /* NSCN */ {IPL, NT, IPH, NT, ITL, NT, 1687.0f,PT_LAVA}, + /* LNTG */ {IPL, NT, IPH, NT, 63.0f, PT_NICE, 77.0f, PT_NONE}, + /* INSL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BHOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WHOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* RBDM */ {IPL, NT, IPH, NT, ITL, NT, 312.0f, PT_LRBD},//, 961.0f, PT_FIRE}, + /* LRBD */ {IPL, NT, IPH, NT, 311.0f, PT_RBDM, 961.0f, PT_FIRE}, + /* NTCT */ {IPL, NT, IPH, NT, ITL, NT, 1687.0f,PT_LAVA}, + /* SAND */ {IPL, NT, IPH, NT, ITL, NT, 1973.0f,PT_LAVA}, + /* GLAS */ {IPL, NT, IPH, NT, ITL, NT, 1973.0f,PT_LAVA}, + /* PTCT */ {IPL, NT, IPH, NT, ITL, NT, 1414.0f,PT_LAVA}, + /* BGLA */ {IPL, NT, IPH, NT, ITL, NT, 1973.0f,PT_LAVA}, + /* THDR */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PLSM */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* ETRD */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* NICE */ {IPL, NT, IPH, NT, ITL, NT, 63.1f, PT_LNTG}, + /* NBLE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BTRY */ {IPL, NT, IPH, NT, ITL, NT, 2273.0f,PT_PLSM}, + /* LCRY */ {IPL, NT, IPH, NT, ITL, NT, 1273.0f,PT_BGLA}, + /* STKM */ {IPL, NT, IPH, NT, ITL, NT, 620.0f, PT_FIRE}, + /* SWCH */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SMKE */ {IPL, NT, IPH, NT, ITL, NT, 625.0f, PT_FIRE}, + /* DESL */ {IPL, NT, 5.0f, PT_FIRE, ITL, NT, 335.0f, PT_FIRE}, + /* COAL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* LO2 */ {IPL, NT, IPH, NT, ITL, NT, 90.1f, PT_O2}, + /* O2 */ {IPL, NT, IPH, NT, 90.0f, PT_LO2, ITH, NT}, + /* INWR */ {IPL, NT, IPH, NT, ITL, NT, 1687.0f,PT_LAVA}, + /* YEST */ {IPL, NT, IPH, NT, ITL, NT, 373.0f, PT_DYST}, + /* DYST */ {IPL, NT, IPH, NT, ITL, NT, 473.0f, PT_DUST}, + /* THRM */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GLOW */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BRCK */ {IPL, NT, 8.8f, PT_STNE, ITL, NT, 1223.0f,PT_LAVA}, + /* HFLM */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* FIRW */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* FUSE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* FSEP */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* AMtr */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BCOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PCLN */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* HSWC */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* IRON */ {IPL, NT, IPH, NT, ITL, NT, 1687.0f,PT_LAVA}, + /* MORT */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SPNG */ {IPL, NT, IPH, NT, ITL, NT, 2730.0f,PT_FIRE}, + /* RIME */ {IPL, NT, IPH, NT, ITL, NT, 273.15f,PT_WATR}, + /* FOG */ {IPL, NT, IPH, NT, ITL, NT, 373.15f,PT_WTRV}, + /* BCLN */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* LOVE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WTF */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WARP */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PUMP */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* FWRK */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PIPE */ {IPL, NT, 10.0f, PT_BRMT, ITL, NT, ITH, NT}, + /* FRZZ */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* FRZW */ {IPL, NT, IPH, NT, ITL, NT, 53.0f, PT_ICEI}, + /* GRAV */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BIZR */ {IPL, NT, IPH, NT, 100.0f, PT_BIZRG, 400.0f, PT_BIZRS}, + /* BIZRG*/ {IPL, NT, IPH, NT, ITL, NT, 100.0f, PT_BIZR},//, 400.0f, PT_BIZRS}, + /* BIZRS*/ {IPL, NT, IPH, NT, 400.0f, PT_BIZR, ITH, NT},// 100.0f, PT_BIZRG}, + /* INST */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* ISOZ */ {IPL, NT, IPH, NT, 160.0f, PT_ISZS, ITH, NT}, + /* ISZS */ {IPL, NT, IPH, NT, ITL, NT, 300.0f, PT_ISOZ}, + /* PRTI */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PRTO */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* PSTE */ {IPL, NT, 0.5f, PT_PSTS, ITL, NT, 747.0f, PT_BRCK}, + /* PSTS */ {0.5f, PT_PSTE, IPH, NT, ITL, NT, ITH, NT}, + /* ANAR */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* VINE */ {IPL, NT, IPH, NT, ITL, NT, 573.0f, PT_FIRE}, + /* INVS */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* EQVE */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SPWN2*/ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SPAWN*/ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SHLD1*/ {IPL, NT, 7.0f, PT_NONE, ITL, NT, ITH, NT}, + /* SHLD2*/ {IPL, NT, 15.0f, PT_NONE, ITL, NT, ITH, NT}, + /* SHLD3*/ {IPL, NT, 25.0f, PT_NONE, ITL, NT, ITH, NT}, + /* SHLD4*/ {IPL, NT, 40.0f, PT_NONE, ITL, NT, ITH, NT}, + /* LOlZ */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* WIFI */ {IPL, NT, 15.0f, PT_BRMT, ITL, NT, ITH, NT}, + /* FILT */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* ARAY */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* BRAY */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* STKM2*/ {IPL, NT, IPH, NT, ITL, NT, 620.0f, PT_FIRE}, + /* BOMB */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* C-5 */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* SING */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* QRTZ */ {IPL, NT, IPH, NT, ITL, NT, 2573.15f,PT_LAVA}, + /* PQRT */ {IPL, NT, IPH, NT, ITL, NT, 2573.15f,PT_LAVA}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, + /* GOL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, +}; +#undef IPL +#undef IPH +#undef ITL +#undef ITH +#undef NT +#undef ST + + static int grule[NGOL][9] = { // 0,1,2,3,4,5,6,7,8 live=1 spawn=2 spawn&live=3 diff --git a/src/powder.c b/src/powder.c index 282cb3a9e..8bd89d5e6 100644 --- a/src/powder.c +++ b/src/powder.c @@ -1610,39 +1610,35 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].life = rand()%50+120; } } - if (t==PT_GAS && pv[y/CELL][x/CELL]<-6.0f) - t = parts[i].type = PT_OIL; - if (t==PT_DESL && pv[y/CELL][x/CELL]>5.0f) - { // Only way I know to make it - t = parts[i].type = PT_FIRE; // combust under pressure. - parts[i].life = rand()%50+120; + + s = 1; + if (pv[y/CELL][x/CELL]>ptransitions[t].phv&&ptransitions[t].pht>-1) { + if (ptransitions[t].pht!=PT_NUM) + t = ptransitions[t].pht; + else if (t==PT_BMTL) { + if (pv[y/CELL][x/CELL]>2.5f) + t = PT_BRMT; + else if (pv[y/CELL][x/CELL]>1.0f && parts[i].tmp==1) + t = PT_BRMT; + else s = 0; + } + else s = 0; + } else if (pv[y/CELL][x/CELL]-1) { + if (ptransitions[t].plt!=PT_NUM) + t = ptransitions[t].plt; + else s = 0; } - if (t==PT_GAS && pv[y/CELL][x/CELL]>6.0f) - t = parts[i].type = PT_OIL; - if (t==PT_BMTL && pv[y/CELL][x/CELL]>2.5f) - t = parts[i].type = PT_BRMT; - if (t==PT_BMTL && pv[y/CELL][x/CELL]>1.0f && parts[i].tmp==1) - t = parts[i].type = PT_BRMT; - if (t==PT_BRCK && pv[y/CELL][x/CELL]>8.8f) - t = parts[i].type = PT_STNE; - if (t==PT_PIPE && pv[y/CELL][x/CELL]>10.0f) - t = parts[i].type = PT_BRMT; - if (t==PT_PSTE && pv[y/CELL][x/CELL]>0.5f) - t = parts[i].type = PT_PSTS; - if (t==PT_PSTS && pv[y/CELL][x/CELL]<0.5f) - t = parts[i].type = PT_PSTE; - if (t==PT_SHLD1 && pv[y/CELL][x/CELL]>7.0f) - t = parts[i].type = PT_NONE; - if (t==PT_SHLD2 && pv[y/CELL][x/CELL]>15.0f) - t = parts[i].type = PT_NONE; - if (t==PT_SHLD3 && pv[y/CELL][x/CELL]>25.0f) - t = parts[i].type = PT_NONE; - if (t==PT_SHLD4 && pv[y/CELL][x/CELL]>40.0f) - t = parts[i].type = PT_NONE; - if (t==PT_WIFI && pv[y/CELL][x/CELL]>15.0f) - t = parts[i].type = PT_BRMT; - //if(t==PT_GLAS && pv[y/CELL][x/CELL]>4.0f) - // t = parts[i].type = PT_BGLA; + else s = 0; + if (s) { + parts[i].type = t; + if (t==PT_FIRE) + parts[i].life = rand()%50+120; + if (t==PT_NONE) { + kill_part(i); + goto killed; + } + } + if (t==PT_GLAS) { parts[i].pavg[0] = parts[i].pavg[1]; @@ -1701,7 +1697,7 @@ void update_particles_i(pixel *vid, int start, int inc) h_count = 0; if (t==PT_ICEI && !parts[i].ctype) parts[i].ctype = PT_WATR; - if (ptypes[t].hconduct>(rand()%250)&&!(parts[i].type==PT_HSWC&&parts[i].life!=10)) + if (ptypes[t].hconduct>(rand()%250)&&(t!=PT_HSWC||parts[i].life==10)) { for (nx=-1; nx<2; nx++) { @@ -1712,7 +1708,10 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if ((r>>8)>=NPART || !r) continue; - if (parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)&&!(parts[r>>8].type==PT_BRAY&&parts[i].type==PT_FILT)&&!(parts[i].type==PT_BRAY&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_PHOT&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_BIZR&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_BIZRG&&parts[r>>8].type==PT_FILT)&&!(parts[r>>8].type==PT_BIZR&&parts[i].type==PT_FILT)&&!(parts[r>>8].type==PT_BIZRG&&parts[i].type==PT_FILT)) + rt = parts[r>>8].type; + if (rt!=PT_NONE&&t!=PT_NONE&&ptypes[rt].hconduct&&(rt!=PT_HSWC||parts[r>>8].life==10) + &&(t!=PT_FILT||(rt!=PT_BRAY&&rt!=PT_BIZR&&rt!=PT_BIZRG)) + &&(rt!=PT_FILT||(t!=PT_BRAY&&t!=PT_PHOT&&t!=PT_BIZR&&t!=PT_BIZRG))) { h_count++; c_heat += parts[r>>8].temp; @@ -1730,96 +1729,88 @@ void update_particles_i(pixel *vid, int start, int inc) r = pmap[y+ny][x+nx]; if ((r>>8)>=NPART || !r) continue; - if (parts[r>>8].type!=PT_NONE&&parts[i].type!=PT_NONE&&ptypes[parts[r>>8].type].hconduct>0&&!(parts[r>>8].type==PT_HSWC&&parts[r>>8].life!=10)&&!(parts[r>>8].type==PT_BRAY&&parts[i].type==PT_FILT)&&!(parts[i].type==PT_BRAY&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_PHOT&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_BIZR&&parts[r>>8].type==PT_FILT)&&!(parts[i].type==PT_BIZRG&&parts[r>>8].type==PT_FILT)&&!(parts[r>>8].type==PT_BIZR&&parts[i].type==PT_FILT)&&!(parts[r>>8].type==PT_BIZRG&&parts[i].type==PT_FILT)) + rt = parts[r>>8].type; + if (rt!=PT_NONE&&t!=PT_NONE&&ptypes[rt].hconduct&&(rt!=PT_HSWC||parts[r>>8].life==10) + &&(t!=PT_FILT||(rt!=PT_BRAY&&rt!=PT_BIZR&&rt!=PT_BIZRG)) + &&(rt!=PT_FILT||(t!=PT_BRAY&&t!=PT_PHOT&&t!=PT_BIZR&&t!=PT_BIZRG))) { parts[r>>8].temp = parts[i].temp; } } } } - if (pt>=pstates[t].btemp&&pstates[t].burn) - { - t = parts[i].type = pstates[t].burn; - if (t==PT_FIRE||t==PT_PLSM) - parts[i].life = rand()%50+120; - } - else if ((pt<=pstates[t].stemp||(t==PT_LAVA&&(pt<=pstates[parts[i].ctype].ltemp)))&&pstates[t].solid) - { - if (t==PT_LAVA&&parts[i].ctype) - { - parts[i].life = 0; - if (parts[i].ctype==PT_THRM) - { - parts[i].tmp = 0; - parts[i].ctype = PT_BMTL; - } - if (parts[i].ctype==PT_PLUT) - { - parts[i].tmp = 0; - parts[i].ctype = PT_LAVA; - } - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else if (pstates[t].solid==PT_ICEI&&pt<=pstates[t].stemp) - { - parts[i].ctype = parts[i].type; - t = parts[i].type = PT_ICEI; - } - else - { - parts[i].life = 0; - t = parts[i].type = pstates[t].solid; - } - } - else if ((pt>=pstates[t].ltemp&&(pt<=pstates[t].gtemp||!pstates[t].gas)&&pstates[t].state==ST_SOLID&&pstates[t].liquid)||(t==PT_ICEI&&pt>pstates[parts[i].ctype].stemp)) - { - if (pstates[t].liquid==PT_LAVA) - { - parts[i].life = rand()%120+240; - parts[i].ctype = (parts[i].type==PT_BRMT)?PT_BMTL:parts[i].type; - parts[i].ctype = (parts[i].ctype==PT_SAND)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_BGLA)?PT_GLAS:parts[i].ctype; - parts[i].ctype = (parts[i].ctype==PT_PQRT)?PT_QRTZ:parts[i].ctype; - t = parts[i].type = pstates[t].liquid; - } - else if (t==PT_ICEI&&parts[i].ctype) - { - t = parts[i].type = parts[i].ctype; - parts[i].ctype = PT_NONE; - } - else - { - t = parts[i].type = pstates[t].liquid; - } - } - else if (pt-ctemp<=pstates[t].ltemp&&pstates[t].liquid&&pstates[t].state==ST_GAS) - { - t = parts[i].type = pstates[t].liquid; - } - else if (pt-ctemp>=pstates[t].gtemp&&(pstates[t].gas||parts[i].type==PT_LNTG)&&(pstates[t].state==ST_LIQUID||pstates[t].state==ST_SOLID)) - { - if (t==PT_SLTW&&1>rand()%6) - { - t = parts[i].type = PT_SALT; - } - else - { - if ((t==PT_BIZR||t==PT_BIZRG||t==PT_BIZRS)&&pt>=pstates[t].gtemp) - { - t = parts[i].type = pstates[t].gas; - } - else { - t = parts[i].type = pstates[t].gas; - pv[y/CELL][x/CELL] += 0.50f; - } - if (t==PT_FIRE) - parts[i].life = rand()%50+120; - if (t==PT_HFLM) - parts[i].life = rand()%50+120; + + s = 1; + if (pt>ptransitions[t].thv&&ptransitions[t].tht>-1) { + if (ptransitions[t].tht!=PT_NUM) + t = ptransitions[t].tht; + else if (t==PT_ICEI) { + if (parts[i].ctype&&parts[i].ctype!=PT_ICEI) { + if (ptransitions[parts[i].ctype].tlt==PT_ICEI&&pt<=ptransitions[parts[i].ctype].tlv) s = 0; + else { + t = parts[i].ctype; + parts[i].ctype = PT_NONE; + parts[i].life = 0; + } + } + else if (pt>274.0f) t = PT_WATR; + else s = 0; + } + else if (t==PT_SLTW) { + if (1>rand()%6) t = PT_SALT; + else t = PT_WTRV; + } + else s = 0; + } else if (pt-1) { + if (ptransitions[t].tlt!=PT_NUM) + t = ptransitions[t].tlt; + else if (t==PT_WTRV) { + if (pt<273.0f) t = PT_RIME; + else t = PT_DSTW; + } + else if (t==PT_LAVA) { + if (parts[i].ctype&&parts[i].ctype!=PT_LAVA) { + if (ptransitions[parts[i].ctype].tht==PT_LAVA&&pt>=ptransitions[parts[i].ctype].thv) s = 0; + else if (parts[i].ctype==PT_THRM&&pt>=ptransitions[PT_BMTL].thv) s = 0; + else { + t = parts[i].ctype; + parts[i].ctype = PT_NONE; + if (t==PT_THRM) { + parts[i].tmp = 0; + t = PT_BMTL; + } + } + } + else if (pt<973.0f) t = PT_STNE; + else s = 0; + } + else s = 0; + if (s) parts[i].life = 0; + } + else s = 0; + if (s) { + if (t==PT_ICEI||t==PT_LAVA) + parts[i].ctype = parts[i].type; + if (pstates[t].state==ST_GAS&&pstates[parts[i].type].state!=ST_GAS) + pv[y/CELL][x/CELL] += 0.50f; + parts[i].type = t; + if (t==PT_FIRE||t==PT_PLSM||t==PT_HFLM) + parts[i].life = rand()%50+120; + if (t==PT_LAVA) { + if (parts[i].ctype==PT_BRMT) parts[i].ctype = PT_BMTL; + else if (parts[i].ctype==PT_SAND) parts[i].ctype = PT_GLAS; + else if (parts[i].ctype==PT_BGLA) parts[i].ctype = PT_GLAS; + else if (parts[i].ctype==PT_PQRT) parts[i].ctype = PT_QRTZ; + parts[i].life = rand()%120+240; + } + if (t==PT_NONE) { + kill_part(i); + goto killed; } } + + if (t==PT_URAN && pv[y/CELL][x/CELL]>0.0f) { float atemp = parts[i].temp + (-MIN_TEMP); @@ -1833,11 +1824,6 @@ void update_particles_i(pixel *vid, int start, int inc) parts[i].tmp--; parts[i].temp = 3500; } - if (parts[i].ctype==PT_PLUT&&parts[i].tmp>0) - { - parts[i].tmp--; - parts[i].temp = MAX_TEMP; - } } pt = parts[i].temp = restrict_flt(parts[i].temp, MIN_TEMP, MAX_TEMP); }