X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Ftreewillowisp.cpp;h=4a0c06bce183a90832e3ba42d5ca6e3b61a6780c;hb=198f758764fff064a47630b5d0f1e3d6aabe95a8;hp=c31531ff3d4913ce9f77ce100c783f44c7c032bd;hpb=9f9a92cd9d8433c6d4d63b0178fd038a95b9e1a1;p=supertux.git diff --git a/src/badguy/treewillowisp.cpp b/src/badguy/treewillowisp.cpp index c31531ff3..4a0c06bce 100644 --- a/src/badguy/treewillowisp.cpp +++ b/src/badguy/treewillowisp.cpp @@ -20,19 +20,26 @@ #include #include "treewillowisp.hpp" +#include "ghosttree.hpp" #include "object/lantern.hpp" static const std::string SOUNDFILE = "sounds/willowisp.wav"; +static const float SUCKSPEED = 25; -TreeWillOWisp::TreeWillOWisp(const Vector& pos, float radius, float speed) - : BadGuy(pos, "images/creatures/willowisp/willowisp.sprite", - LAYER_OBJECTS - 20), mystate(STATE_DEFAULT) +TreeWillOWisp::TreeWillOWisp(GhostTree* tree, const Vector& pos, + float radius, float speed) + : BadGuy(Vector(0, 0), "images/creatures/willowisp/willowisp.sprite", + LAYER_OBJECTS - 20), was_sucked(false), mystate(STATE_DEFAULT), tree(tree) { + treepos_delta = pos; sound_manager->preload(SOUNDFILE); this->radius = radius; this->angle = 0; this->speed = speed; + start_position = tree->get_pos() + treepos_delta; + + set_colgroup_active(COLGROUP_MOVING); } TreeWillOWisp::~TreeWillOWisp() @@ -48,8 +55,6 @@ TreeWillOWisp::activate() sound_source->set_gain(2.0); sound_source->set_reference_distance(32); sound_source->play(); - - set_group(COLGROUP_MOVING); } void @@ -57,38 +62,73 @@ TreeWillOWisp::vanish() { mystate = STATE_VANISHING; sprite->set_action("vanishing", 1); - set_group(COLGROUP_DISABLED); + set_colgroup_active(COLGROUP_DISABLED); +} + +void +TreeWillOWisp::start_sucking(Vector suck_target) +{ + mystate = STATE_SUCKED; + this->suck_target = suck_target; + was_sucked = true; } HitResponse TreeWillOWisp::collision_player(Player& player, const CollisionHit& hit) { - (void) player; - (void) hit; - - return FORCE_MOVE; + //TODO: basically a no-op. Remove if this doesn't change. + return BadGuy::collision_player(player, hit); } bool TreeWillOWisp::collides(GameObject& other, const CollisionHit& ) { - if (dynamic_cast(&other)) return true; + Lantern* lantern = dynamic_cast(&other); + if (lantern && lantern->is_open()) + return true; + if (dynamic_cast(&other)) + return true; + return false; } void -TreeWillOWisp::active_update(float elapsed_time) +TreeWillOWisp::draw(DrawingContext& context) { + sprite->draw(context, get_pos(), layer); + + context.push_target(); + context.set_target(DrawingContext::LIGHTMAP); + sprite->draw(context, get_pos(), layer); + + context.pop_target(); +} + +void +TreeWillOWisp::active_update(float elapsed_time) +{ // remove TreeWillOWisp if it has completely vanished if (mystate == STATE_VANISHING) { if(sprite->animation_done()) { remove_me(); + tree->willowisp_died(this); + } + return; + } + + if (mystate == STATE_SUCKED) { + Vector dir = suck_target - get_pos(); + if(dir.norm() < 5) { + vanish(); return; } + Vector newpos = get_pos() + dir * elapsed_time; + movement = newpos - get_pos(); + return; } angle = fmodf(angle + elapsed_time * speed, (float) (2*M_PI)); - Vector newpos(start_position.x + sin(angle) * radius, start_position.y); + Vector newpos(tree->get_pos() + treepos_delta + Vector(sin(angle) * radius, 0)); movement = newpos - get_pos(); float sizemod = cos(angle) * 0.8f; /* TODO: modify sprite size */