diff options
Diffstat (limited to 'source/game/StarEntitySplash.cpp')
-rw-r--r-- | source/game/StarEntitySplash.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/source/game/StarEntitySplash.cpp b/source/game/StarEntitySplash.cpp new file mode 100644 index 0000000..6a5a5ab --- /dev/null +++ b/source/game/StarEntitySplash.cpp @@ -0,0 +1,50 @@ +#include "StarEntitySplash.hpp" +#include "StarWorld.hpp" +#include "StarLiquidsDatabase.hpp" +#include "StarRoot.hpp" +#include "StarJsonExtra.hpp" + +namespace Star { + +EntitySplashConfig::EntitySplashConfig() {} + +EntitySplashConfig::EntitySplashConfig(Json const& config) { + splashSpeedMin = config.get("splashSpeedMin").toFloat(); + splashMinWaterLevel = config.get("splashMinWaterLevel").toFloat(); + splashBottomSensor = jsonToVec2F(config.get("splashBottomSensor")); + splashTopSensor = jsonToVec2F(config.get("splashTopSensor")); + numSplashParticles = config.get("numSplashParticles").toInt(); + splashYVelocityFactor = config.get("splashYVelocityFactor").toFloat(); + splashParticle = Particle(config.get("splashParticle").toObject()); + splashParticleVariance = Particle(config.get("splashParticleVariance").toObject()); +} + +List<Particle> EntitySplashConfig::doSplash(Vec2F position, Vec2F velocity, World* world) const { + List<Particle> particles; + if (std::fabs(velocity[1]) >= splashSpeedMin) { + auto liquidDb = Root::singleton().liquidsDatabase(); + Vec2I bottom = Vec2I::floor(position + splashBottomSensor); + Vec2I top = Vec2I::floor(position + splashTopSensor); + if (world->liquidLevel(bottom).level - world->liquidLevel(top).level >= splashMinWaterLevel) { + LiquidId liquidType; + auto bottomLiquid = world->liquidLevel(bottom); + auto topLiquid = world->liquidLevel(top); + if (bottomLiquid.level > 0 && (int)bottomLiquid.liquid) + liquidType = bottomLiquid.liquid; + else + liquidType = topLiquid.liquid; + Color particleColor = Color::rgba(liquidDb->liquidSettings(liquidType)->liquidColor); + for (int i = 0; i < numSplashParticles; ++i) { + Particle newSplashParticle = splashParticle; + newSplashParticle.position = position; + newSplashParticle.velocity[1] = std::fabs(velocity[1]) * splashYVelocityFactor; + newSplashParticle.color = particleColor; + newSplashParticle.applyVariance(splashParticleVariance); + particles.append(newSplashParticle); + } + } + } + return particles; +} + +} |