X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fwind.cpp;h=638ab6956ff547bc849a50a60c6de7e75811353a;hb=ca967dcf4ee89f99880355be00782d1cd047be6a;hp=a1265c5344d8c29292b17a124df984ce2e7e1f4e;hpb=7d731b516a5181ce4f39b0339c7bce1cdc7c0baa;p=supertux.git diff --git a/src/object/wind.cpp b/src/object/wind.cpp index a1265c534..638ab6956 100644 --- a/src/object/wind.cpp +++ b/src/object/wind.cpp @@ -26,9 +26,13 @@ #include "random_generator.hpp" #include "sector.hpp" #include "particles.hpp" +#include "scripting/wind.hpp" +#include "scripting/squirrel_util.hpp" -Wind::Wind(const lisp::Lisp& reader) : acceleration(100), elapsed_time(0) +Wind::Wind(const lisp::Lisp& reader) + : blowing(true), acceleration(100), elapsed_time(0) { + reader.get("name", name); reader.get("x", bbox.p1.x); reader.get("y", bbox.p1.y); float w = 32, h = 32; @@ -36,6 +40,8 @@ Wind::Wind(const lisp::Lisp& reader) : acceleration(100), elapsed_time(0) reader.get("height", h); bbox.set_size(w, h); + reader.get("blowing", blowing); + float speed_x = 0, speed_y = 0; reader.get("speed-x", speed_x); reader.get("speed-y", speed_y); @@ -50,12 +56,15 @@ void Wind::update(float elapsed_time) { this->elapsed_time = elapsed_time; + + if (!blowing) return; + // TODO: nicer, configurable particles for wind? if (systemRandom.rand(0, 100) < 20) { // emit a particle Vector ppos = Vector(systemRandom.randf(bbox.p1.x+8, bbox.p2.x-8), systemRandom.randf(bbox.p1.y+8, bbox.p2.y-8)); - Vector pspeed = Vector(speed.x, -speed.y); - Sector::current()->add_object(new Particles(ppos, 44, 46, pspeed, Vector(0,0), 1, Color(.4, .4, .4), 3, .1, LAYER_BACKGROUNDTILES+1)); + Vector pspeed = Vector(speed.x, speed.y); + Sector::current()->add_object(new Particles(ppos, 44, 46, pspeed, Vector(0,0), 1, Color(.4f, .4f, .4f), 3, .1f, LAYER_BACKGROUNDTILES+1)); } } @@ -67,6 +76,8 @@ Wind::draw(DrawingContext& ) HitResponse Wind::collision(GameObject& other, const CollisionHit& ) { + if (!blowing) return ABORT_MOVE; + Player* player = dynamic_cast (&other); if (player) { if (!player->on_ground()) { @@ -77,4 +88,35 @@ Wind::collision(GameObject& other, const CollisionHit& ) return ABORT_MOVE; } +void +Wind::expose(HSQUIRRELVM vm, SQInteger table_idx) +{ + if (name == "") + return; + + Scripting::Wind* interface = new Scripting::Wind(this); + expose_object(vm, table_idx, interface, name, true); +} + +void +Wind::unexpose(HSQUIRRELVM vm, SQInteger table_idx) +{ + if (name == "") + return; + + Scripting::unexpose_object(vm, table_idx, name); +} + +void +Wind::start() +{ + blowing = true; +} + +void +Wind::stop() +{ + blowing = false; +} + IMPLEMENT_FACTORY(Wind, "wind");