From: Florian Forster Date: Sun, 28 Feb 2010 09:32:24 +0000 (+0000) Subject: Haywire: Implemented a first version of the "crazy bomb". X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=08ce26c9f20283ff4a052ffec35aa80d891b625a;p=supertux.git Haywire: Implemented a first version of the "crazy bomb". Sprites and bode are based on Mr. Bomb, of course. Haywire behaves like Mr. Bomb until jumped upon. If jumped upon, he will run around (walk with twice the speed) for five seconds, then explode. While running around Haywire will iterate through a number of different colors. When jumped upon - even when already ticking - Haywire is stunned for half a second. This does not interrupt the explosion timer, though. SVN-Revision: 6443 --- diff --git a/data/images/creatures/haywire/haywire.sprite b/data/images/creatures/haywire/haywire.sprite new file mode 100644 index 000000000..14ec19791 --- /dev/null +++ b/data/images/creatures/haywire/haywire.sprite @@ -0,0 +1,43 @@ +(supertux-sprite + (action + (name "left") + (fps 10.0) + (hitbox 5 8 32 32) + (images "left-0.png" + "left-1.png" + "left-2.png" + "left-1.png")) + + (action + (name "right") + (fps 10.0) + (hitbox 5 8 32 32) + (mirror-action "left")) + + (action + (name "iced-left") + (hitbox 3 12 31.8 31.8) + (images "iced-left.png")) + + (action + (name "iced-right") + (hitbox 7 12 31.8 31.8) + (mirror-action "iced-left")) + + (action + (name "ticking-left") + (fps 10.0) + (hitbox 5 8 32 32) + (images "ticking-0.png" + "ticking-1.png" + "ticking-2.png" + "ticking-3.png" + "ticking-4.png" + "ticking-5.png")) + + (action + (name "ticking-right") + (fps 10.0) + (hitbox 5 8 32 32) + (mirror-action "ticking-left")) +) diff --git a/data/images/creatures/haywire/iced-left.png b/data/images/creatures/haywire/iced-left.png new file mode 100644 index 000000000..d6021baeb Binary files /dev/null and b/data/images/creatures/haywire/iced-left.png differ diff --git a/data/images/creatures/haywire/left-0.png b/data/images/creatures/haywire/left-0.png new file mode 100644 index 000000000..ca50a0167 Binary files /dev/null and b/data/images/creatures/haywire/left-0.png differ diff --git a/data/images/creatures/haywire/left-1.png b/data/images/creatures/haywire/left-1.png new file mode 100644 index 000000000..ee83bdc41 Binary files /dev/null and b/data/images/creatures/haywire/left-1.png differ diff --git a/data/images/creatures/haywire/left-2.png b/data/images/creatures/haywire/left-2.png new file mode 100644 index 000000000..47f4cbf23 Binary files /dev/null and b/data/images/creatures/haywire/left-2.png differ diff --git a/data/images/creatures/haywire/ticking-0.png b/data/images/creatures/haywire/ticking-0.png new file mode 100644 index 000000000..56cf415b0 Binary files /dev/null and b/data/images/creatures/haywire/ticking-0.png differ diff --git a/data/images/creatures/haywire/ticking-1.png b/data/images/creatures/haywire/ticking-1.png new file mode 100644 index 000000000..9e7912ad0 Binary files /dev/null and b/data/images/creatures/haywire/ticking-1.png differ diff --git a/data/images/creatures/haywire/ticking-2.png b/data/images/creatures/haywire/ticking-2.png new file mode 100644 index 000000000..e61c8f43f Binary files /dev/null and b/data/images/creatures/haywire/ticking-2.png differ diff --git a/data/images/creatures/haywire/ticking-3.png b/data/images/creatures/haywire/ticking-3.png new file mode 100644 index 000000000..bcbad9796 Binary files /dev/null and b/data/images/creatures/haywire/ticking-3.png differ diff --git a/data/images/creatures/haywire/ticking-4.png b/data/images/creatures/haywire/ticking-4.png new file mode 100644 index 000000000..a1215f9d3 Binary files /dev/null and b/data/images/creatures/haywire/ticking-4.png differ diff --git a/data/images/creatures/haywire/ticking-5.png b/data/images/creatures/haywire/ticking-5.png new file mode 100644 index 000000000..ec3abc99c Binary files /dev/null and b/data/images/creatures/haywire/ticking-5.png differ diff --git a/src/badguy/haywire.cpp b/src/badguy/haywire.cpp new file mode 100644 index 000000000..ebcf3f12d --- /dev/null +++ b/src/badguy/haywire.cpp @@ -0,0 +1,162 @@ +// SuperTux +// Copyright (C) 2006 Matthias Braun +// 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 "audio/sound_manager.hpp" +#include "badguy/bomb.hpp" +#include "badguy/haywire.hpp" +#include "object/explosion.hpp" +#include "object/player.hpp" +#include "sprite/sprite.hpp" +#include "sprite/sprite_manager.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "util/reader.hpp" + +#define TIME_EXPLOSION 5.0 +#define TIME_STUNNED 0.5 + +Haywire::Haywire(const Reader& reader) : + WalkingBadguy(reader, "images/creatures/haywire/haywire.sprite", "left", "right"), + is_exploding(false), + is_stunned(false) +{ + walk_speed = 80; + max_drop_height = 16; + + //Prevent stutter when Tux jumps on Mr Bomb + sound_manager->preload("sounds/explosion.wav"); + + //Check if we need another sprite + if( !reader.get( "sprite", sprite_name ) ){ + return; + } + if( sprite_name == "" ){ + sprite_name = "images/creatures/haywire/haywire.sprite"; + return; + } + //Replace sprite + sprite = sprite_manager->create( sprite_name ); +} + +/* Haywire created by a dispenser always gets default sprite atm.*/ +Haywire::Haywire(const Vector& pos, Direction d) : + WalkingBadguy(pos, d, "images/creatures/haywire/haywire.sprite", "left", "right"), + is_exploding(false), + is_stunned(false) +{ + walk_speed = 80; + max_drop_height = 16; + sound_manager->preload("sounds/explosion.wav"); +} + +HitResponse +Haywire::collision(GameObject& object, const CollisionHit& hit) +{ + return WalkingBadguy::collision(object, hit); +} + +HitResponse +Haywire::collision_player(Player& player, const CollisionHit& hit) +{ + return WalkingBadguy::collision_player(player, hit); +} + +bool +Haywire::collision_squished(GameObject& object) +{ + Player* player = dynamic_cast(&object); + if (player && player->is_invincible()) { + player->bounce (*this); + kill_fall(); + return true; + } + + if (is_stunned) { + player->bounce (*this); + return true; + } + + if (!is_exploding) { + set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1); + walk_left_action = "ticking-left"; + walk_right_action = "ticking-right"; + set_walk_speed (160); + time_until_explosion = TIME_EXPLOSION; + is_exploding = true; + } + + time_stunned = TIME_STUNNED; + is_stunned = true; + + player->bounce (*this); + return true; +} + +void +Haywire::active_update(float elapsed_time) +{ + if (is_exploding) { + if (elapsed_time >= time_until_explosion) { + kill_fall (); + return; + } + else + time_until_explosion -= elapsed_time; + } + + if (is_stunned) { + if (time_stunned > elapsed_time) { + time_stunned -= elapsed_time; + return; + } + else { /* if (time_stunned <= elapsed_time) */ + elapsed_time -= time_stunned; + time_stunned = 0.0; + is_stunned = false; + } + } + + WalkingBadguy::active_update(elapsed_time); +} + +void +Haywire::kill_fall() +{ + if(is_valid()) { + remove_me(); + Explosion* explosion = new Explosion(get_bbox().get_middle()); + Sector::current()->add_object(explosion); + } + + run_dead_script(); +} + +void +Haywire::freeze() +{ + WalkingBadguy::freeze(); + sprite->set_action(dir == LEFT ? "iced-left" : "iced-right"); +} + +bool +Haywire::is_freezable() const +{ + return true; +} + +/* vim: set sw=2 sts=2 et : */ +/* EOF */ diff --git a/src/badguy/haywire.hpp b/src/badguy/haywire.hpp new file mode 100644 index 000000000..7acb3cfe2 --- /dev/null +++ b/src/badguy/haywire.hpp @@ -0,0 +1,50 @@ +// SuperTux +// Copyright (C) 2006 Matthias Braun +// 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_HAYWIRE_HPP +#define HEADER_SUPERTUX_BADGUY_HAYWIRE_HPP + +#include "badguy/walking_badguy.hpp" + +class Haywire : public WalkingBadguy +{ +public: + Haywire(const Reader& reader); + Haywire(const Vector& pos, Direction d); + + void kill_fall(); + HitResponse collision(GameObject& object, const CollisionHit& hit); + HitResponse collision_player(Player& player, const CollisionHit& hit); + + void active_update(float elapsed_time); + + void freeze(); + bool is_freezable() const; + +protected: + bool collision_squished(GameObject& object); + +private: + bool is_exploding; + float time_until_explosion; + bool is_stunned; + float time_stunned; +}; + +#endif /* HEADER_SUPERTUX_BADGUY_HAYWIRE_HPP */ + +/* EOF */ diff --git a/src/supertux/object_factory.cpp b/src/supertux/object_factory.cpp index 669bdf49d..5ee076e93 100644 --- a/src/supertux/object_factory.cpp +++ b/src/supertux/object_factory.cpp @@ -36,6 +36,7 @@ #include "badguy/flame.hpp" #include "badguy/flyingsnowball.hpp" #include "badguy/ghosttree.hpp" +#include "badguy/haywire.hpp" #include "badguy/igel.hpp" #include "badguy/jumpy.hpp" #include "badguy/kamikazesnowball.hpp" @@ -182,6 +183,7 @@ ObjectFactory::init_factories() add_factory("flame"); add_factory("flyingsnowball"); add_factory("ghosttree"); + add_factory("haywire"); add_factory("igel"); add_factory("jumpy"); add_factory("kamikazesnowball");