X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Ftotem.cpp;h=2f1327d11b1a661f360f858279eb4bdc883fb4d5;hb=126aa9428c83eb1e17d4a75a55d15e3e6e0c6875;hp=67b467dc574c9f616d0d404bcf7bd30467344370;hpb=67690e081c28b818e94796be284206326bc8a6b9;p=supertux.git diff --git a/src/badguy/totem.cpp b/src/badguy/totem.cpp index 67b467dc5..2f1327d11 100644 --- a/src/badguy/totem.cpp +++ b/src/badguy/totem.cpp @@ -1,4 +1,4 @@ -// $Id: totem.cpp 3096 2006-03-17 12:03:02Z sommer $ +// $Id$ // // SuperTux - "Totem" Badguy // Copyright (C) 2006 Christoph Sommer @@ -21,23 +21,22 @@ #include #include "totem.hpp" -#include "msg.hpp" +#include "log.hpp" static const float WALKSPEED = 100; -static const float JUMP_ON_SPEED_Y = 400; -static const float JUMP_OFF_SPEED_Y = 500; +static const float JUMP_ON_SPEED_Y = -400; +static const float JUMP_OFF_SPEED_Y = -500; Totem::Totem(const lisp::Lisp& reader) + : BadGuy(reader, "images/creatures/totem/totem.sprite") { - stay_on_platform = false; carrying = 0; carried_by = 0; - bbox.set_size(48, 49); +} - reader.get("x", start_position.x); - reader.get("y", start_position.y); - reader.get("stay-on-platform", stay_on_platform); - sprite = sprite_manager->create("images/creatures/totem/totem.sprite"); +Totem::Totem(const Totem& other) + : BadGuy(other), carrying(other.carrying), carried_by(other.carried_by) +{ } Totem::~Totem() @@ -46,6 +45,20 @@ Totem::~Totem() if (carried_by) jump_off(); } +bool +Totem::updatePointers(const GameObject* from_object, GameObject* to_object) +{ + if (from_object == carrying) { + carrying = dynamic_cast(to_object); + return true; + } + if (from_object == carried_by) { + carried_by = dynamic_cast(to_object); + return true; + } + return false; +} + void Totem::write(lisp::Writer& writer) { @@ -53,7 +66,6 @@ Totem::write(lisp::Writer& writer) writer.write_float("x", start_position.x); writer.write_float("y", start_position.y); - writer.write_bool("stay-on-platform", stay_on_platform); writer.end_list("totem"); } @@ -78,7 +90,7 @@ Totem::active_update(float elapsed_time) BadGuy::active_update(elapsed_time); if (!carried_by) { - if (stay_on_platform && may_fall_off_platform()) + if (on_ground() && might_fall()) { dir = (dir == LEFT ? RIGHT : LEFT); activate(); @@ -133,36 +145,37 @@ Totem::collision_squished(Player& player) } sprite->set_action(dir == LEFT ? "squished-left" : "squished-right"); - this->bbox.set_size(48, 45); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); + kill_squished(player); return true; } -HitResponse -Totem::collision_solid(GameObject& object, const CollisionHit& hit) +void +Totem::collision_solid(const CollisionHit& hit) { + update_on_ground_flag(hit); + // if we are being carried around, pass event to bottom of stack and ignore it if (carried_by) { - carried_by->collision_solid(object, hit); - return CONTINUE; + carried_by->collision_solid(hit); + return; } // If we hit something from above or below: stop moving in this direction - if (hit.normal.y != 0) { + if (hit.top || hit.bottom) { physic.set_velocity_y(0); } // If we are hit from the direction we are facing: turn around - if ((hit.normal.x > .8) && (dir == LEFT)) { + if (hit.left && (dir == LEFT)) { dir = RIGHT; activate(); } - if ((hit.normal.x < -.8) && (dir == RIGHT)) { + if (hit.right && (dir == RIGHT)) { dir = LEFT; activate(); } - - return CONTINUE; } HitResponse @@ -186,11 +199,11 @@ Totem::collision_badguy(BadGuy& badguy, const CollisionHit& hit) } // If we are hit from the direction we are facing: turn around - if ((hit.normal.x > .8) && (dir == LEFT)) { + if(hit.left && (dir == LEFT)) { dir = RIGHT; activate(); } - if ((hit.normal.x < -.8) && (dir == RIGHT)) { + if(hit.right && (dir == RIGHT)) { dir = LEFT; activate(); } @@ -211,15 +224,15 @@ void Totem::jump_on(Totem* target) { if (target->carrying) { - msg_warning << "target is already carrying someone" << std::endl; + log_warning << "target is already carrying someone" << std::endl; return; } target->carrying = this; this->carried_by = target; - this->bbox.set_size(48, 45); this->activate(); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); this->synchronize_with(target); } @@ -227,16 +240,17 @@ Totem::jump_on(Totem* target) void Totem::jump_off() { if (!carried_by) { - msg_warning << "not carried by anyone" << std::endl; + log_warning << "not carried by anyone" << std::endl; return; } carried_by->carrying = 0; this->carried_by = 0; - this->bbox.set_size(48, 49); this->activate(); + bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); + physic.set_velocity_y(JUMP_OFF_SPEED_Y); } @@ -251,7 +265,7 @@ Totem::synchronize_with(Totem* base) } Vector pos = base->get_pos(); - pos.y -= 45; + pos.y -= sprite->get_current_hitbox_height(); set_pos(pos); physic.set_velocity_x(base->physic.get_velocity_x());