X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fmriceblock.cpp;h=4e1b1745aa206d614ec85f896a63e4141fe68a07;hb=40e6e7cdc59c09befbd2595aea0c6e10428315d4;hp=e0bdbf66ba5bce6a0597d266e6e414ec7df32525;hpb=ef57479f613b900b73eba8e8f4d026aae0de25cc;p=supertux.git diff --git a/src/badguy/mriceblock.cpp b/src/badguy/mriceblock.cpp index e0bdbf66b..4e1b1745a 100644 --- a/src/badguy/mriceblock.cpp +++ b/src/badguy/mriceblock.cpp @@ -1,6 +1,7 @@ #include #include "mriceblock.h" +#include "object/block.h" static const float WALKSPEED = 80; static const float KICKSPEED = 500; @@ -32,8 +33,8 @@ MrIceBlock::write(lisp::Writer& writer) { writer.start_list("mriceblock"); - writer.write_float("x", get_pos().x); - writer.write_float("y", get_pos().y); + writer.write_float("x", start_position.x); + writer.write_float("y", start_position.y); writer.end_list("mriceblock"); } @@ -59,7 +60,7 @@ MrIceBlock::active_action(float elapsed_time) } HitResponse -MrIceBlock::collision_solid(GameObject& , const CollisionHit& hit) +MrIceBlock::collision_solid(GameObject& object, const CollisionHit& hit) { if(fabsf(hit.normal.y) > .5) { // floor or roof physic.set_velocity_y(0); @@ -72,13 +73,23 @@ MrIceBlock::collision_solid(GameObject& , const CollisionHit& hit) sprite->set_action(dir == LEFT ? "left" : "right"); physic.set_velocity_x(-physic.get_velocity_x()); break; - case ICESTATE_KICKED: + case ICESTATE_KICKED: { + BonusBlock* bonusblock = dynamic_cast (&object); + if(bonusblock) { + bonusblock->try_open(); + } + Brick* brick = dynamic_cast (&object); + if(brick) { + brick->try_break(); + } + dir = dir == LEFT ? RIGHT : LEFT; sprite->set_action(dir == LEFT ? "flat-left" : "flat-right"); physic.set_velocity_x(-physic.get_velocity_x()); SoundManager::get()->play_sound(IDToSound(SND_RICOCHET), get_pos(), Sector::current()->player->get_pos()); break; + } case ICESTATE_FLAT: physic.set_velocity_x(0); break; @@ -87,6 +98,29 @@ MrIceBlock::collision_solid(GameObject& , const CollisionHit& hit) return CONTINUE; } +HitResponse +MrIceBlock::collision_badguy(BadGuy& badguy, const CollisionHit& hit) +{ + switch(ice_state) { + case ICESTATE_NORMAL: + if(fabsf(hit.normal.x) > .8) { + dir = dir == LEFT ? RIGHT : LEFT; + sprite->set_action(dir == LEFT ? "left" : "right"); + physic.set_velocity_x(-physic.get_velocity_x()); + } + return CONTINUE; + case ICESTATE_FLAT: + return FORCE_MOVE; + case ICESTATE_KICKED: + badguy.kill_fall(); + return FORCE_MOVE; + default: + assert(false); + } + + return ABORT_MOVE; +} + bool MrIceBlock::collision_squished(Player& player) { @@ -131,3 +165,4 @@ MrIceBlock::collision_squished(Player& player) return true; } +IMPLEMENT_FACTORY(MrIceBlock, "mriceblock")