Skip to content

Commit

Permalink
Powerup: Iceflower improvements
Browse files Browse the repository at this point in the history
Generalized code for changing frozen badguy sprite to iced, and added a default behavior for freezable badguys without iced graphics.  Frozen badguys no longer unfreeze on touch.  Added ice vulnerability to forest badguys.
Note: there are some mild bugs as a result of this change, which should be fixed in subsequent improvements to make Iceflower a more viable powerup.
  • Loading branch information
LMH0013 committed Jun 14, 2014
1 parent fce78e7 commit 4bbf74b
Show file tree
Hide file tree
Showing 37 changed files with 284 additions and 41 deletions.
6 changes: 3 additions & 3 deletions data/images/creatures/jumpy/jumpy.sprite
Expand Up @@ -31,13 +31,13 @@
(mirror-action "left-middle"))

(action
(name "left-iced")
(name "iced-left")
(hitbox 7 8 31.8 31.8)
(images "iced-left-up.png"))

(action
(name "right-iced")
(name "iced-right")
(hitbox 7 8 31.8 31.8)
(mirror-action "left-iced"))
(mirror-action "iced-left"))
)

6 changes: 3 additions & 3 deletions data/images/creatures/snowjumpy/snowjumpy.sprite
Expand Up @@ -31,13 +31,13 @@
(mirror-action "left-middle"))

(action
(name "left-iced")
(name "iced-left")
(hitbox 7 8 31.8 31.8)
(images "iced-left-up.png"))

(action
(name "right-iced")
(name "iced-right")
(hitbox 7 8 31.8 31.8)
(mirror-action "left-iced"))
(mirror-action "iced-left"))
)

23 changes: 22 additions & 1 deletion src/badguy/badguy.cpp
Expand Up @@ -219,6 +219,8 @@ void
BadGuy::active_update(float elapsed_time)
{
movement = physic.get_movement(elapsed_time);
if(frozen)
sprite->stop_animation();
}

void
Expand Down Expand Up @@ -302,8 +304,11 @@ BadGuy::collision_player(Player& player, const CollisionHit& )
return ABORT_MOVE;
}

//TODO: unfreeze timer
if(frozen)
unfreeze();
//unfreeze();
return FORCE_MOVE;

player.kill(false);
return FORCE_MOVE;
}
Expand Down Expand Up @@ -548,13 +553,29 @@ BadGuy::freeze()
{
set_group(COLGROUP_MOVING_STATIC);
frozen = true;

if(sprite->has_action("iced-left"))
sprite->set_action(dir == LEFT ? "iced-left" : "iced-right", 1);
// when no iced action exists, default to shading badguy blue
else
{
sprite->set_color(Color(0.60, 0.72, 0.88f));
sprite->stop_animation();
}
}

void
BadGuy::unfreeze()
{
set_group(colgroup_active);
frozen = false;

// restore original color if needed
if(!sprite->has_action("iced-left"))
{
sprite->set_color(Color(1.00, 1.00, 1.00f));
sprite->set_animation_loops();
}
}

bool
Expand Down
1 change: 1 addition & 0 deletions src/badguy/fish.cpp
Expand Up @@ -138,6 +138,7 @@ Fish::freeze()
{
BadGuy::freeze();
sprite->set_action(physic.get_velocity_y() < 0 ? "iced" : "iced-down");
sprite->set_color(Color(1.0f, 1.0f, 1.0f));
waiting.stop();
}

Expand Down
1 change: 0 additions & 1 deletion src/badguy/goldbomb.cpp
Expand Up @@ -221,7 +221,6 @@ GoldBomb::freeze()
{
if(tstate == STATE_NORMAL){
WalkingBadguy::freeze();
sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
}
}

Expand Down
7 changes: 0 additions & 7 deletions src/badguy/haywire.cpp
Expand Up @@ -178,13 +178,6 @@ Haywire::kill_fall()
run_dead_script();
}

void
Haywire::freeze()
{
WalkingBadguy::freeze();
sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
}

