Skip to content

Commit

Permalink
New badguy: HangingBall
Browse files Browse the repository at this point in the history
It's a forest equivalent of stalactite.
  • Loading branch information
Hume2 committed Oct 23, 2016
1 parent cac6b26 commit fdbced1
Show file tree
Hide file tree
Showing 16 changed files with 278 additions and 105 deletions.
3 changes: 2 additions & 1 deletion data/AUTHORS
Expand Up @@ -35,7 +35,7 @@ All files in data/music created by wansti and licensed under GPLv2+CC-by-sa, unl
* ghostforest.ogg
* ghostforest2.ogg
* greatgigantic.ogg - Based on a work by Chris Huelsbeck - We have his permission to release this under GPL.
* halloween_1.ogg - By Forty-Two - licensed under CC-BY-SA 4.0
* halloween_1.ogg - By Forty-Two - licensed under CC-BY-SA 4.0
* intro.ogg
* invincible.ogg
* leveldone.ogg
Expand Down Expand Up @@ -77,6 +77,7 @@ These are just more code.
* flip.wav - replaced by wansti "new backflip sound (not perfect but much better than the old one)"
* grow.ogg - self-made by wansti, replaced grow.wav
* gulp.wav - CC0, source http://freesound.org/people/Q.K./sounds/56271/
* hangning_ball.wav - CC0, source https://freesound.org/people/kvgarlic/sounds/184547/
* hop.ogg - self-made by WolfgangB GPLv2+CC-by-sa
* hurt.wav - self-made by MatzeB
* iceblock_bump.wav - replaced with a self-made sound by Some_Person
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions data/images/creatures/stalactite/hangingball.sprite
@@ -0,0 +1,13 @@
(supertux-sprite
(action
(name "normal")
(hitbox 4 4 28 45)
(images "hangingball-hanging.png"))
(action
(name "squished")
(hitbox 12 -9 28 32)
(images "hangingball-cracked.png"))
(action
(name "iced")
(hitbox 4 4 28 45)
(images "hangingball-frozen.png")))
3 changes: 3 additions & 0 deletions data/images/engine/editor/objects.stoi
Expand Up @@ -149,6 +149,9 @@
(object
(class "stalactite")
(icon "images/creatures/stalactite/falling.png"))
(object
(class "hangingball")
(icon "images/creatures/stalactite/hangingball-hanging.png"))
(object
(class "yeti_stalactite")
(icon "images/engine/editor/stalactite_yeti.png"))
Expand Down
Binary file removed data/images/engine/icons/supertux.icns
Binary file not shown.
Binary file removed data/images/engine/icons/supertux.ico
Binary file not shown.
Binary file removed data/images/engine/icons/supertux.png
Binary file not shown.
1 change: 0 additions & 1 deletion data/images/engine/icons/supertux.rc

This file was deleted.

100 changes: 0 additions & 100 deletions data/images/engine/icons/supertux.xpm

This file was deleted.

142 changes: 142 additions & 0 deletions data/levels/test/stalactite.stl

Large diffs are not rendered by default.

Binary file added data/sounds/hanging_ball.wav
Binary file not shown.
94 changes: 91 additions & 3 deletions src/badguy/stalactite.cpp
Expand Up @@ -21,6 +21,7 @@
#include "object/bullet.hpp"
#include "object/player.hpp"
#include "sprite/sprite.hpp"
#include "sprite/sprite_manager.hpp"
#include "supertux/object_factory.hpp"
#include "supertux/sector.hpp"

Expand All @@ -36,7 +37,7 @@ Stalactite::Stalactite(const ReaderMapping& lisp) :
{
countMe = false;
set_colgroup_active(COLGROUP_TOUCHABLE);
SoundManager::current()->preload("sounds/cracking.wav");
SoundManager::current()->preload(get_cracking_sound_path());
SoundManager::current()->preload("sounds/sizzle.ogg");
SoundManager::current()->preload("sounds/icecrash.ogg");
}
Expand All @@ -54,7 +55,7 @@ Stalactite::active_update(float elapsed_time)
&& Sector::current()->can_see_player(bbox.get_middle())) {
timer.start(SHAKE_TIME);
state = STALACTITE_SHAKING;
SoundManager::current()->play("sounds/cracking.wav", get_pos());
SoundManager::current()->play(get_cracking_sound_path(), get_pos());
}
}
} else if(state == STALACTITE_SHAKING) {
Expand Down Expand Up @@ -132,7 +133,7 @@ Stalactite::collision_bullet(Bullet& bullet, const CollisionHit& )
bullet.remove_me();
if(bullet.get_type() == FIRE_BONUS)
SoundManager::current()->play("sounds/sizzle.ogg", get_pos());
SoundManager::current()->play("sounds/cracking.wav", get_pos());
SoundManager::current()->play(get_cracking_sound_path(), get_pos());
}

