#include <config.h>
#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;
}
TreeWillOWisp::~TreeWillOWisp()
set_group(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)
{
bool
TreeWillOWisp::collides(GameObject& other, const CollisionHit& ) {
Lantern* lantern = dynamic_cast<Lantern*>(&other);
- if (lantern && lantern->is_open()) return true;
- if (dynamic_cast<Player*>(&other)) return true;
+ if (lantern && lantern->is_open())
+ return true;
+ if (dynamic_cast<Player*>(&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 */