X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fweak_block.cpp;h=78644d6a36c27a0a276b68c7ecd7613b581bd92c;hb=0dfd364d3796f4e72612dee7787ffc8592b92028;hp=90f3006cd3e4485621d95e6dca1e0a9c0c0cf48c;hpb=8a627e73d824b5a14249cfe066dc2fdc643ce28d;p=supertux.git diff --git a/src/object/weak_block.cpp b/src/object/weak_block.cpp index 90f3006cd..78644d6a3 100644 --- a/src/object/weak_block.cpp +++ b/src/object/weak_block.cpp @@ -1,13 +1,11 @@ -// $Id$ -// // SuperTux - Weak Block // Copyright (C) 2006 Matthias Braun // Copyright (C) 2006 Christoph Sommer // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,52 +13,88 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// along with this program. If not, see . -#include +#include "object/weak_block.hpp" -#include "weak_block.hpp" -#include "lisp/lisp.hpp" -#include "object_factory.hpp" -#include "player.hpp" -#include "sector.hpp" -#include "resources.hpp" -#include "sprite/sprite.hpp" -#include "random_generator.hpp" #include "object/bullet.hpp" +#include "object/explosion.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "sprite/sprite.hpp" +#include "sprite/sprite_manager.hpp" +#include "util/reader.hpp" + +#include -WeakBlock::WeakBlock(const lisp::Lisp& lisp) - : MovingSprite(lisp, "images/objects/strawbox/strawbox.sprite", LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL) +WeakBlock::WeakBlock(const Reader& lisp) +: MovingSprite(lisp, "images/objects/weak_block/strawbox.sprite", LAYER_TILES, COLGROUP_STATIC), state(STATE_NORMAL), +linked(true) { sprite->set_action("normal"); - set_solid(true); + //Check if this weakblock destroys adjacent weakblocks + if(lisp.get("linked", linked)){ + if(! linked){ + sprite_name = "images/objects/weak_block/meltbox.sprite"; + sprite = sprite_manager->create(sprite_name); + sprite->set_action("normal"); + } + } } HitResponse -WeakBlock::collision(GameObject& other, const CollisionHit& ) +WeakBlock::collision_bullet(Bullet& bullet, const CollisionHit& hit) { switch (state) { - + case STATE_NORMAL: - if (dynamic_cast(&other)) { + //Ensure only fire destroys weakblock + if(bullet.get_type() == FIRE_BONUS) { startBurning(); - return FORCE_MOVE; + bullet.remove_me(); } - return FORCE_MOVE; - break; - + //Other bullets ricochet + else { + bullet.ricochet(*this, hit); + } + break; + case STATE_BURNING: - return FORCE_MOVE; - break; - case STATE_DISINTEGRATING: - return FORCE_MOVE; break; + + default: + log_debug << "unhandled state" << std::endl; + break; + } + + return FORCE_MOVE; +} +HitResponse +WeakBlock::collision(GameObject& other, const CollisionHit& hit) +{ + switch (state) { + + case STATE_NORMAL: + if (Bullet* bullet = dynamic_cast (&other)) { + return collision_bullet(*bullet, hit); + } + //Explosions destroy weakblocks as well + if (dynamic_cast (&other)) { + startBurning(); + } + break; + + case STATE_BURNING: + case STATE_DISINTEGRATING: + break; + + default: + log_debug << "unhandled state" << std::endl; + break; } - - log_debug << "unhandled state" << std::endl; + return FORCE_MOVE; } @@ -68,27 +102,26 @@ void WeakBlock::update(float ) { switch (state) { - - case STATE_NORMAL: - break; - - case STATE_BURNING: - if (sprite->animation_done()) { - state = STATE_DISINTEGRATING; - sprite->set_action("disintegrating", 1); - spreadHit(); - set_solid(false); - set_group(COLGROUP_DISABLED); - } - break; - - case STATE_DISINTEGRATING: - if (sprite->animation_done()) { - remove_me(); - return; - } - break; - + + case STATE_NORMAL: + break; + + case STATE_BURNING: + if (sprite->animation_done()) { + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + spreadHit(); + set_group(COLGROUP_DISABLED); + } + break; + + case STATE_DISINTEGRATING: + if (sprite->animation_done()) { + remove_me(); + return; + } + break; + } } @@ -103,21 +136,24 @@ WeakBlock::startBurning() 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(); + //Destroy adjacent weakblocks if applicable + if(linked) { + 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"); +/* EOF */