diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index 9f2d7bd78..51921421d 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -2382,9 +2382,8 @@ void Simulation::init_can_move() can_move[movingType][PT_FIGH] = 0; //INVS behaviour varies with pressure can_move[movingType][PT_INVIS] = 3; - //stop CNCT and ROCK from being displaced by other particles + //stop CNCT from being displaced by other particles can_move[movingType][PT_CNCT] = 0; - can_move[movingType][PT_ROCK] = 0; //VOID and PVOD behaviour varies with powered state and ctype can_move[movingType][PT_PVOD] = 3; can_move[movingType][PT_VOID] = 3; diff --git a/src/simulation/elements/FIRE.cpp b/src/simulation/elements/FIRE.cpp index 8ff5fd6a3..77b2c9416 100644 --- a/src/simulation/elements/FIRE.cpp +++ b/src/simulation/elements/FIRE.cpp @@ -87,6 +87,56 @@ int Element_FIRE_update(UPDATE_FUNC_ARGS) } } break; + case PT_LAVA: + if (parts[i].ctype == PT_ROCK) + { + float pres = sim->pv[y / CELL][x / CELL]; + if (pres <= -9) + { + parts[i].ctype = PT_STNE; + break; + } + + if (pres >= 25 && RNG::Ref().chance(1, 12500)) + { + if (pres <= 50) + { + if (RNG::Ref().chance(1, 2)) + parts[i].ctype = PT_BRMT; + else + parts[i].ctype = PT_CNCT; + } + else if (pres <= 75) + { + if (pres >= 73 || RNG::Ref().chance(1, 8)) + parts[i].ctype = PT_GOLD; + else + parts[i].ctype = PT_QRTZ; + } + else if (pres <= 100 && parts[i].temp >= 5000) + { + if (RNG::Ref().chance(1, 5)) // 1 in 5 chance IRON to TTAN + parts[i].ctype = PT_TTAN; + else + parts[i].ctype = PT_IRON; + } + else if (pres <= 255 && parts[i].temp >= 5000 && RNG::Ref().chance(1, 5)) + { + if (RNG::Ref().chance(1, 5)) + parts[i].ctype = PT_URAN; + else if (RNG::Ref().chance(1, 5)) + parts[i].ctype = PT_PLUT; + else + parts[i].ctype = PT_TUNG; + } + } + } + else if (parts[i].ctype == PT_STNE && sim->pv[y / CELL][x / CELL] >= 2.0f) // Form ROCK with pressure + { + parts[i].tmp2 = RNG::Ref().between(0, 10); // Provide tmp2 for color noise + parts[i].ctype = PT_ROCK; + } + break; default: break; } @@ -194,64 +244,12 @@ int Element_FIRE_update(UPDATE_FUNC_ARGS) parts[ID(r)].ctype = PT_HEAC; } } - else if (parts[i].ctype == PT_ROCK) + else if (parts[i].ctype == PT_ROCK && rt == PT_LAVA && parts[ID(r)].ctype == PT_GOLD && parts[ID(r)].tmp == 0 && + sim->pv[y / CELL][x / CELL] >= 50 && RNG::Ref().chance(1, 10000)) // Produce GOLD veins/clusters { - float pres = sim->pv[y / CELL][x / CELL]; - if (pres <= -9) - { - parts[i].ctype = PT_STNE; - break; - } - - if (pres >= 25 && RNG::Ref().chance(1, 100000)) - { - if (pres <= 50) - { - if (RNG::Ref().chance(1, 2)) - parts[i].ctype = PT_BRMT; - else - parts[i].ctype = PT_CNCT; - break; - } - else if (pres <= 75) - { - if (pres >= 73 || RNG::Ref().chance(1, 8)) - parts[i].ctype = PT_GOLD; - else - parts[i].ctype = PT_QRTZ; - break; - } - else if (pres <= 100 && parts[i].temp >= 5000) - { - if (RNG::Ref().chance(1, 5)) // 1 in 5 chance IRON to TTAN - parts[i].ctype = PT_TTAN; - else - parts[i].ctype = PT_IRON; - break; - } - else if (pres <= 255 && parts[i].temp >= 5000 && RNG::Ref().chance(1, 5)) - { - if (RNG::Ref().chance(1, 5)) - parts[i].ctype = PT_URAN; - else if (RNG::Ref().chance(1, 5)) - parts[i].ctype = PT_PLUT; - else - parts[i].ctype = PT_TUNG; - break; - } - } - - if (parts[ID(r)].ctype == PT_GOLD && parts[ID(r)].tmp == 0 && pres >= 50 && RNG::Ref().chance(1, 10000)) // Produce GOLD veins/clusters - { - parts[i].ctype = PT_GOLD; - if (rx > 1 || rx < -1) // Trend veins vertical - parts[i].tmp = 1; - } - } - else if (parts[i].ctype == PT_STNE && sim->pv[y / CELL][x / CELL] >= 2.0f) // Form ROCK with pressure - { - parts[i].tmp2 = RNG::Ref().between(0, 10); // Provide tmp2 for color noise - parts[i].ctype = PT_ROCK; + parts[i].ctype = PT_GOLD; + if (rx > 1 || rx < -1) // Trend veins vertical + parts[i].tmp = 1; } } diff --git a/src/simulation/elements/ROCK.cpp b/src/simulation/elements/ROCK.cpp index d1cfdef42..e3c47b213 100644 --- a/src/simulation/elements/ROCK.cpp +++ b/src/simulation/elements/ROCK.cpp @@ -16,7 +16,7 @@ void Element::Element_ROCK() AirDrag = 0.00f * CFDS; AirLoss = 0.94f; Loss = 0.00f; - Collision = -0.0f; + Collision = 0.0f; Gravity = 0.0f; Diffusion = 0.00f; HotAir = 0.000f * CFDS; @@ -27,7 +27,7 @@ void Element::Element_ROCK() Meltable = 5; Hardness = 70; - Weight = 120; + Weight = 100; HeatConduct = 200; Description = "Rock. Solid material, CNCT can stack on top of it.";