// $Id$
//
-// SuperTux - A Jump'n Run
-// Copyright (C) 2004 Matthias Braun <matze@braunis.de
+// SuperTux
+// Copyright (C) 2006 Matthias Braun <matze@braunis.de>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
#include <config.h>
#include <stdexcept>
#include "lisp/lisp.hpp"
#include "lisp/writer.hpp"
#include "lisp/list_iterator.hpp"
+#include "scripting/camera.hpp"
+#include "scripting/squirrel_util.hpp"
#include "camera.hpp"
#include "player.hpp"
#include "tilemap.hpp"
#include "sector.hpp"
#include "main.hpp"
#include "object_factory.hpp"
-#include "msg.hpp"
+#include "log.hpp"
+#include "path.hpp"
+#include "path_walker.hpp"
Camera::Camera(Sector* newsector)
: sector(newsector), do_backscrolling(true), scrollchange(NONE)
{
}
+void
+Camera::expose(HSQUIRRELVM vm, SQInteger table_idx)
+{
+ Scripting::Camera* interface = new Scripting::Camera(this);
+ expose_object(vm, table_idx, interface, "Camera", true);
+}
+
+void
+Camera::unexpose(HSQUIRRELVM vm, SQInteger table_idx)
+{
+ Scripting::unexpose_object(vm, table_idx, "Camera");
+}
+
const Vector&
Camera::get_translation() const
{
reader.get("backscrolling", do_backscrolling);
} else if(modename == "autoscroll") {
mode = AUTOSCROLL;
- std::string use_path;
-
- if (!reader.get("path", use_path)) throw std::runtime_error("No path specified in autoscroll camera.");
- autoscrollPath = Path::GetByName(use_path);
- if (autoscrollPath == NULL) {
- msg_warning("Path for autoscroll camera not found! Make sure that the name is spelled correctly and that the path is initialized before the platform in the level file!");
- }
+ const lisp::Lisp* pathLisp = reader.get_lisp("path");
+ if(pathLisp == NULL)
+ throw std::runtime_error("No path specified in autoscroll camera.");
+ autoscroll_path.reset(new Path());
+ autoscroll_path->read(*pathLisp);
+ autoscroll_walker.reset(new PathWalker(autoscroll_path.get()));
} else if(modename == "manual") {
mode = MANUAL;
} else {
writer.write_bool("backscrolling", do_backscrolling);
} else if(mode == AUTOSCROLL) {
writer.write_string("mode", "autoscroll");
- writer.write_string("path", autoscrollPath->GetName());
+ autoscroll_path->write(writer);
} else if(mode == MANUAL) {
writer.write_string("mode", "manual");
}
void
Camera::update_scroll_autoscroll(float elapsed_time)
{
- Player* player = sector->player;
-
+ Player* player = sector->player;
if(player->is_dying())
return;
- translation = autoscrollPath->GetPosition();
+ translation += autoscroll_walker->advance(elapsed_time);
keep_in_bounds(translation);
shake();