+ // 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);
+ }
+ }
+
+ // Clear player_contact flag set by collision() method
+ last_player_contact = player_contact;
+ player_contact = false;
+ }
+
+ movement = walker->advance(elapsed_time) - get_pos();
+ speed = movement / elapsed_time;
+}
+
+void
+Platform::goto_node(int node_no)
+{
+ walker->goto_node(node_no);
+}
+
+void
+Platform::start_moving()
+{
+ walker->start_moving();
+}
+
+void
+Platform::stop_moving()
+{
+ walker->stop_moving();
+}
+
+void
+Platform::expose(HSQUIRRELVM vm, SQInteger table_idx)
+{
+ if (name.empty()) return;
+ Scripting::Platform* interface = new Scripting::Platform(this);
+ expose_object(vm, table_idx, interface, name, true);