diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp index a808c78d3..0b7493a5f 100644 --- a/src/simulation/Simulation.cpp +++ b/src/simulation/Simulation.cpp @@ -1365,14 +1365,6 @@ int Simulation::try_move(int i, int x, int y, int nx, int ny) return 0; } break; - // SOAP slowly floats up inside OIL - case PT_SOAP: - if (parts[i].type == PT_OIL) - { - if (rng.chance(19, 20) || std::abs(parts[i].x - nx) > 3 || std::abs(parts[i].y - ny) > 3) - return 0; - } - break; } switch (parts[i].type) diff --git a/src/simulation/SimulationData.cpp b/src/simulation/SimulationData.cpp index cff258fe9..b380d0cc4 100644 --- a/src/simulation/SimulationData.cpp +++ b/src/simulation/SimulationData.cpp @@ -233,8 +233,6 @@ void SimulationData::init_can_move() can_move[PT_THDR][PT_THDR] = 2; can_move[PT_EMBR][PT_EMBR] = 2; can_move[PT_TRON][PT_SWCH] = 3; - can_move[PT_SOAP][PT_OIL] = 0; - can_move[PT_OIL][PT_SOAP] = 1; } const CustomGOLData *SimulationData::GetCustomGOLByRule(int rule) const diff --git a/src/simulation/elements/SOAP.cpp b/src/simulation/elements/SOAP.cpp index 0cf43ff60..9e4f5371a 100644 --- a/src/simulation/elements/SOAP.cpp +++ b/src/simulation/elements/SOAP.cpp @@ -243,6 +243,27 @@ static int update(UPDATE_FUNC_ARGS) parts[i].ctype = 1; parts[i].life = 10; } + + //SOAP+OIL foam effect + for (auto rx=-2; rx<3; rx++) + for (auto ry=-2; ry<3; ry++) + if (rx || ry) + { + auto r = pmap[y+ry][x+rx]; + if (!r) + continue; + if (TYP(r) == PT_OIL) + { + float ax, ay, gx, gy; + + sim->GetGravityField(x, y, elements[PT_SOAP].Gravity, 1.0f, gx, gy); + + ax = ((parts[i].vx-gx)*0.5f + parts[ID(r)].vx)/2; + ay = ((parts[i].vy-gy)*0.5f + parts[ID(r)].vy)/2; + parts[i].vx = parts[ID(r)].vx = ax; + parts[i].vy = parts[ID(r)].vy = ay; + } + } } for (auto rx = -2; rx <= 2; rx++) {