X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.cpp;h=d993c0fc40c7c02894621066ce7d0eb3c6a0daf4;hb=fc73efa7ff699fe3c9c237845b6f4fda0d999862;hp=7da606bead76b8dc368f854054959e1070367e08;hpb=209464e1ecefabfaa671c063195bad8b0bdf6d8f;p=supertux.git diff --git a/src/badguy/badguy.cpp b/src/badguy/badguy.cpp index 7da606bea..d993c0fc4 100644 --- a/src/badguy/badguy.cpp +++ b/src/badguy/badguy.cpp @@ -1,7 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2005 Matthias Braun +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -12,11 +12,11 @@ // 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. +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include #include "badguy.hpp" @@ -24,6 +24,8 @@ #include "object/tilemap.hpp" #include "tile.hpp" #include "statistics.hpp" +#include "game_session.hpp" +#include "log.hpp" static const float SQUISH_TIME = 2; static const float X_OFFSCREEN_DISTANCE = 1600; @@ -103,7 +105,7 @@ BadGuy::deactivate() void BadGuy::save(lisp::Writer& ) { - std::cout << "Warning: tried to write out a generic badguy." << std::endl; + log_warning << "tried to write out a generic badguy" << std::endl; } void @@ -169,15 +171,24 @@ BadGuy::collision_player(Player& player, const CollisionHit& ) kill_fall(); return ABORT_MOVE; } + + /* + printf("PlayerHit: GT %3.1f PM: %3.1f %3.1f BM: %3.1f %3.1f Hit: %3.1f %3.1f\n", + game_time, + player.get_movement().x, player.get_movement().y, + get_movement().x, get_movement().y, + hit.normal.x, hit.normal.y); + */ + // hit from above? - if(player.get_movement().y - get_movement().y > 0 && player.get_bbox().p2.y < + if(player.get_movement().y /*- get_movement().y*/ > 0 + && player.get_bbox().p2.y < (get_bbox().p1.y + get_bbox().p2.y) / 2) { // if it's not possible to squish us, then this will hurt - if(!collision_squished(player)) - player.kill(Player::SHRINK); - - return FORCE_MOVE; + if(collision_squished(player)) + return ABORT_MOVE; } + player.kill(Player::SHRINK); return FORCE_MOVE; } @@ -310,10 +321,14 @@ bool BadGuy::may_fall_off_platform() { int tile_x, tile_y; - // First, let's say the badguy moves once its width in the - // direction it's heading. - Vector pos = get_pos(); - pos.x += (dir == LEFT ? -bbox.get_width() : bbox.get_width()); + // First, let's say the badguy moves 32 units in the + // direction it's heading, so do some voodoo maths magic + // to determine its future position. + Vector pos; + if (dir == LEFT) + pos = Vector(bbox.p1.x - 32.f, bbox.p2.y); + else + pos = Vector(bbox.p2.x, bbox.p2.y); // Now, snap the badguy's X coordinate to the 32x32/cell grid. if (dir == LEFT) // use the ceiling @@ -325,8 +340,14 @@ BadGuy::may_fall_off_platform() // get the lower position. (Positive Y goes downward.) tile_y = (int)ceilf(pos.y/32.0f); +#if defined(DEBUG_STAY_ON_PLATFORM) + // Draw! + GameSession::current()->context->draw_filled_rect(Vector(tile_x*32.0f, tile_y*32.0f), Vector(32.f, 32.f), Color(1.f, 0.f, 0.f), 999); +#endif + // Now, if the badguy intersects with a tile, he won't fall off. // If he doesn't intersect, he probably will. + // Note that the tile's Y coordinate is offset by +1 from the object's Y. if (Sector::current()->solids->get_tile(tile_x, tile_y)->getAttributes() & FLAG_SOLID) { // It's a solid tile. Good. @@ -336,3 +357,17 @@ BadGuy::may_fall_off_platform() // Watch out there buddy, you might take a sticky end! return true; } + +Player* +BadGuy::get_nearest_player() +{ + // FIXME: does not really return nearest player + + std::vector players = Sector::current()->get_players(); + for (std::vector::iterator playerIter = players.begin(); playerIter != players.end(); ++playerIter) { + Player* player = *playerIter; + return player; + } + + return 0; +}