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 authored and maxteufel committed Oct 23, 2016
1 parent cac6b26 commit e917d3e
Show file tree
Hide file tree
Showing 11 changed files with 277 additions and 3 deletions.
1 change: 1 addition & 0 deletions data/AUTHORS
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/
* hanging_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
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 e917d3e

Please sign in to comment.