return FORCE_MOVE;
Expand Down Expand Up @@ -165,4 +166,91 @@ Stalactite::deactivate()
remove_me();
}

std::string
Stalactite::get_cracking_sound_path() const
{
return "sounds/cracking.wav";
}

HangingBall::HangingBall(const ReaderMapping& reader) :
Stalactite(reader)
{
sprite = SpriteManager::current()->create("images/creatures/stalactite/hangingball.sprite");
SoundManager::current()->preload("sounds/fire.ogg");
}

void
HangingBall::active_update(float elapsed_time)
{
if(state == STALACTITE_HANGING && frozen) {
return;
}
Stalactite::active_update(elapsed_time);
}

bool
HangingBall::is_freezable() const
{
return state == STALACTITE_HANGING;
}

void
HangingBall::unfreeze() {
BadGuy::unfreeze();
sprite->set_action("normal");
}

HitResponse
HangingBall::collision_bullet(Bullet& bullet, const CollisionHit& hit)
{
if(state == STALACTITE_HANGING) {
if(bullet.get_type() == FIRE_BONUS && !frozen) {
timer.start(SHAKE_TIME);
state = STALACTITE_SHAKING;
bullet.remove_me();
SoundManager::current()->play("sounds/fire.ogg", get_pos());
SoundManager::current()->play(get_cracking_sound_path(), get_pos());
return FORCE_MOVE;
} else {
return BadGuy::collision_bullet(bullet, hit);
}
} else {
return FORCE_MOVE;
}
}

HitResponse
HangingBall::collision_player(Player& player, const CollisionHit& hit)
{
if (frozen) {
return BadGuy::collision_player(player, hit);
} else {
return Stalactite::collision_player(player, hit);
}
}

HitResponse
HangingBall::collision_badguy(BadGuy& other, const CollisionHit& hit)
{
if (frozen) {
return BadGuy::collision_badguy(other, hit);
} else {
if (state == STALACTITE_SQUISHED) return FORCE_MOVE;

// ignore other Stalactites
if (dynamic_cast<Stalactite*>(&other)) return FORCE_MOVE;

if (state != STALACTITE_FALLING) return BadGuy::collision_badguy(other, hit);
other.kill_fall();

return FORCE_MOVE;
}
}

std::string
HangingBall::get_cracking_sound_path() const
{
return "sounds/hanging_ball.wav";
}

/* EOF */
26 changes: 26 additions & 0 deletions src/badguy/stalactite.hpp
Expand Up @@ -50,12 +50,38 @@ class Stalactite : public BadGuy
STALACTITE_SQUISHED
};

virtual std::string get_cracking_sound_path() const;

protected:
Timer timer;
StalactiteState state;
Vector shake_delta;
};

class HangingBall : public Stalactite
{
public:
HangingBall(const ReaderMapping& reader);

void active_update(float elapsed_time);
void unfreeze();
HitResponse collision_bullet(Bullet& bullet, const CollisionHit& hit);
HitResponse collision_player(Player& player, const CollisionHit& hit);
HitResponse collision_badguy(BadGuy& other, const CollisionHit& hit);

bool is_freezable() const;

std::string get_class() const {
return "hangingball";
}
std::string get_display_name() const {
return _("Hanging ball");
}

protected:
virtual std::string get_cracking_sound_path() const;
};

#endif

/* EOF */
1 change: 1 addition & 0 deletions src/supertux/object_factory.cpp
Expand Up @@ -202,6 +202,7 @@ ObjectFactory::init_factories()
add_factory<Ghostflame>("ghostflame");
add_factory<GhostTree>("ghosttree");
add_factory<GoldBomb>("goldbomb");
add_factory<HangingBall>("hangingball");
add_factory<Haywire>("haywire");
add_factory<Iceflame>("iceflame");
add_factory<Igel>("igel");
Expand Down

0 comments on commit fdbced1

Please sign in to comment.