4 // Copyright (C) 2006 Matthias Braun <matze@braunis.de>
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 #include "scripted_object.hpp"
26 #include "video/drawing_context.hpp"
27 #include "scripting/squirrel_util.hpp"
28 #include "resources.hpp"
29 #include "object_factory.hpp"
30 #include "math/vector.hpp"
32 ScriptedObject::ScriptedObject(const lisp::Lisp& lisp)
33 : MovingSprite(lisp, LAYER_OBJECTS, COLGROUP_MOVING),
34 solid(true), physic_enabled(true), visible(true), new_vel_set(false)
36 lisp.get("name", name);
38 throw std::runtime_error("Scripted object must have a name specified");
40 // FIXME: do we need this? bbox is already set via .sprite file
41 float width = sprite->get_width();
42 float height = sprite->get_height();
43 lisp.get("width", width);
44 lisp.get("height", height);
45 bbox.set_size(width, height);
47 lisp.get("solid", solid);
48 lisp.get("physic-enabled", physic_enabled);
49 lisp.get("visible", visible);
50 lisp.get("z-pos", layer);
56 ScriptedObject::expose(HSQUIRRELVM vm, SQInteger table_idx)
58 Scripting::ScriptedObject* interface = static_cast<Scripting::ScriptedObject*> (this);
59 expose_object(vm, table_idx, interface, name, false);
63 ScriptedObject::unexpose(HSQUIRRELVM vm, SQInteger table_idx)
65 Scripting::unexpose_object(vm, table_idx, name);
69 ScriptedObject::move(float x, float y)
71 bbox.move(Vector(x, y));
75 ScriptedObject::set_pos(float x, float y)
77 printf("SetPos: %f %f\n", x, y);
78 bbox.set_pos(Vector(x, y));
83 ScriptedObject::get_pos_x()
89 ScriptedObject::get_pos_y()
95 ScriptedObject::set_velocity(float x, float y)
97 new_vel = Vector(x, y);
102 ScriptedObject::get_velocity_x()
104 return physic.get_velocity_x();
108 ScriptedObject::get_velocity_y()
110 return physic.get_velocity_y();
114 ScriptedObject::set_visible(bool visible)
116 this->visible = visible;
120 ScriptedObject::is_visible()
126 ScriptedObject::set_action(const std::string& animation)
128 sprite->set_action(animation);
132 ScriptedObject::get_action()
134 return sprite->get_action();
138 ScriptedObject::get_name()
144 ScriptedObject::update(float elapsed_time)
150 physic.set_velocity(new_vel.x, new_vel.y);
153 movement = physic.get_movement(elapsed_time);
157 ScriptedObject::draw(DrawingContext& context)
162 sprite->draw(context, get_pos(), layer);
166 ScriptedObject::collision(GameObject& other, const CollisionHit& hit)
171 if(!(other.get_flags() & FLAG_SOLID))
174 if(other.get_flags() & FLAG_SOLID) {
175 if(hit.normal.y < 0) { // landed on floor
176 if(physic.get_velocity_y() < 0)
177 physic.set_velocity_y(0);
178 } else if(hit.normal.y > 0) { // bumped against roof
179 physic.set_velocity_y(.1);
182 if(fabsf(hit.normal.x) > .9) { // hit on side?
183 physic.set_velocity_x(0);
192 IMPLEMENT_FACTORY(ScriptedObject, "scriptedobject");