X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Figel.cpp;h=382aff4c75b9dba906272ee8944ecf730c7d09f6;hb=12a28b64dcce9c7ff706451b4f3aecd201cc8a5f;hp=f43aea297410f20516ef8dd2324e4ce4604308fb;hpb=e7042da286e68756298cc205910b35c1da551167;p=supertux.git diff --git a/src/badguy/igel.cpp b/src/badguy/igel.cpp index f43aea297..382aff4c7 100644 --- a/src/badguy/igel.cpp +++ b/src/badguy/igel.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux - Badguy "Igel" // 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 @@ -14,48 +12,42 @@ // 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. - -#include +// along with this program. If not, see . -#include "igel.hpp" -#include "object/block.hpp" -#include "sector.hpp" +#include "badguy/igel.hpp" #include "object/bullet.hpp" +#include "supertux/sector.hpp" + +#include "supertux/object_factory.hpp" namespace { - const float WALKSPEED = 80; /**< speed at which we walk around */ - const float TURN_RECOVER_TIME = 0.5; /**< seconds before we will again turn around when shot at */ - const float RANGE_OF_VISION = 256; /**< range in px at which we can see bullets */ -} -Igel::Igel(const lisp::Lisp& reader) - : WalkingBadguy(reader, "images/creatures/igel/igel.sprite", "walking-left", "walking-right") -{ - walk_speed = WALKSPEED; - max_drop_height = 0; -} +const float WALKSPEED = 80; /**< speed at which we walk around */ +const float TURN_RECOVER_TIME = 0.5; /**< seconds before we will again turn around when shot at */ +const float RANGE_OF_VISION = 256; /**< range in px at which we can see bullets */ -Igel::Igel(const Vector& pos, Direction d) - : WalkingBadguy(pos, d, "images/creatures/igel/igel.sprite", "walking-left", "walking-right") +} // namespace + +Igel::Igel(const Reader& reader) : + WalkingBadguy(reader, "images/creatures/igel/igel.sprite", "walking-left", "walking-right"), + turn_recover_timer() { walk_speed = WALKSPEED; - max_drop_height = 0; + max_drop_height = 16; } -void -Igel::write(lisp::Writer& writer) +Igel::Igel(const Vector& pos, Direction d) : + WalkingBadguy(pos, d, "images/creatures/igel/igel.sprite", "walking-left", "walking-right"), + turn_recover_timer() { - writer.start_list("igel"); - WalkingBadguy::write(writer); - writer.end_list("igel"); + walk_speed = WALKSPEED; + max_drop_height = 16; } void Igel::be_normal() { - activate(); + initialize(); } void @@ -71,12 +63,12 @@ Igel::can_see(const MovingObject& o) Rect mb = get_bbox(); Rect ob = o.get_bbox(); - bool inReach_left = (ob.p2.x >= mb.p1.x-((dir == LEFT) ? RANGE_OF_VISION : 0)); - bool inReach_right = (ob.p1.x <= mb.p2.x+((dir == RIGHT) ? RANGE_OF_VISION : 0)); + bool inReach_left = ((ob.p2.x < mb.p1.x) && (ob.p2.x >= mb.p1.x-((dir == LEFT) ? RANGE_OF_VISION : 0))); + bool inReach_right = ((ob.p1.x > mb.p2.x) && (ob.p1.x <= mb.p2.x+((dir == RIGHT) ? RANGE_OF_VISION : 0))); bool inReach_top = (ob.p2.y >= mb.p1.y); bool inReach_bottom = (ob.p1.y <= mb.p2.y); - return (inReach_left && inReach_right && inReach_top && inReach_bottom); + return ((inReach_left || inReach_right) && inReach_top && inReach_bottom); } void @@ -84,11 +76,12 @@ Igel::active_update(float elapsed_time) { bool wants_to_flee = false; - // check if we see a bullet + // check if we see a fire bullet Sector* sector = Sector::current(); for (Sector::GameObjects::iterator i = sector->gameobjects.begin(); i != sector->gameobjects.end(); ++i) { Bullet* bullet = dynamic_cast(*i); if (!bullet) continue; + if (bullet->get_type() != FIRE_BONUS) continue; if (can_see(*bullet)) wants_to_flee = true; } @@ -98,7 +91,7 @@ Igel::active_update(float elapsed_time) BadGuy::active_update(elapsed_time); return; } - + // else adhere to default behaviour WalkingBadguy::active_update(elapsed_time); } @@ -106,24 +99,23 @@ Igel::active_update(float elapsed_time) HitResponse Igel::collision_bullet(Bullet& bullet, const CollisionHit& hit) { - //remove bullet - bullet.remove_me(); - - // die if hit on front side + // default reaction if hit on front side if (((dir == LEFT) && hit.left) || ((dir == RIGHT) && hit.right)) { - kill_fall(); - return ABORT_MOVE; + return BadGuy::collision_bullet(bullet, hit); } - // else ignore bullet + // else make bullet ricochet and ignore the hit + bullet.ricochet(*this, hit); return FORCE_MOVE; } bool -Igel::collision_squished(Player& ) +Igel::collision_squished(GameObject& ) { // this will hurt return false; } -IMPLEMENT_FACTORY(Igel, "igel") +IMPLEMENT_FACTORY(Igel, "igel"); + +/* EOF */