Does this patch applied ? yeKcim
RCL a écrit : > Hello, > > sorry for spamming the list again, but since I have no svn commit > access (my bad... got lost with multiple ssh keys), that's the only > way to commit patches for me for now :) > > Here's a small patch that makes cluster bomb useful. For me, > everything it did before is slightly larger "bang", with occasional > single splinter. Now it produces correct number of fragments. > > Tested against revision 4034 (the latest one at the moment of writing this). > > Patch is available here: http://rcl.mine.nu/outbound/wormux/cluster_bomb.diff > Or, alternatively, at the end of this mail. > > By the way, who is in charge of weapon logic? I'd like to ask that > person some questions :) > > Best regards, > Dmitry 'RCL' Rekman > > > > Index: src/weapon/cluster_bomb.cpp > =================================================================== > --- src/weapon/cluster_bomb.cpp (revision 4034) > +++ src/weapon/cluster_bomb.cpp (working copy) > @@ -34,6 +34,7 @@ > #include "tool/math_tools.h" > #include "tool/i18n.h" > #include "tool/xml_document.h" > +#include "game/time.h" > > class ClusterBombConfig : public ExplosiveWeaponConfig > { > @@ -49,12 +50,14 @@ > Cluster(ClusterBombConfig& cfg, > WeaponLauncher * p_launcher); > void Refresh(); > - void Shoot(int n_x, int n_y); > + void Shoot(const Point2i & pos, double strength, double angle); > virtual void SetEnergyDelta(int delta, bool do_report = true); > > protected: > - void SignalOutOfMap(); > - void DoExplosion(); > + virtual void SignalTimeout(); > + virtual void SignalOutOfMap(); > + virtual void DoExplosion(); > + virtual void Draw(); > }; > > class ClusterBomb : public WeaponProjectile > @@ -77,19 +80,35 @@ > explode_colliding_character = true; > } > > -void Cluster::Shoot (int x, int y) > +void Cluster::Shoot(const Point2i & pos, double strength, double angle) > { > + SetCollisionModel( false, true, false ); // a bit hackish... > + // we do need to collide with objects, but if we allow for this, the > clusters > + // will explode on spawn (because of colliding with each other) > + > + begin_time = Time::GetInstance()->Read(); > Camera::GetInstance()->FollowObject(this, true); > ResetConstants(); > - SetXY( Point2i(x, y) ); > + SetXY( pos ); > + SetSpeed(strength, angle); > } > > void Cluster::Refresh() > { > WeaponProjectile::Refresh(); > - image->SetRotation_rad(GetSpeedAngle()); > + // make it rotate > + uint time = Time::GetInstance()->Read(); > + float flying_time = ( float )( time - begin_time ); > + const float rotations_per_second = 4; > + image->SetRotation_rad( rotations_per_second * 2 * M_PI * > flying_time / 1000.0f ); > } > > +void Cluster::Draw() > +{ > + // custom Draw() is needed to avoid drawing timeout on top of clusters > + image->Draw(GetPosition()); > +}; > + > void Cluster::SignalOutOfMap() > { > WeaponProjectile::SignalOutOfMap(); > @@ -101,7 +120,11 @@ > } > > void Cluster::SetEnergyDelta(int /* delta */, bool /* do_report */){}; > +// because of game mechanics, clusters will inherit timeout from its > parent bomb, > +// and as such, will explode right after launch - something we don't want > +void Cluster::SignalTimeout(){}; > > + > > //----------------------------------------------------------------------------- > > ClusterBomb::ClusterBomb(ClusterBombConfig& cfg, > @@ -126,17 +149,24 @@ > > void ClusterBomb::DoExplosion() > { > - const uint nb = static_cast<ClusterBombConfig &>(cfg).nb_fragments; > + WeaponProjectile::DoExplosion(); > + > + const uint fragments = static_cast<ClusterBombConfig &>(cfg).nb_fragments; > Cluster * cluster; > - for (uint i=0; i<nb; ++i) { > - double angle = randomSync.GetDouble(2.0 * M_PI); > - int x = GetX()+(int)(cos(angle) * (double)cfg.blast_range * 0.9); > - int y = GetY()+(int)(sin(angle) * (double)cfg.blast_range * 0.9); > + > + const float angle_range = M_PI / 2; > + Point2i pos = GetPosition(); > + for (uint i = 0; i < fragments; ++i ) > + { > + double angle = -M_PI / 2; // this angle is "upwards" here > + double cluster_deviation = angle_range * i / ( float )fragments - > angle_range / 2.0f; > + double speed = randomSync.GetDouble(10, 25); > + > cluster = new Cluster(static_cast<ClusterBombConfig &>(cfg), launcher); > - cluster->Shoot(x,y); > + cluster->Shoot( pos, speed, angle + cluster_deviation ); > + > lst_objects.AddObject(cluster); > } > - WeaponProjectile::DoExplosion(); > } > > void ClusterBomb::SetEnergyDelta(int /* delta */, bool /* do_report */){}; > > _______________________________________________ > Wormux-dev mailing list > Wormux-dev@gna.org > https://mail.gna.org/listinfo/wormux-dev > _______________________________________________ Wormux-dev mailing list Wormux-dev@gna.org https://mail.gna.org/listinfo/wormux-dev