-// $Id$\r
-// \r
-// SuperTux\r
-// Copyright (C) 2005 Matthias Braun <matze@braunis.de>\r
-//\r
-// This program is free software; you can redistribute it and/or\r
-// modify it under the terms of the GNU General Public License\r
-// as published by the Free Software Foundation; either version 2\r
-// of the License, or (at your option) any later version.\r
-//\r
-// This program is distributed in the hope that it will be useful,\r
-// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
-// GNU General Public License for more details.\r
-// \r
-// You should have received a copy of the GNU General Public License\r
-// along with this program; if not, write to the Free Software\r
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\r
-// 02111-1307, USA.\r
-//\r
-\r
-#include <config.h>\r
-#include <sstream>\r
-\r
-#include "scripttrigger.h"\r
-#include "game_session.h"\r
-#include "lisp/lisp.h"\r
-#include "lisp/writer.h"\r
-#include "object_factory.h"\r
-#include "scripting/script_interpreter.h"\r
-#include "sector.h"\r
-\r
-ScriptTrigger::ScriptTrigger(const lisp::Lisp& reader)\r
-{\r
- bool must_activate;\r
- \r
- reader.get("x", bbox.p1.x);\r
- reader.get("y", bbox.p1.y);\r
- float w, h;\r
- reader.get("width", w);\r
- reader.get("height", h);\r
- bbox.set_size(w, h);\r
- reader.get("script", script);\r
- reader.get("button", must_activate);\r
- \r
- if (must_activate)\r
- triggerevent = EVENT_ACTIVATE;\r
- else\r
- triggerevent = EVENT_TOUCH;\r
-}\r
-\r
-ScriptTrigger::ScriptTrigger(const Vector& pos, const std::string& script)\r
-{\r
- bbox.set_pos(pos);\r
- bbox.set_size(32, 32);\r
- this->script = script;\r
- triggerevent = EVENT_TOUCH;\r
-}\r
-\r
-ScriptTrigger::~ScriptTrigger()\r
-{\r
-}\r
-\r
-void\r
-ScriptTrigger::write(lisp::Writer& writer)\r
-{\r
- writer.start_list("scripttrigger");\r
-\r
- writer.write_float("x", bbox.p1.x);\r
- writer.write_float("y", bbox.p1.y);\r
- writer.write_float("width", bbox.get_width());\r
- writer.write_float("height", bbox.get_height());\r
- writer.write_string("script", script);\r
-\r
- writer.end_list("scripttrigger");\r
-}\r
-\r
-void\r
-ScriptTrigger::event(Player& , EventType type)\r
-{\r
- if(type == triggerevent)\r
- {\r
- if (script != "")\r
- {\r
- try\r
- {\r
- ScriptInterpreter* interpreter = new ScriptInterpreter(Sector::current());\r
- std::istringstream in(script);\r
- interpreter->load_script(in, "trigger-script");\r
- interpreter->start_script();\r
- Sector::current()->add_object(interpreter);\r
- }\r
- catch(std::exception& e)\r
- {\r
- std::cerr << "Couldn't execute trigger script: " << e.what() << "\n";\r
- }\r
- }\r
- else\r
- {\r
- std::cerr << "... and where's the trigger script I'm supposed to run?\n";\r
- }\r
- }\r
-}\r
-\r
-IMPLEMENT_FACTORY(ScriptTrigger, "scripttrigger")\r
+// 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 as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+
+#include "supertux/object_factory.hpp"
+#include "supertux/sector.hpp"
+#include "trigger/scripttrigger.hpp"
+#include "util/reader.hpp"
+
+ScriptTrigger::ScriptTrigger(const Reader& reader) :
+ triggerevent(),
+ script()
+{
+ bool must_activate = false;
+
+ reader.get("x", bbox.p1.x);
+ reader.get("y", bbox.p1.y);
+ float w = 0, h = 0;
+ reader.get("width", w);
+ reader.get("height", h);
+ bbox.set_size(w, h);
+ reader.get("script", script);
+ reader.get("button", must_activate);
+ if(script == "") {
+ throw std::runtime_error("Need to specify a script for trigger object");
+ }
+
+ if (must_activate)
+ triggerevent = EVENT_ACTIVATE;
+ else
+ triggerevent = EVENT_TOUCH;
+}
+
+ScriptTrigger::ScriptTrigger(const Vector& pos, const std::string& script) :
+ triggerevent(),
+ script()
+{
+ bbox.set_pos(pos);
+ bbox.set_size(32, 32);
+ this->script = script;
+ triggerevent = EVENT_TOUCH;
+}
+
+ScriptTrigger::~ScriptTrigger()
+{
+}
+
+void
+ScriptTrigger::event(Player& , EventType type)
+{
+ if(type != triggerevent)
+ return;
+
+ std::istringstream stream(script);
+ Sector::current()->run_script(stream, "ScriptTrigger");
+}
+
+IMPLEMENT_FACTORY(ScriptTrigger, "scripttrigger");
+
+/* EOF */