bool
Haywire::is_freezable() const
{
Expand Down
1 change: 0 additions & 1 deletion src/badguy/haywire.hpp
Expand Up @@ -33,7 +33,6 @@ class Haywire : public WalkingBadguy

void active_update(float elapsed_time);

void freeze();
bool is_freezable() const;

protected:
Expand Down
11 changes: 9 additions & 2 deletions src/badguy/igel.cpp
Expand Up @@ -99,8 +99,9 @@ Igel::active_update(float elapsed_time)
HitResponse
Igel::collision_bullet(Bullet& bullet, const CollisionHit& hit)
{
// default reaction if hit on front side
if (((dir == LEFT) && hit.left) || ((dir == RIGHT) && hit.right)) {
// default reaction if hit on front side or for freeze and unfreeze
if (((dir == LEFT) && hit.left) || ((dir == RIGHT) && hit.right) ||
(bullet.get_type() == ICE_BONUS) || ((bullet.get_type() == FIRE_BONUS) && (frozen))) {
return BadGuy::collision_bullet(bullet, hit);
}

Expand All @@ -109,6 +110,12 @@ Igel::collision_bullet(Bullet& bullet, const CollisionHit& hit)
return FORCE_MOVE;
}

bool
Igel::is_freezable() const
{
return true;
}

bool
Igel::collision_squished(GameObject& )
{
Expand Down
2 changes: 2 additions & 0 deletions src/badguy/igel.hpp
Expand Up @@ -32,6 +32,8 @@ class Igel : public WalkingBadguy

void active_update(float elapsed_time);

bool is_freezable() const;

protected:
bool collision_squished(GameObject& object);
void be_normal(); /**< switch to state STATE_NORMAL */
Expand Down
1 change: 0 additions & 1 deletion src/badguy/jumpy.cpp
Expand Up @@ -99,7 +99,6 @@ Jumpy::freeze()
{
BadGuy::freeze();
physic.set_velocity_y(std::max(0.0f, physic.get_velocity_y()));
sprite->set_action(dir == LEFT ? "left-iced" : "right-iced");
}

bool
Expand Down
15 changes: 15 additions & 0 deletions src/badguy/mole.cpp
Expand Up @@ -76,6 +76,9 @@ Mole::collision_badguy(BadGuy& , const CollisionHit& )
bool
Mole::collision_squished(GameObject& )
{
if (frozen)
return true;

set_state(DEAD);
sound_manager->play("sounds/squish.wav", get_pos());
run_dead_script();
Expand All @@ -101,6 +104,9 @@ Mole::active_update(float elapsed_time)
{
BadGuy::active_update(elapsed_time);

if (frozen)
return;

switch (state) {
case PRE_THROWING:
if (timer.check()) {
Expand Down Expand Up @@ -132,9 +138,18 @@ Mole::active_update(float elapsed_time)

}

bool
Mole::is_freezable() const
{
return true;
}

void
Mole::set_state(MoleState new_state)
{
if (frozen)
return;

switch (new_state) {
case PRE_THROWING:
sprite->set_action("idle");
Expand Down
2 changes: 2 additions & 0 deletions src/badguy/mole.hpp
Expand Up @@ -32,6 +32,8 @@ class Mole : public BadGuy
void activate();
void active_update(float);

bool is_freezable() const;

private:
enum MoleState {
PRE_THROWING,
Expand Down
7 changes: 0 additions & 7 deletions src/badguy/mrbomb.cpp
Expand Up @@ -131,13 +131,6 @@ MrBomb::ungrab(MovingObject& , Direction dir)
grabbed = false;
}

void
MrBomb::freeze()
{
WalkingBadguy::freeze();
sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
}

bool
MrBomb::is_freezable() const
{
Expand Down
1 change: 0 additions & 1 deletion src/badguy/mrbomb.hpp
Expand Up @@ -36,7 +36,6 @@ class MrBomb : public WalkingBadguy,
void ungrab(MovingObject& object, Direction dir);
bool is_portable() const;

void freeze();
bool is_freezable() const;

protected:
Expand Down
6 changes: 6 additions & 0 deletions src/badguy/mrtree.cpp
Expand Up @@ -41,6 +41,12 @@ MrTree::MrTree(const Reader& reader)
sound_manager->preload("sounds/mr_tree.ogg");
}

bool
MrTree::is_freezable() const
{
return true;
}

bool
MrTree::collision_squished(GameObject& object)
{
Expand Down
2 changes: 2 additions & 0 deletions src/badguy/mrtree.hpp
Expand Up @@ -24,6 +24,8 @@ class MrTree : public WalkingBadguy
public:
MrTree(const Reader& reader);

bool is_freezable() const;

protected:
bool collision_squished(GameObject& object);

Expand Down
34 changes: 34 additions & 0 deletions src/badguy/owl.cpp
Expand Up @@ -99,6 +99,9 @@ Owl::active_update (float elapsed_time)
{
BadGuy::active_update (elapsed_time);

if(frozen)
return;

if (carried_object != NULL) {
if (!is_above_player ()) {
Vector obj_pos = get_anchor_pos (bbox, ANCHOR_BOTTOM);
Expand Down Expand Up @@ -155,9 +158,40 @@ Owl::kill_fall()
run_dead_script();
}

void
Owl::freeze()
{
if (carried_object != NULL) {
carried_object->ungrab (*this, dir);
carried_object = NULL;
}
physic.enable_gravity(true);
BadGuy::freeze();
}

void
Owl::unfreeze()
{
BadGuy::unfreeze();
physic.set_velocity_x(dir == LEFT ? -FLYING_SPEED : FLYING_SPEED);
physic.enable_gravity(false);
sprite->set_action(dir == LEFT ? "left" : "right");
}

bool
Owl::is_freezable() const
{
return true;
}

void
Owl::collision_solid(const CollisionHit& hit)
{
if(frozen)
{
BadGuy::collision_solid(hit);
return;
}
if(hit.top || hit.bottom) {
physic.set_velocity_y(0);
} else if(hit.left || hit.right) {
Expand Down
4 changes: 4 additions & 0 deletions src/badguy/owl.hpp
Expand Up @@ -31,6 +31,10 @@ class Owl : public BadGuy
void collision_solid(const CollisionHit& hit);
void kill_fall();

void freeze();
void unfreeze();
bool is_freezable() const;

protected:
bool is_above_player (void);
void active_update (float elapsed_time);
Expand Down
6 changes: 6 additions & 0 deletions src/badguy/poisonivy.cpp
Expand Up @@ -34,6 +34,12 @@ PoisonIvy::PoisonIvy(const Vector& pos, Direction d)
walk_speed = 80;
}

bool
PoisonIvy::is_freezable() const
{
return true;
}

bool
PoisonIvy::collision_squished(GameObject& object)
{
Expand Down
2 changes: 2 additions & 0 deletions src/badguy/poisonivy.hpp
Expand Up @@ -25,6 +25,8 @@ class PoisonIvy : public WalkingBadguy
PoisonIvy(const Reader& reader);
PoisonIvy(const Vector& pos, Direction d);

bool is_freezable() const;

protected:
bool collision_squished(GameObject& object);

Expand Down
26 changes: 26 additions & 0 deletions src/badguy/skullyhop.cpp
Expand Up @@ -80,6 +80,9 @@ const float VERTICAL_SPEED = -450; /**< y-speed when jumping */
bool
SkullyHop::collision_squished(GameObject& object)
{
if (frozen)
return BadGuy::collision_squished(object);

sprite->set_action(dir == LEFT ? "squished-left" : "squished-right");
kill_squished(object);
return true;
Expand All @@ -88,6 +91,12 @@ SkullyHop::collision_squished(GameObject& object)
void
SkullyHop::collision_solid(const CollisionHit& hit)
{
if (frozen)
{
BadGuy::collision_solid(hit);
return;
}

// just default behaviour (i.e. stop at floor/walls) when squished
if (BadGuy::get_state() == STATE_SQUISHED) {
BadGuy::collision_solid(hit);
Expand Down Expand Up @@ -128,6 +137,10 @@ SkullyHop::active_update(float elapsed_time)
{
BadGuy::active_update(elapsed_time);

// no change if frozen
if (frozen)
return;

// charge when fully recovered
if ((state == STANDING) && (recover_timer.check())) {
set_state(CHARGING);
Expand All @@ -141,4 +154,17 @@ SkullyHop::active_update(float elapsed_time)
}
}

void
SkullyHop::unfreeze()
{
BadGuy::unfreeze();
initialize();
}

bool
SkullyHop::is_freezable() const
{
return true;
}

/* EOF */

0 comments on commit 4bbf74b

Please sign in to comment.