From 7cc0765c9acce1bbd4c0b2856c09114aa1bce737 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Sat, 6 Mar 2010 19:47:36 +0000 Subject: [PATCH] BombFish: Add an enemy that can be dropped by "Owl". SVN-Revision: 6564 --- .../images/creatures/bombfish/bombfish.sprite | 6 + src/badguy/bombfish.cpp | 132 ++++++++++++++++++ src/badguy/bombfish.hpp | 51 +++++++ src/supertux/object_factory.cpp | 2 + 4 files changed, 191 insertions(+) create mode 100644 data/images/creatures/bombfish/bombfish.sprite create mode 100644 src/badguy/bombfish.cpp create mode 100644 src/badguy/bombfish.hpp diff --git a/data/images/creatures/bombfish/bombfish.sprite b/data/images/creatures/bombfish/bombfish.sprite new file mode 100644 index 00000000000..5d1d3eef0c0 --- /dev/null +++ b/data/images/creatures/bombfish/bombfish.sprite @@ -0,0 +1,6 @@ +(supertux-sprite + (action + (name "default") + (hitbox 8 4 28 43) + (images "bombfish.png")) +) diff --git a/src/badguy/bombfish.cpp b/src/badguy/bombfish.cpp new file mode 100644 index 00000000000..58a15b2c641 --- /dev/null +++ b/src/badguy/bombfish.cpp @@ -0,0 +1,132 @@ +// SuperTux +// Copyright (C) 2010 Florian Forster +// +// 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, see . + +#include "badguy/bombfish.hpp" + +#include "supertux/constants.hpp" +#include "supertux/sector.hpp" +#include "object/player.hpp" +#include "object/explosion.hpp" + +BombFish::BombFish(const Reader& reader) : + BadGuy(reader, "images/creatures/bombfish/bombfish.sprite"), + is_grabbed(false) +{ +} + +BombFish::BombFish(const Vector& pos, Direction d) : + BadGuy(pos, d, "images/creatures/bombfish/bombfish.sprite"), + is_grabbed(false) +{ +} + +void +BombFish::collision_solid(const CollisionHit& hit) +{ + if (hit.bottom) { + explode (); + return; + } + + if (hit.left || hit.right) + physic.set_velocity_x (0.0); +} /* void collision_solid */ + +HitResponse +BombFish::collision_badguy(BadGuy&, const CollisionHit& hit) +{ + if (hit.bottom) { + explode (); + return (ABORT_MOVE); + } + + return (FORCE_MOVE); +} /* HitResponse collision_badguy */ + +void +BombFish::grab (MovingObject&, const Vector& pos, Direction dir) +{ + movement = pos - get_pos(); + this->dir = dir; + + is_grabbed = true; + + physic.set_velocity_x (movement.x * LOGICAL_FPS); + physic.set_velocity_y (0.0); + physic.set_acceleration_y (0.0); + physic.enable_gravity (false); + set_colgroup_active (COLGROUP_DISABLED); +} + +void +BombFish::ungrab (MovingObject& , Direction) +{ + is_grabbed = false; + + physic.set_velocity_y (0); + physic.set_acceleration_y (0); + physic.enable_gravity (true); + set_colgroup_active (COLGROUP_MOVING); +} + +HitResponse +BombFish::collision_player(Player&, const CollisionHit& hit) +{ + if (hit.bottom) { + explode (); + return (ABORT_MOVE); + } + + return FORCE_MOVE; +} /* HitResponse collision_player */ + +bool +BombFish::collision_squished (GameObject& obj) +{ + Player *player = dynamic_cast (&obj); + if (player) { + player->bounce (*this); + return (false); + } + + explode (); + return (false); +} /* bool collision_squished */ + +void +BombFish::active_update (float elapsed_time) +{ + if (!is_grabbed) + movement = physic.get_movement(elapsed_time); +} /* void active_update */ + +void +BombFish::explode (void) +{ + if (!is_valid ()) + return; + + Explosion *explosion = new Explosion (get_bbox ().get_middle ()); + + explosion->hurts (true); + explosion->pushes (false); + Sector::current()->add_object (explosion); + + remove_me (); +} /* void explode */ + +/* vim: set sw=2 sts=2 et fdm=marker : */ +/* EOF */ diff --git a/src/badguy/bombfish.hpp b/src/badguy/bombfish.hpp new file mode 100644 index 00000000000..b9a988b19ec --- /dev/null +++ b/src/badguy/bombfish.hpp @@ -0,0 +1,51 @@ +// SuperTux +// Copyright (C) 2010 Florian Forster +// +// 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, see . + +#ifndef HEADER_SUPERTUX_BADGUY_BOMBFISH_HPP +#define HEADER_SUPERTUX_BADGUY_BOMBFISH_HPP + +#include "badguy/badguy.hpp" +#include "object/portable.hpp" + +class BombFish : public BadGuy, public Portable +{ + private: + bool is_grabbed; + + public: + BombFish(const Reader& reader); + BombFish(const Vector& pos, Direction d); + + void collision_solid(const CollisionHit& hit); + HitResponse collision_badguy(BadGuy& badguy, const CollisionHit& hit); + + /* Inherited from Portable */ + void grab(MovingObject& object, const Vector& pos, Direction dir); + void ungrab(MovingObject& object, Direction dir); + + protected: + HitResponse collision_player(Player& player, const CollisionHit& hit); + bool collision_squished (GameObject& obj); + + void active_update (float elapsed_time); + + void explode (void); +}; + +#endif /* HEADER_SUPERTUX_BADGUY_BOMBFISH_HPP */ + +/* vim: set sw=2 sts=2 et fdm=marker : */ +/* EOF */ diff --git a/src/supertux/object_factory.cpp b/src/supertux/object_factory.cpp index f8cdc6c8c04..ebc98697c2c 100644 --- a/src/supertux/object_factory.cpp +++ b/src/supertux/object_factory.cpp @@ -26,6 +26,7 @@ #include "badguy/angrystone.hpp" #include "badguy/badguy.hpp" #include "badguy/bomb.hpp" +#include "badguy/bombfish.hpp" #include "badguy/bouncing_snowball.hpp" #include "badguy/captainsnowball.hpp" #include "badguy/crystallo.hpp" @@ -175,6 +176,7 @@ ObjectFactory::init_factories() { // badguys add_factory("angrystone"); + add_factory("bombfish"); add_factory("bouncingsnowball"); add_factory("captainsnowball"); add_factory("crystallo");