/[enigma]/enigma/src/world.cc
ViewVC logotype

Diff of /enigma/src/world.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.29 by reallysoft, Wed May 14 08:09:57 2003 UTC revision 1.30 by reallysoft, Wed May 14 10:48:34 2003 UTC
# Line 1062  namespace Line 1062  namespace
1062    
1063  }  }
1064    
1065    
1066    
1067  namespace  namespace
1068  {  {
1069      FloorLayer      fl_layer;      FloorLayer      fl_layer;
1070      ItemLayer       it_layer;      ItemLayer       it_layer;
1071      StoneLayer      st_layer;      StoneLayer      st_layer;
1072      vector<GridPos> changed_stones;      vector<GridPos> changed_stones;
1073    
1074        // delayed impulses :
1075    
1076        class DelayedImpulse {
1077            Impulse      impulse;
1078            const Stone *receiver;  // to test if stone has changed
1079            double       delay;
1080    
1081            DelayedImpulse& operator = (const DelayedImpulse& other); // forbidden
1082        public:
1083            DelayedImpulse(const Impulse& impulse_, double delay_, const Stone *receiver_)
1084                : impulse(impulse_), delay(delay_), receiver(receiver_) {}
1085    
1086            DelayedImpulse(const DelayedImpulse& other)
1087                : impulse(other.impulse), delay(other.delay), receiver(other.receiver) {}
1088    
1089            bool tick(double dtime) { // returns true if Impulse has to be sent NOW
1090                delay -= dtime;
1091                return delay <= 0;
1092            }
1093    
1094            const GridPos& destination() const { return impulse.dest; }
1095    
1096            bool send_impulse(Stone *target) const {
1097    
1098                // @@@ FIXME: the test for equality of Stones sometimes fails
1099                // (e.g. with turnstiles rotated by rotators)
1100                //
1101                // I guess this happens, because when the turnstile-pivot removes and add arms
1102                // during turn, it may happen, that the Stone receives the same memory address
1103                //
1104                // Possible fix : add unique ID to all objects
1105    
1106                if (target == receiver) { // if object did not change since impulse was initiated
1107                    target->on_impulse(impulse);
1108                }
1109            }
1110        };
1111    
1112        typedef list<DelayedImpulse> ImpulseList;
1113        ImpulseList delayed_impulses;
1114  }  }
1115    
1116    
# Line 1209  bool world::GetActorsInRange (px::V2 cen Line 1252  bool world::GetActorsInRange (px::V2 cen
1252      return !actors.empty();      return !actors.empty();
1253  }  }
1254    
1255    //----------------------------------------
1256    // handling of delayed impulses
1257    //----------------------------------------
1258    
1259    void
1260    world::addDelayedImpulse(const Impulse& impulse, double delay, const Stone *estimated_receiver) {
1261    
1262        // @@@ FIXME: is a special handling necessary if several impulses hit same destination ?
1263    
1264        delayed_impulses.push_back(DelayedImpulse(impulse, delay, estimated_receiver));
1265    }
1266    
1267    
1268    //----------------------------------------
1269    // Tick
1270    //----------------------------------------
1271    
1272  void  void
1273  world::Tick(double dtime)  world::Tick(double dtime)
# Line 1228  world::Tick(double dtime) Line 1286  world::Tick(double dtime)
1286              }              }
1287              ai->forceacc = V2();              ai->forceacc = V2();
1288          }          }
1289    
1290            // handle delayed impulses
1291            for (ImpulseList::iterator i = delayed_impulses.begin(); i != delayed_impulses.end(); ) {
1292                if (i->tick(timestep)) { // should the impulse take effect now ?
1293                    if (Stone *st = GetStone(i->destination())) { // is there a stone on the destination field ?
1294                        i->send_impulse(st);
1295                    }
1296                    i = delayed_impulses.erase(i);
1297                }
1298                else {
1299                    ++i;
1300                }
1301            }
1302    
1303          // Tell floors and items about new stones.          // Tell floors and items about new stones.
1304          for (unsigned i=0; i<changed_stones.size(); ++i)          for (unsigned i=0; i<changed_stones.size(); ++i)
1305              stone_change(changed_stones[i]);              stone_change(changed_stones[i]);
1306          changed_stones.clear();          changed_stones.clear();
1307    
   
1308          mouseforce->tick(timestep);          mouseforce->tick(timestep);
1309          for_each(level->forces.begin(), level->forces.end(),          for_each(level->forces.begin(), level->forces.end(),
1310                   bind2nd(mem_fun(&ForceField::tick), timestep));                   bind2nd(mem_fun(&ForceField::tick), timestep));

Legend:
Removed from v.1.29  
changed lines
  Added in v.1.30

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26