diff --git a/modules/particle.otpa b/modules/particle.otpa index 31380474..9c537642 100644 --- a/modules/particle.otpa +++ b/modules/particle.otpa @@ -1,11 +1,17 @@ ParticleSystem + AttractionAffector + position: 320 180 + acceleration: 500 + repelish: true + delay: 0.5 + // Fire Emitter position: 295 180 duration: 0.5 burstRate: 0.0166 - burstCount: 6 + burstCount: 3 delay: 0 particle-min-duration: 0.3 @@ -15,24 +21,25 @@ ParticleSystem particle-min-velocity: 200 particle-max-velocity: 240 - particle-min-velocity-angle: -5 - particle-max-velocity-angle: 10 + particle-min-velocity-angle: -10 + particle-max-velocity-angle: 10 particle-acceleration: 0 - particle-start-size: 8 8 + particle-start-size: 16 16 particle-final-size: 64 64 - particle-colors: #ff8c00ff #e6660080 #1e1e1e00 + particle-colors: #ffcc0050 #ffff0025 #ff000000 particle-colors-stops: 0 0.15 0.3 + particle-composition-mode: addition particle-texture: circle2.png // Fire ball Emitter - position: 200 200 - duration: 0.7 + position: 295 180 + duration: 0 burstRate: 0.0166 burstCount: 3 delay: 0 @@ -50,38 +57,46 @@ ParticleSystem particle-acceleration: 0 particle-start-size: 16 16 - particle-final-size: 64 64 + particle-final-size: 32 32 + particle-composition-mode: addition particle-colors: #19191980 #0f0f0f80 #00000000 particle-colors-stops: 0 0.45 0.9 particle-texture: circle2.png +ParticleSystem + + AttractionAffector + position: 320 180 + acceleration: 30 + repelish: true + // Smoke Emitter - position: 200 200 - duration: 0.1 + position: 295 180 + duration: 0.7 burstRate: 0.0166 burstCount: 3 - delay: 0 + delay: 0.4 - particle-min-duration: 0.1 - particle-max-duration: 0.45 + particle-min-duration: 0.9 + particle-max-duration: 0.9 particle-position-radius: 0 particle-min-velocity: 60 - particle-max-velocity: 80 - particle-min-velocity-angle: -5 - particle-max-velocity-angle: 10 + particle-max-velocity: 85 + particle-min-velocity-angle: -20 + particle-max-velocity-angle: 20 particle-acceleration: 0 particle-start-size: 8 8 particle-final-size: 64 64 - particle-colors: #555555ff #55555580 #55555500 - particle-colors-stops: 0 0.225 0.45 + particle-colors: #66666610 #00000000 + particle-colors-stops: 0 0.9 particle-texture: circle2.png diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index 1a418d4e..c046f94b 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -34,7 +34,7 @@ void Painter::init() { setColor(Fw::white); setOpacity(255); - setCompositionMode(CompositionMode_SourceOver); + setCompositionMode(CompositionMode_Normal); m_drawTexturedProgram = PainterShaderProgramPtr(new PainterShaderProgram); m_drawTexturedProgram->addShaderFromSourceCode(Shader::Vertex, glslMainWithTexCoordsVertexShader + glslPositionOnlyVertexShader); @@ -154,13 +154,13 @@ void Painter::setCustomProgram(PainterShaderProgramPtr program) void Painter::setCompositionMode(Painter::CompositionMode compositionMode) { switch(compositionMode) { - case CompositionMode_SourceOver: + case CompositionMode_Normal: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; - case CompositionMode_ColorizeSource: + case CompositionMode_Multiply: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break; - case CompositionMode_AdditiveSource: + case CompositionMode_Addition: glBlendFunc(GL_SRC_ALPHA, GL_ONE); break; } diff --git a/src/framework/graphics/painter.h b/src/framework/graphics/painter.h index 07b91569..e3bd6dab 100644 --- a/src/framework/graphics/painter.h +++ b/src/framework/graphics/painter.h @@ -32,9 +32,9 @@ class Painter { public: enum CompositionMode { - CompositionMode_SourceOver, - CompositionMode_ColorizeSource, - CompositionMode_AdditiveSource + CompositionMode_Normal, + CompositionMode_Multiply, + CompositionMode_Addition }; void init(); diff --git a/src/framework/graphics/particle.cpp b/src/framework/graphics/particle.cpp index 405e57c0..ed3bfd7f 100644 --- a/src/framework/graphics/particle.cpp +++ b/src/framework/graphics/particle.cpp @@ -24,7 +24,7 @@ #include "graphics.h" #include -Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector& colors, const std::vector& colorsStops, TexturePtr texture) +Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector& colors, const std::vector& colorsStops, Painter::CompositionMode compositionMode, TexturePtr texture) { m_colors = colors; m_colorsStops = colorsStops; @@ -35,6 +35,7 @@ Particle::Particle(const Point& pos, const Size& startSize, const Size& finalSiz m_velocity = velocity; m_acceleration = acceleration; + m_compositionMode = compositionMode; m_texture = texture; m_duration = duration; m_ignorePhysicsAfter = ignorePhysicsAfter; @@ -49,9 +50,9 @@ void Particle::render() if(!m_texture) g_painter.drawFilledRect(m_rect); else { - g_painter.setCompositionMode(Painter::CompositionMode_AdditiveSource); + g_painter.setCompositionMode(m_compositionMode); g_painter.drawTexturedRect(m_rect, m_texture); - g_painter.setCompositionMode(Painter::CompositionMode_SourceOver); + g_painter.setCompositionMode(Painter::CompositionMode_Normal); } } diff --git a/src/framework/graphics/particle.h b/src/framework/graphics/particle.h index 2aa69263..8ad30bbe 100644 --- a/src/framework/graphics/particle.h +++ b/src/framework/graphics/particle.h @@ -24,11 +24,12 @@ #define PARTICLE_H #include "declarations.h" +#include "painter.h" #include class Particle { public: - Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector& colors, const std::vector& colorsStops, TexturePtr texture = nullptr); + Particle(const Point& pos, const Size& startSize, const Size& finalSize, const PointF& velocity, const PointF& acceleration, float duration, float ignorePhysicsAfter, const std::vector& colors, const std::vector& colorsStops, Painter::CompositionMode compositionMode = Painter::CompositionMode_Normal, TexturePtr texture = nullptr); void render(); void update(double elapsedTime); @@ -53,6 +54,7 @@ private: PointF m_acceleration; Size m_size, m_startSize, m_finalSize; Rect m_rect; + Painter::CompositionMode m_compositionMode; float m_duration, m_ignorePhysicsAfter; double m_elapsedTime; bool m_finished; diff --git a/src/framework/graphics/particleaffector.cpp b/src/framework/graphics/particleaffector.cpp index b9f0851b..6a5dee52 100644 --- a/src/framework/graphics/particleaffector.cpp +++ b/src/framework/graphics/particleaffector.cpp @@ -112,6 +112,8 @@ bool AttractionAffector::load(const OTMLNodePtr& node) return false; m_acceleration = 32; + m_reduction = 0; + m_repelish = false; for(const OTMLNodePtr& childNode : node->children()) { if(childNode->tag() == "position") @@ -120,6 +122,8 @@ bool AttractionAffector::load(const OTMLNodePtr& node) m_acceleration = childNode->value(); else if(childNode->tag() == "velocity-reduction-percent") m_reduction = childNode->value(); + else if(childNode->tag() == "repelish") + m_repelish = childNode->value(); } return true; } @@ -134,6 +138,10 @@ void AttractionAffector::updateParticle(const ParticlePtr& particle, double elap if(d.length() == 0) return; - PointF pVelocity = particle->getVelocity() + (d / d.length() * m_acceleration * elapsedTime); + PointF direction = PointF(1, 1); + if(m_repelish) + direction = PointF(-1, -1); + + PointF pVelocity = particle->getVelocity() + (d / d.length() * m_acceleration * elapsedTime) * direction; particle->setVelocity(pVelocity - pVelocity * m_reduction/100.0 * elapsedTime); } diff --git a/src/framework/graphics/particleaffector.h b/src/framework/graphics/particleaffector.h index e987788d..d49f6af1 100644 --- a/src/framework/graphics/particleaffector.h +++ b/src/framework/graphics/particleaffector.h @@ -60,6 +60,7 @@ public: private: Point m_position; float m_acceleration, m_reduction; + bool m_repelish; }; #endif diff --git a/src/framework/graphics/particleemitter.cpp b/src/framework/graphics/particleemitter.cpp index d51c4d9a..61594a26 100644 --- a/src/framework/graphics/particleemitter.cpp +++ b/src/framework/graphics/particleemitter.cpp @@ -159,6 +159,14 @@ bool ParticleEmitter::load(const OTMLNodePtr& node) m_pColorsStops = Fw::split(childNode->value()); else if(childNode->tag() == "particle-texture") m_pTexture = g_textures.getTexture(childNode->value()); + else if(childNode->tag() == "particle-composition-mode") { + if(childNode->value() == "normal") + m_pCompositionMode = Painter::CompositionMode_Normal; + else if(childNode->value() == "multiply") + m_pCompositionMode = Painter::CompositionMode_Multiply; + else if(childNode->value() == "addition") + m_pCompositionMode = Painter::CompositionMode_Addition; + } } if(m_pColors.empty()) @@ -210,7 +218,7 @@ void ParticleEmitter::update(double elapsedTime) PointF pAcceleration(pAccelerationAbs * cos(pAccelerationAngle), pAccelerationAbs * sin(pAccelerationAngle)); ParticleSystemPtr particleSystem = m_parent.lock(); - particleSystem->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pTexture))); + particleSystem->addParticle(ParticlePtr(new Particle(pPosition, m_pStartSize, m_pFinalSize, pVelocity, pAcceleration, pDuration, m_pIgnorePhysicsAfter, m_pColors, m_pColorsStops, m_pCompositionMode, m_pTexture))); } } diff --git a/src/framework/graphics/particleemitter.h b/src/framework/graphics/particleemitter.h index 68a7dc89..fecf2aa4 100644 --- a/src/framework/graphics/particleemitter.h +++ b/src/framework/graphics/particleemitter.h @@ -24,6 +24,7 @@ #define PARTICLEEMITTER_H #include "declarations.h" +#include "painter.h" #include #include #include @@ -73,6 +74,7 @@ private: std::vector m_pColors; std::vector m_pColorsStops; TexturePtr m_pTexture; + Painter::CompositionMode m_pCompositionMode; }; #endif diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index e9df141d..a7de893e 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -522,15 +522,17 @@ void ProtocolGame::parseMagicEffect(InputMessage& msg) { Position pos = parsePosition(msg); int effectId = msg.getU8(); - EffectPtr effect = EffectPtr(new Effect()); - effect->setId(effectId); - effect->startAnimation(); - TilePtr tile = g_map.getTile(pos); - tile->addEffect(effect); + if(effectId != 37) { + EffectPtr effect = EffectPtr(new Effect()); + effect->setId(effectId); + effect->startAnimation(); - // TODO: check if particles effect exists, if not, play standard sprite effect. - //g_particleManager.load("particle.otpa"); + TilePtr tile = g_map.getTile(pos); + tile->addEffect(effect); + } + else + g_particleManager.load("particle.otpa"); } void ProtocolGame::parseAnimatedText(InputMessage& msg) @@ -546,10 +548,12 @@ void ProtocolGame::parseDistanceMissile(InputMessage& msg) Position toPos = parsePosition(msg); int shotId = msg.getU8(); - MissilePtr shot = MissilePtr(new Missile()); - shot->setId(shotId); - shot->setPath(fromPos, toPos); - g_map.addThing(shot, fromPos); + if(shotId != 4) { + MissilePtr shot = MissilePtr(new Missile()); + shot->setId(shotId); + shot->setPath(fromPos, toPos); + g_map.addThing(shot, fromPos); + } } void ProtocolGame::parseCreatureSquare(InputMessage& msg) diff --git a/src/otclient/ui/uigame.cpp b/src/otclient/ui/uigame.cpp index 9832582b..90987f71 100644 --- a/src/otclient/ui/uigame.cpp +++ b/src/otclient/ui/uigame.cpp @@ -83,7 +83,7 @@ bool UIGame::onKeyPress(uchar keyCode, std::string keyText, int keyboardModifier return true; } else if(keyCode == Fw::KeyRight || keyCode == Fw::KeyNumpad6) { g_game.turn(Otc::East); - g_particleManager.load("particle.otpa"); + //g_particleManager.load("particle.otpa"); return true; } else if(keyCode == Fw::KeyDown || keyCode == Fw::KeyNumpad2) { g_game.turn(Otc::South);