- if (typeid(other) == typeid(Player)) {
- Player* player = (Player*) &other;
- if ((hit.normal.x == 0) && (hit.normal.y == 1)) {
- //Tux is standing on the platform
- player->movement += path->GetLastMovement();
+ if (dynamic_cast<Player*>(&other)) player_contact = true;
+ return FORCE_MOVE;
+}
+
+void
+Platform::update(float elapsed_time)
+{
+ // check if Platform should automatically pick a destination
+ if (automatic) {
+
+ if (!player_contact && !walker->is_moving()) {
+ // Player doesn't touch platform and Platform is not moving
+
+ // Travel to node nearest to nearest player
+ // FIXME: does not really use nearest player
+ Player* player = 0;
+ std::vector<Player*> players = Sector::current()->get_players();
+ for (std::vector<Player*>::iterator playerIter = players.begin(); playerIter != players.end(); ++playerIter) {
+ player = *playerIter;
+ }
+ if (player) {
+ int nearest_node_id = path->get_nearest_node_no(player->get_bbox().p2);
+ if (nearest_node_id != -1) {
+ goto_node(nearest_node_id);
+ }
+ }
+ }
+
+ if (player_contact && !last_player_contact && !walker->is_moving()) {
+ // Player touched platform, didn't touch last frame and Platform is not moving
+
+ // Travel to node farthest from current position
+ int farthest_node_id = path->get_farthest_node_no(get_pos());
+ if (farthest_node_id != -1) {
+ goto_node(farthest_node_id);
+ }