X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fsnail.cpp;h=f54573fd006edd8eaa087e82eca784b3272307cd;hb=e7042da286e68756298cc205910b35c1da551167;hp=fd8819f42b9bb1b79cc5cfbd4fb6796baa53cb3f;hpb=b71c1bff3c89c0b56cf589da078d7d3815a6f4d5;p=supertux.git diff --git a/src/badguy/snail.cpp b/src/badguy/snail.cpp index fd8819f42..f54573fd0 100644 --- a/src/badguy/snail.cpp +++ b/src/badguy/snail.cpp @@ -23,23 +23,26 @@ #include "object/block.hpp" namespace { - const float WALKSPEED = 80; const float KICKSPEED = 500; const int MAXSQUISHES = 10; const float KICKSPEED_Y = -500; /**< y-velocity gained when kicked */ } Snail::Snail(const lisp::Lisp& reader) - : BadGuy(reader, "images/creatures/snail/snail.sprite"), state(STATE_NORMAL), squishcount(0) + : WalkingBadguy(reader, "images/creatures/snail/snail.sprite", "left", "right"), state(STATE_NORMAL), squishcount(0) { + walk_speed = 80; + max_drop_height = 600; sound_manager->preload("sounds/iceblock_bump.wav"); sound_manager->preload("sounds/stomp.wav"); sound_manager->preload("sounds/kick.wav"); } Snail::Snail(const Vector& pos, Direction d) - : BadGuy(pos, d, "images/creatures/snail/snail.sprite"), state(STATE_NORMAL), squishcount(0) + : WalkingBadguy(pos, d, "images/creatures/snail/snail.sprite", "left", "right"), state(STATE_NORMAL), squishcount(0) { + walk_speed = 80; + max_drop_height = 600; sound_manager->preload("sounds/iceblock_bump.wav"); sound_manager->preload("sounds/stomp.wav"); sound_manager->preload("sounds/kick.wav"); @@ -49,26 +52,24 @@ void Snail::write(lisp::Writer& writer) { writer.start_list("snail"); - - writer.write_float("x", start_position.x); - writer.write_float("y", start_position.y); - + WalkingBadguy::write(writer); writer.end_list("snail"); } void Snail::activate() { + WalkingBadguy::activate(); be_normal(); } void Snail::be_normal() { - state = STATE_NORMAL; - sprite->set_action(dir == LEFT ? "left" : "right"); + if (state == STATE_NORMAL) return; - physic.set_velocity_x(dir == LEFT ? -WALKSPEED : WALKSPEED); + state = STATE_NORMAL; + WalkingBadguy::activate(); } void @@ -105,11 +106,7 @@ Snail::active_update(float elapsed_time) switch (state) { case STATE_NORMAL: - if (on_ground() && might_fall(601)) { - dir = (dir == LEFT ? RIGHT : LEFT); - sprite->set_action(dir == LEFT ? "left" : "right"); - physic.set_velocity_x(-physic.get_velocity_x()); - } + WalkingBadguy::active_update(elapsed_time); break; case STATE_FLAT: @@ -119,6 +116,7 @@ Snail::active_update(float elapsed_time) if (flat_timer.check()) { be_normal(); } + BadGuy::active_update(elapsed_time); break; case STATE_KICKED_DELAY: @@ -127,15 +125,16 @@ Snail::active_update(float elapsed_time) physic.set_velocity_y(KICKSPEED_Y); state = STATE_KICKED; } + BadGuy::active_update(elapsed_time); break; case STATE_KICKED: physic.set_velocity_x(physic.get_velocity_x() * pow(0.99, elapsed_time/0.02)); - if (fabsf(physic.get_velocity_x()) < WALKSPEED) be_normal(); + if (fabsf(physic.get_velocity_x()) < walk_speed) be_normal(); + BadGuy::active_update(elapsed_time); break; } - BadGuy::active_update(elapsed_time); } void @@ -143,62 +142,56 @@ Snail::collision_solid(const CollisionHit& hit) { update_on_ground_flag(hit); - if(hit.top || hit.bottom) { // floor or roof - physic.set_velocity_y(0); - - switch (state) { - case STATE_NORMAL: - case STATE_FLAT: - case STATE_KICKED_DELAY: - break; - case STATE_KICKED: - break; - } - - return; - } - // hit left or right - switch(state) { - + switch (state) { case STATE_NORMAL: - if( (dir == LEFT && hit.left) || ( dir == RIGHT && hit.right) ){ - dir = dir == LEFT ? RIGHT : LEFT; - sprite->set_action(dir == LEFT ? "left" : "right"); - physic.set_velocity_x(-physic.get_velocity_x()); - } + WalkingBadguy::collision_solid(hit); break; - case STATE_FLAT: + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.left || hit.right) { + } + break; case STATE_KICKED_DELAY: - physic.set_velocity_x(0); + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.left || hit.right) { + physic.set_velocity_x(0); + } break; + case STATE_KICKED: + if(hit.top || hit.bottom) { + physic.set_velocity_y(0); + } + if(hit.left || hit.right) { + sound_manager->play("sounds/iceblock_bump.wav", get_pos()); - case STATE_KICKED: { - sound_manager->play("sounds/iceblock_bump.wav", get_pos()); - #if 0 - // TODO move this into BonusBlock code - // open bonusblocks, crash bricks - BonusBlock* bonusblock = dynamic_cast (&object); - if(bonusblock) { - bonusblock->try_open(); - } - Brick* brick = dynamic_cast (&object); - if(brick) { - brick->try_break(); - } + // TODO move this into BonusBlock code + // open bonusblocks, crash bricks + BonusBlock* bonusblock = dynamic_cast (&object); + if(bonusblock) { + bonusblock->try_open(); + } + Brick* brick = dynamic_cast (&object); + if(brick) { + brick->try_break(); + } #endif - if( ( dir == LEFT && hit.left ) || ( dir == RIGHT && hit.right) ){ - dir = (dir == LEFT) ? RIGHT : LEFT; - sprite->set_action(dir == LEFT ? "flat-left" : "flat-right"); + if( ( dir == LEFT && hit.left ) || ( dir == RIGHT && hit.right) ){ + dir = (dir == LEFT) ? RIGHT : LEFT; + sprite->set_action(dir == LEFT ? "flat-left" : "flat-right"); + + physic.set_velocity_x(-physic.get_velocity_x()*0.75); + if (fabsf(physic.get_velocity_x()) < walk_speed) be_normal(); + } - physic.set_velocity_x(-physic.get_velocity_x()*0.75); - if (fabsf(physic.get_velocity_x()) < WALKSPEED) be_normal(); } break; - - } } + } HitResponse @@ -206,17 +199,7 @@ Snail::collision_badguy(BadGuy& badguy, const CollisionHit& hit) { switch(state) { case STATE_NORMAL: - // printf("Snail <-> Badguy %s %s %s %s %s\n", hit.left?"left":"", hit.right?"right":"", hit.top?"top":"", hit.bottom?"bottom":"", hit.crush?"crush":""); - if( hit.left && dir == LEFT ){ - dir = RIGHT; - sprite->set_action( "right" ); - physic.set_velocity_x(-physic.get_velocity_x()); - } else if( hit.right && dir == RIGHT ){ - dir = LEFT; - sprite->set_action( "left" ); - physic.set_velocity_x(-physic.get_velocity_x()); - } - return CONTINUE; + return WalkingBadguy::collision_badguy(badguy, hit); case STATE_FLAT: case STATE_KICKED_DELAY: return FORCE_MOVE;