X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Ftotem.cpp;h=5941a1b695389e1059ed836ec2f02449779b277d;hb=26316f3548bc819f817918a79dbee7ce9f7270c5;hp=7d2b932a1f02620294a1988cf662aec8009505ee;hpb=58eb3364f724b2100859fd39da9bba5a9a09cafc;p=supertux.git diff --git a/src/badguy/totem.cpp b/src/badguy/totem.cpp index 7d2b932a1..5941a1b69 100644 --- a/src/badguy/totem.cpp +++ b/src/badguy/totem.cpp @@ -1,55 +1,48 @@ -// $Id$ -// // SuperTux - "Totem" Badguy // Copyright (C) 2006 Christoph Sommer // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. +// along with this program. If not, see . -#include +#include "badguy/totem.hpp" -#include "totem.hpp" -#include "log.hpp" +#include "audio/sound_manager.hpp" +#include "object/player.hpp" +#include "sprite/sprite.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" -static const float WALKSPEED = 100; -static const float JUMP_ON_SPEED_Y = 400; -static const float JUMP_OFF_SPEED_Y = 500; +#include -Totem::Totem(const lisp::Lisp& reader) -{ - carrying = 0; - carried_by = 0; +static const float JUMP_ON_SPEED_Y = -400; +static const float JUMP_OFF_SPEED_Y = -500; +static const std::string LAND_ON_TOTEM_SOUND = "sounds/totem.ogg"; - reader.get("x", start_position.x); - reader.get("y", start_position.y); - sprite = sprite_manager->create("images/creatures/totem/totem.sprite"); - bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); -} - -Totem::Totem(const Totem& other) - : BadGuy(other), carrying(other.carrying), carried_by(other.carried_by) +Totem::Totem(const Reader& reader) : + BadGuy(reader, "images/creatures/totem/totem.sprite"), + carrying(0), + carried_by(0) { + SoundManager::current()->preload( LAND_ON_TOTEM_SOUND ); } -Totem::~Totem() +Totem::~Totem() { if (carrying) carrying->jump_off(); if (carried_by) jump_off(); } -bool +bool Totem::updatePointers(const GameObject* from_object, GameObject* to_object) { if (from_object == carrying) { @@ -64,20 +57,10 @@ Totem::updatePointers(const GameObject* from_object, GameObject* to_object) } void -Totem::write(lisp::Writer& writer) -{ - writer.start_list("totem"); - - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); - - writer.end_list("totem"); -} - -void -Totem::activate() +Totem::initialize() { if (!carried_by) { +static const float WALKSPEED = 100; physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); sprite->set_action(dir == LEFT ? "walking-left" : "walking-right"); return; @@ -94,37 +77,37 @@ Totem::active_update(float elapsed_time) BadGuy::active_update(elapsed_time); if (!carried_by) { - if (might_fall()) + if (on_ground() && might_fall()) { dir = (dir == LEFT ? RIGHT : LEFT); - activate(); + initialize(); } Sector* s = Sector::current(); if (s) { - // jump a bit if we find a suitable totem + // jump a bit if we find a suitable totem for (std::vector::iterator i = s->moving_objects.begin(); i != s->moving_objects.end(); i++) { - Totem* t = dynamic_cast(*i); - if (!t) continue; - - // skip if we are not approaching each other - if (!((this->dir == LEFT) && (t->dir == RIGHT))) continue; - - Vector p1 = this->get_pos(); - Vector p2 = t->get_pos(); - - // skip if not on same height - float dy = (p1.y - p2.y); - if (fabsf(dy - 0) > 2) continue; - - // skip if too far away - float dx = (p1.x - p2.x); - if (fabsf(dx - 128) > 2) continue; - - physic.set_velocity_y(JUMP_ON_SPEED_Y); - p1.y -= 1; - this->set_pos(p1); - break; + Totem* t = dynamic_cast(*i); + if (!t) continue; + + // skip if we are not approaching each other + if (!((this->dir == LEFT) && (t->dir == RIGHT))) continue; + + Vector p1 = this->get_pos(); + Vector p2 = t->get_pos(); + + // skip if not on same height + float dy = (p1.y - p2.y); + if (fabsf(dy - 0) > 2) continue; + + // skip if too far away + float dx = (p1.x - p2.x); + if (fabsf(dx - 128) > 2) continue; + + physic.set_velocity_y(JUMP_ON_SPEED_Y); + p1.y -= 1; + this->set_pos(p1); + break; } } } @@ -140,46 +123,47 @@ Totem::active_update(float elapsed_time) } bool -Totem::collision_squished(Player& player) +Totem::collision_squished(GameObject& object) { if (carrying) carrying->jump_off(); if (carried_by) { - player.bounce(*this); + Player* player = dynamic_cast(&object); + if (player) player->bounce(*this); jump_off(); } sprite->set_action(dir == LEFT ? "squished-left" : "squished-right"); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - kill_squished(player); + kill_squished(object); 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 we hit something from above or below: stop moving in this direction + 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(); + initialize(); } - if ((hit.normal.x < -.8) && (dir == RIGHT)) { + if (hit.right && (dir == RIGHT)) { dir = LEFT; - activate(); + initialize(); } - - return CONTINUE; } HitResponse @@ -190,7 +174,7 @@ Totem::collision_badguy(BadGuy& badguy, const CollisionHit& hit) carried_by->collision_badguy(badguy, hit); return CONTINUE; } - + // if we hit a Totem that is not from our stack: have our base jump on its top Totem* totem = dynamic_cast(&badguy); if (totem) { @@ -203,13 +187,13 @@ 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(); + initialize(); } - if ((hit.normal.x < -.8) && (dir == RIGHT)) { + if(hit.right && (dir == RIGHT)) { dir = LEFT; - activate(); + initialize(); } return CONTINUE; @@ -224,20 +208,22 @@ Totem::kill_fall() BadGuy::kill_fall(); } -void +void Totem::jump_on(Totem* target) { if (target->carrying) { log_warning << "target is already carrying someone" << std::endl; return; } - + target->carrying = this; this->carried_by = target; - this->activate(); + this->initialize(); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - + + SoundManager::current()->play( LAND_ON_TOTEM_SOUND , get_pos()); + this->synchronize_with(target); } @@ -252,14 +238,13 @@ Totem::jump_off() { this->carried_by = 0; - this->activate(); + this->initialize(); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - physic.set_velocity_y(JUMP_OFF_SPEED_Y); } -void +void Totem::synchronize_with(Totem* base) { @@ -267,7 +252,7 @@ Totem::synchronize_with(Totem* base) dir = base->dir; sprite->set_action(dir == LEFT ? "stacked-left" : "stacked-right"); } - + Vector pos = base->get_pos(); pos.y -= sprite->get_current_hitbox_height(); set_pos(pos); @@ -276,6 +261,4 @@ Totem::synchronize_with(Totem* base) physic.set_velocity_y(base->physic.get_velocity_y()); } - -IMPLEMENT_FACTORY(Totem, "totem") - +/* EOF */