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 |
|
|
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) |
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)); |