X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fweak_block.cpp;h=c8a4c38a4e39c603e789d6667008e7a9bbba6f7d;hb=657fc40723665c04b3150946f5bd66b6b0af9230;hp=a528f07904301ebf51d82ca5f7e79658bb799763;hpb=7eedaa580901ec970795fe66d6e7fa56349fb0a0;p=supertux.git diff --git a/src/object/weak_block.cpp b/src/object/weak_block.cpp index a528f0790..c8a4c38a4 100644 --- a/src/object/weak_block.cpp +++ b/src/object/weak_block.cpp @@ -1,4 +1,4 @@ -// $Id: weak_block.cpp 3435 2006-04-26 02:13:42Z sik0fewl $ +// $Id$ // // SuperTux - Weak Block // Copyright (C) 2006 Matthias Braun @@ -21,6 +21,7 @@ #include #include "weak_block.hpp" + #include "lisp/lisp.hpp" #include "object_factory.hpp" #include "player.hpp" @@ -30,11 +31,12 @@ #include "random_generator.hpp" #include "object/bullet.hpp" +#include + WeakBlock::WeakBlock(const lisp::Lisp& lisp) : MovingSprite(lisp, "images/objects/strawbox/strawbox.sprite", LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL) { sprite->set_action("normal"); - flags |= FLAG_SOLID; } HitResponse @@ -44,9 +46,8 @@ WeakBlock::collision(GameObject& other, const CollisionHit& ) case STATE_NORMAL: if (dynamic_cast(&other)) { - state = STATE_BURNING; - sprite->set_action("burning", 1); - return FORCE_MOVE; + startBurning(); + return FORCE_MOVE; } return FORCE_MOVE; break; @@ -75,21 +76,49 @@ WeakBlock::update(float ) case STATE_BURNING: if (sprite->animation_done()) { - state = STATE_DISINTEGRATING; - sprite->set_action("disintegrating", 1); - flags &= ~FLAG_SOLID; + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + spreadHit(); set_group(COLGROUP_DISABLED); } break; case STATE_DISINTEGRATING: if (sprite->animation_done()) { - remove_me(); - return; + remove_me(); + return; } break; } } +void +WeakBlock::startBurning() +{ + if (state != STATE_NORMAL) return; + state = STATE_BURNING; + sprite->set_action("burning", 1); +} + +void +WeakBlock::spreadHit() +{ + Sector* sector = Sector::current(); + if (!sector) { + log_debug << "no current sector" << std::endl; + return; + } + for(Sector::GameObjects::iterator i = sector->gameobjects.begin(); i != sector->gameobjects.end(); ++i) { + WeakBlock* wb = dynamic_cast(*i); + if (!wb) continue; + if (wb == this) continue; + if (wb->state != STATE_NORMAL) continue; + float dx = fabsf(wb->get_pos().x - this->get_pos().x); + float dy = fabsf(wb->get_pos().y - this->get_pos().y); + if ((dx <= 32.5) && (dy <= 32.5)) wb->startBurning(); + } +} + + IMPLEMENT_FACTORY(WeakBlock, "weak_block");