enigma-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Enigma-cvs] enigma/src actors.cc,1.47,1.48


From: Ralf Westram <address@hidden>
Subject: [Enigma-cvs] enigma/src actors.cc,1.47,1.48
Date: Thu, 30 Oct 2003 19:04:12 +0000

Update of /cvsroot/enigma/enigma/src
In directory subversions:/tmp/cvs-serv17945/src

Modified Files:
        actors.cc 
Log Message:
- actor_inside is now even called if the actor is only
  partly inside a stone



Index: actors.cc
===================================================================
RCS file: /cvsroot/enigma/enigma/src/actors.cc,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -d -r1.47 -r1.48
*** actors.cc   27 Oct 2003 22:27:53 -0000      1.47
--- actors.cc   30 Oct 2003 19:04:10 -0000      1.48
***************
*** 324,327 ****
--- 324,341 ----
  }
  
+ namespace {
+     inline void maybe_call_actor_inside(Actor *ac, const GridPos& 
surroundingPos) {
+         if (Stone *st = GetStone(surroundingPos)) {
+             ActorInfo *ai   = ac->get_actorinfo();
+             double     dist = length(surroundingPos.center()-ai->pos) - 
ai->radius;
+ 
+             if (dist < 0.65) { // otherwise actor is crashed by stones with 
round edges
+                 // st->warning("actordist is %f", dist);
+                 st->actor_inside(ac);
+             }
+         }
+     }
+ }
+ 
  void Actor::move() {
      using namespace world;
***************
*** 349,352 ****
--- 363,391 ----
          st->actor_inside(this);
  
+     // check whether marble overlaps with surrounding fields and
+     // call actor_inside for all stones on overlapped fields
+     {
+         double  radius = actorinfo.radius-0.05; // allow a very small overlap
+         GridPos lu_field(actorinfo.pos+V2(-radius, -radius));
+         GridPos rl_field(actorinfo.pos+V2( radius,  radius));
+         bool    ov_top = lu_field.y != field.y;
+         bool    ov_bot = rl_field.y != field.y;
+ 
+         if (lu_field.x != field.x) { // overlaps into left field
+             if (ov_top) maybe_call_actor_inside(this, GridPos(field.x-1, 
field.y-1));
+             maybe_call_actor_inside            (this, GridPos(field.x-1, 
field.y));
+             if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x-1, 
field.y+1));
+         }
+ 
+         if (rl_field.x != field.x) { // overlaps into right field
+             if (ov_top) maybe_call_actor_inside(this, GridPos(field.x+1, 
field.y-1));
+             maybe_call_actor_inside            (this, GridPos(field.x+1, 
field.y));
+             if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x+1, 
field.y+1));
+         }
+ 
+         if (ov_top) maybe_call_actor_inside(this, GridPos(field.x, 
field.y-1));
+         if (ov_bot) maybe_call_actor_inside(this, GridPos(field.x, 
field.y+1));
+     }
+ 
      m_sprite.move (actorinfo.pos);
      on_motion(actorinfo.pos);
***************
*** 698,702 ****
              m_shield_rest_time += SHIELD_TIME;
              update_halo();
!         } 
          else if (m == "booze") {
              m_drunk_rest_time += 5.0; // Drunken for 5 more seconds
--- 737,741 ----
              m_shield_rest_time += SHIELD_TIME;
              update_halo();
!         }
          else if (m == "booze") {
              m_drunk_rest_time += 5.0; // Drunken for 5 more seconds





reply via email to

[Prev in Thread] Current Thread [Next in Thread]