Skip to content

Commit

Permalink
BombFish: Add an enemy that can be dropped by "Owl".
Browse files Browse the repository at this point in the history
SVN-Revision: 6564
  • Loading branch information
Florian Forster committed Mar 6, 2010
1 parent 7e479e6 commit 7cc0765
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 0 deletions.
6 changes: 6 additions & 0 deletions data/images/creatures/bombfish/bombfish.sprite
@@ -0,0 +1,6 @@
(supertux-sprite
(action
(name "default")
(hitbox 8 4 28 43)
(images "bombfish.png"))
)
132 changes: 132 additions & 0 deletions src/badguy/bombfish.cpp
@@ -0,0 +1,132 @@
// SuperTux
// Copyright (C) 2010 Florian Forster <supertux at octo.it>
//
// 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 <http://www.gnu.org/licenses/>.

#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<Player *> (&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 */
51 changes: 51 additions & 0 deletions src/badguy/bombfish.hpp
@@ -0,0 +1,51 @@
// SuperTux
// Copyright (C) 2010 Florian Forster <supertux at octo.it>
//
// 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 <http://www.gnu.org/licenses/>.

#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 */
2 changes: 2 additions & 0 deletions src/supertux/object_factory.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -175,6 +176,7 @@ ObjectFactory::init_factories()
{
// badguys
add_factory<AngryStone>("angrystone");
add_factory<BombFish>("bombfish");
add_factory<BouncingSnowball>("bouncingsnowball");
add_factory<CaptainSnowball>("captainsnowball");
add_factory<Crystallo>("crystallo");
Expand Down

0 comments on commit 7cc0765

Please sign in to comment.