X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fmriceblock.cpp;h=4e1b1745aa206d614ec85f896a63e4141fe68a07;hb=40e6e7cdc59c09befbd2595aea0c6e10428315d4;hp=72a007cbb7e948f5c3af601ab3a06387f91c8411;hpb=f41a5719a2dc1a50674c69fa511c38a152cc4b03;p=supertux.git diff --git a/src/badguy/mriceblock.cpp b/src/badguy/mriceblock.cpp index 72a007cbb..4e1b1745a 100644 --- a/src/badguy/mriceblock.cpp +++ b/src/badguy/mriceblock.cpp @@ -1,16 +1,17 @@ #include #include "mriceblock.h" +#include "object/block.h" static const float WALKSPEED = 80; static const float KICKSPEED = 500; static const int MAXSQUISHES = 10; -MrIceBlock::MrIceBlock(LispReader& reader) +MrIceBlock::MrIceBlock(const lisp::Lisp& reader) : ice_state(ICESTATE_NORMAL), squishcount(0) { - reader.read_float("x", start_position.x); - reader.read_float("y", start_position.y); + reader.get("x", start_position.x); + reader.get("y", start_position.y); bbox.set_size(31.8, 31.8); sprite = sprite_manager->create("mriceblock"); set_direction = false; @@ -28,12 +29,12 @@ MrIceBlock::MrIceBlock(float pos_x, float pos_y, Direction d) } void -MrIceBlock::write(LispWriter& writer) +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")