X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fplatform.cpp;h=4151cc541c7ba67aa9f763711ac65800c5c69092;hb=657fc40723665c04b3150946f5bd66b6b0af9230;hp=3ea71eca8037972bdd8ac444d0ceffe1bbc115a2;hpb=4a486d92343d1824b311c234e9321e08f280fe68;p=supertux.git diff --git a/src/object/platform.cpp b/src/object/platform.cpp index 3ea71eca8..4151cc541 100644 --- a/src/object/platform.cpp +++ b/src/object/platform.cpp @@ -33,12 +33,17 @@ #include "object_factory.hpp" #include "scripting/platform.hpp" #include "scripting/squirrel_util.hpp" +#include "sector.hpp" Platform::Platform(const lisp::Lisp& reader) - : MovingSprite(reader, Vector(0,0), LAYER_OBJECTS, COLGROUP_STATIC), speed(Vector(0,0)) + : MovingSprite(reader, Vector(0,0), LAYER_OBJECTS, COLGROUP_STATIC), + speed(Vector(0,0)), + automatic(false), player_contact(false), last_player_contact(false) { bool running = true; + reader.get("name", name); reader.get("running", running); + if ((name == "") && (!running)) automatic=true; const lisp::Lisp* pathLisp = reader.get_lisp("path"); if(pathLisp == NULL) throw std::runtime_error("No path specified for platform"); @@ -49,7 +54,9 @@ Platform::Platform(const lisp::Lisp& reader) } Platform::Platform(const Platform& other) - : MovingSprite(other), ScriptInterface(other), speed(other.speed) + : MovingSprite(other), ScriptInterface(other), + speed(other.speed), + automatic(other.automatic), player_contact(false), last_player_contact(false) { name = other.name; path.reset(new Path(*other.path)); @@ -58,14 +65,51 @@ Platform::Platform(const Platform& other) } HitResponse -Platform::collision(GameObject& , const CollisionHit& ) +Platform::collision(GameObject& other, const CollisionHit& ) { + if (dynamic_cast(&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 players = Sector::current()->get_players(); + for (std::vector::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; }