Yes, long ago. AFAIR you were the person who commited that for me - thanks :)
RCL On Fri, Feb 22, 2008 at 2:04 PM, yeKcim <[EMAIL PROTECTED]> wrote: > 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 > _______________________________________________ Wormux-dev mailing list Wormux-dev@gna.org https://mail.gna.org/listinfo/wormux-dev