diff --git a/includes/powder.h b/includes/powder.h index 66a606d29..55dbd4115 100644 --- a/includes/powder.h +++ b/includes/powder.h @@ -491,6 +491,7 @@ typedef struct part_transition part_transition; // TODO: falldown, properties, state - should at least one of these be removed? extern part_type ptypes[PT_NUM]; +extern unsigned int platent[PT_NUM]; // temporarily define abbreviations for impossible p/t values #define IPL -257.0f diff --git a/src/elementdata.c b/src/elementdata.c index 308b2cde0..08306f7c9 100644 --- a/src/elementdata.c +++ b/src/elementdata.c @@ -352,6 +352,173 @@ part_transition ptransitions[PT_NUM] = /* FRAY */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, /* REPL */ {IPL, NT, IPH, NT, ITL, NT, ITH, NT}, }; + +// This is an enthalpy values table, converted into TPT imaginary units +// table value is - 750/226*enthalpy value of the material +unsigned int platent[PT_NUM] = +{ + /* NONE */ 0, + /* DUST */ 0, + /* WATR */ 7500, + /* OIL */ 0, + /* FIRE */ 0, + /* STNE */ 0, + /* LAVA */ 0, + /* GUN */ 0, + /* NITR */ 0, + /* CLNE */ 0, + /* GAS */ 0, + /* C-4 */ 0, + /* GOO */ 0, + /* ICE */ 1095, + /* METL */ 919, + /* SPRK */ 0, + /* SNOW */ 1095, + /* WOOD */ 0, + /* NEUT */ 0, + /* PLUT */ 0, + /* PLNT */ 0, + /* ACID */ 0, + /* VOID */ 0, + /* WTRV */ 0, + /* CNCT */ 0, + /* DSTW */ 7500, + /* SALT */ 0, + /* SLTW */ 7500, + /* DMND */ 0, + /* BMTL */ 0, + /* BRMT */ 0, + /* PHOT */ 0, + /* URAN */ 0, + /* WAX */ 0, + /* MWAX */ 0, + /* PSCN */ 0, + /* NSCN */ 0, + /* LN2 */ 0, + /* INSL */ 0, + /* VACU */ 0, + /* VENT */ 0, + /* RBDM */ 0, + /* LRBD */ 0, + /* NTCT */ 0, + /* SAND */ 0, + /* GLAS */ 0, + /* PTCT */ 0, + /* BGLA */ 0, + /* THDR */ 0, + /* PLSM */ 0, + /* ETRD */ 0, + /* NICE */ 0, + /* NBLE */ 0, + /* BTRY */ 0, + /* LCRY */ 0, + /* STKM */ 0, + /* SWCH */ 0, + /* SMKE */ 0, + /* DESL */ 0, + /* COAL */ 0, + /* LO2 */ 0, + /* O2 */ 0, + /* INWR */ 0, + /* YEST */ 0, + /* DYST */ 0, + /* THRM */ 0, + /* GLOW */ 0, + /* BRCK */ 0, + /* CFLM */ 0, + /* FIRW */ 0, + /* FUSE */ 0, + /* FSEP */ 0, + /* AMTR */ 0, + /* BCOL */ 0, + /* PCLN */ 0, + /* HSWC */ 0, + /* IRON */ 0, + /* MORT */ 0, + /* LIFE */ 0, + /* DLAY */ 0, + /* CO2 */ 0, + /* DRIC */ 0, + /* CBNW */ 7500, + /* STOR */ 0, + /* STOR */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* SPNG */ 0, + /* RIME */ 0, + /* FOG */ 0, + /* BCLN */ 0, + /* LOVE */ 0, + /* DEUT */ 0, + /* WARP */ 0, + /* PUMP */ 0, + /* FWRK */ 0, + /* PIPE */ 0, + /* FRZZ */ 0, + /* FRZW */ 0, + /* GRAV */ 0, + /* BIZR */ 0, + /* BIZRG*/ 0, + /* BIZRS*/ 0, + /* INST */ 0, + /* ISOZ */ 0, + /* ISZS */ 0, + /* PRTI */ 0, + /* PRTO */ 0, + /* PSTE */ 0, + /* PSTS */ 0, + /* ANAR */ 0, + /* VINE */ 0, + /* INVS */ 0, + /* EQVE */ 0, + /* SPWN2*/ 0, + /* SPAWN*/ 0, + /* SHLD1*/ 0, + /* SHLD2*/ 0, + /* SHLD3*/ 0, + /* SHLD4*/ 0, + /* LOlZ */ 0, + /* WIFI */ 0, + /* FILT */ 0, + /* ARAY */ 0, + /* BRAY */ 0, + /* STKM2*/ 0, + /* BOMB */ 0, + /* C-5 */ 0, + /* SING */ 0, + /* QRTZ */ 0, + /* PQRT */ 0, + /* EMP */ 0, + /* BREL */ 0, + /* ELEC */ 0, + /* ACEL */ 0, + /* DCEL */ 0, + /* TNT */ 0, + /* IGNP */ 0, + /* BOYL */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* FREE */ 0, + /* WIND */ 0, + /* H2 */ 0, + /* SOAP */ 0, + /* NBHL */ 0, + /* NWHL */ 0, + /* MERC */ 0, + /* PBCN */ 0, + /* GPMP */ 0, + /* CLST */ 0, + /* WIRE */ 0, + /* GBMB */ 0, + /* FIGH */ 0, + /* FRAY */ 0, + /* REPL */ 0, +}; #undef IPL #undef IPH #undef ITL diff --git a/src/powder.c b/src/powder.c index 67a16f8ef..187a0d93a 100644 --- a/src/powder.c +++ b/src/powder.c @@ -1904,15 +1904,18 @@ void update_particles_i(pixel *vid, int start, int inc) pt = (c_heat+parts[i].temp*96.645)/(c_Cm+96.645); else pt = (c_heat+parts[i].temp*96.645/ptypes[t].hconduct*fabs(ptypes[t].weight))/(c_Cm+96.645/ptypes[t].hconduct*fabs(ptypes[t].weight)); - + + c_heat += parts[i].temp*96.645/ptypes[t].hconduct*fabs(ptypes[t].weight); + c_Cm += 96.645/ptypes[t].hconduct*fabs(ptypes[t].weight); + parts[i].temp = restrict_flt(pt, MIN_TEMP, MAX_TEMP); #else pt = (c_heat+parts[i].temp)/(h_count+1); -#endif pt = parts[i].temp = restrict_flt(pt, MIN_TEMP, MAX_TEMP); for (j=0; j<8; j++) { parts[surround_hconduct[j]].temp = pt; } +#endif ctemph = ctempl = pt; // change boiling point with pressure @@ -1925,29 +1928,93 @@ void update_particles_i(pixel *vid, int start, int inc) s = 1; if (ctemph>ptransitions[t].thv&&ptransitions[t].tht>-1) { // particle type change due to high temperature +#ifdef REALISTIC + float dbt = ctempl - pt; + if (ptransitions[t].tht!=PT_NUM) + { + if (platent[t] <= (c_heat - (ptransitions[t].thv - dbt)*c_Cm)) + { + pt = (c_heat - platent[t])/c_Cm; + t = ptransitions[t].tht; + } + else + { + parts[i].temp = restrict_flt(ptransitions[t].thv - dbt, MIN_TEMP, MAX_TEMP); + s = 0; + } + } +#else if (ptransitions[t].tht!=PT_NUM) t = ptransitions[t].tht; +#endif else if (t==PT_ICEI) { - if (parts[i].ctype>0&&parts[i].ctype274.0f) t = PT_WATR; else s = 0; } else if (t==PT_SLTW) { +#ifdef REALISTIC + if (platent[t] <= (c_heat - (ptransitions[t].thv - dbt)*c_Cm)) + { + pt = (c_heat - platent[t])/c_Cm; + + if (1>rand()%6) t = PT_SALT; + else t = PT_WTRV; + } + else + { + parts[i].temp = restrict_flt(ptransitions[t].thv - dbt, MIN_TEMP, MAX_TEMP); + s = 0; + } +#else if (1>rand()%6) t = PT_SALT; else t = PT_WTRV; +#endif } else s = 0; } else if (ctempl-1) { // particle type change due to low temperature +#ifdef REALISTIC + float dbt = ctempl - pt; + if (ptransitions[t].tlt!=PT_NUM) + { + if (platent[ptransitions[t].tlt] >= (c_heat - (ptransitions[t].tlv - dbt)*c_Cm)) + { + pt = (c_heat + platent[ptransitions[t].tlt])/c_Cm; + t = ptransitions[t].tlt; + } + else + { + parts[i].temp = restrict_flt(ptransitions[t].tlv - dbt, MIN_TEMP, MAX_TEMP); + s = 0; + } + } +#else if (ptransitions[t].tlt!=PT_NUM) t = ptransitions[t].tlt; +#endif else if (t==PT_WTRV) { if (pt<273.0f) t = PT_RIME; else t = PT_DSTW; @@ -1979,6 +2046,13 @@ void update_particles_i(pixel *vid, int start, int inc) else s = 0; } else s = 0; +#ifdef REALISTIC + pt = restrict_flt(pt, MIN_TEMP, MAX_TEMP); + for (j=0; j<8; j++) + { + parts[surround_hconduct[j]].temp = pt; + } +#endif if (s) { // particle type change occurred if (t==PT_ICEI||t==PT_LAVA) parts[i].ctype = parts[i].type;