Bug#392774: wormux: blocks the whole X session when GNU touches the first object

Eddy Petrișor eddy.petrisor at gmail.com
Wed Nov 8 14:23:31 CET 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Eddy Petrișor wrote:
> Hello,
> 
> Steve, thanks for the additional info, I didn't realised the value was
> ....e+306 until you pointed it out.
> 
> I will look into the physics engine to see what is wrong and try to
> understand what is wrong. It appears that upstream is quite aware of the
> issue that it exists, but they don't know why it happens:
> 
> ---------8<---------------
>   //Due to a bug in the physic engine
>   //sometimes, angle==infinite (according to gdb) ??
>   GetSpeed(norme, angle);
> 
>   while(angle < -M_PI) angle += M_PI;
>   while(angle > M_PI) angle -= M_PI;
> 
> ---------8<---------------

I have looked deeper into this issue, and (of course, still a problem
just in front of me - the lack of coding in the last year starts to show
its hideous face). I have seen this from the start, but I have payed too
much attention.

The issue is that angle and norme are declared locally instead of the
class. The physics engine is quite ok from the GNU POV.

I will be experimenting with some asserts in the code before providing a
final patch.


In care anyone cares, here is the current (debugging) state:


- --- wormux-0.7.4.orig/src/object/physics.cpp
+++ wormux-0.7.4/src/object/physics.cpp
@@ -192,6 +192,12 @@
       break;

     default:
+      assert(m_motion_type==NoMotion);
+      /*
+      printf ("\n> motion type:%d\n",m_motion_type);
+      printf ("> angle      :%d\n",angle);
+      printf ("> norm       :%d\n\n",norm);
+      */
       break ;
   }
 }
- --- wormux-0.7.4.orig/src/weapon/gnu.h
+++ wormux-0.7.4/src/weapon/gnu.h
@@ -39,6 +39,7 @@
   int m_sens;
   int save_x, save_y;
   double angle;
+  double norme;
 public:
   Gnu(ExplosiveWeaponConfig& cfg);
   void Shoot(double strength);
- --- wormux-0.7.4.orig/src/weapon/gnu.cpp
+++ wormux-0.7.4/src/weapon/gnu.cpp
@@ -47,6 +47,8 @@
   save_y=GetY();

   double angle = ActiveTeam().crosshair.GetAngleRad();
+  assert(angle < M_PI);
+  assert(angle > -M_PI);

   if(angle<M_PI/2 && angle>-M_PI/2)
     m_sens = 1;
@@ -58,7 +60,6 @@
 {
   WeaponProjectile::Refresh();

- -  double norme, angle;
   //When we hit the ground, jump !
   if(!IsMoving()&& !FootsInVacuum())
   {
@@ -78,10 +79,23 @@

   //Due to a bug in the physic engine
   //sometimes, angle==infinite (according to gdb) ??
+  //No, is just the angle and norm should not be redefined locally
+  //Is so much easier to blame others, ain't it? :-)
   GetSpeed(norme, angle);

+  /*
   while(angle < -M_PI) angle += M_PI;
+  if(angle > M_PI)
+  {
+    long int chunk = (floor(angle/M_PI)) * M_PI ;
+    angle -= chunk ;
+  }
   while(angle > M_PI) angle -= M_PI;
+  */
+  if (angle < M_PI) printf ("OUCH: angle=%f\n",angle);
+  assert(angle < M_PI);
+  if (angle > -M_PI) printf ("OUCH: angle=%f\n",angle);
+  assert(angle >= -M_PI);

   angle *= 180.0 / M_PI;
   angle /= 2.0;
- ---------------8<-----------


- --
Regards,
EddyP
=============================================
"Imagination is more important than knowledge" A.Einstein
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFUdpTY8Chqv3NRNoRAh6zAJ44q1BhY6LCYZyWTKthX/newJO55gCdGUFr
e2rCby1HIaqPI/IMP9uPGZg=
=qroI
-----END PGP SIGNATURE-----




More information about the Pkg-games-devel mailing list