X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Fweak_block.cpp;h=261128553acb2857864d38b0524b29a77e0a41b3;hb=64842a0700a2ee8a3d2d61ad2685217f5060985a;hp=c8a4c38a4e39c603e789d6667008e7a9bbba6f7d;hpb=058e2f6298d8319c0fe03c5e950a36a8f1f57aba;p=supertux.git diff --git a/src/object/weak_block.cpp b/src/object/weak_block.cpp index c8a4c38a4..261128553 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,54 +13,97 @@ // 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. - -#include +// along with this program. If not, see . -#include "weak_block.hpp" +#include "object/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 "audio/sound_manager.hpp" +#include "math/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), + light(0.0f,0.0f,0.0f), + lightsprite(SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-small.sprite")) { sprite->set_action("normal"); + //Check if this weakblock destroys adjacent weakblocks + if(lisp.get("linked", linked)){ + if(! linked){ + sprite_name = "images/objects/weak_block/meltbox.sprite"; + sprite = SpriteManager::current()->create(sprite_name); + sprite->set_action("normal"); + } + } + if(sprite_name == "images/objects/weak_block/strawbox.sprite") { + lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); + lightsprite->set_color(Color(0.3f, 0.2f, 0.1f)); + } else if(sprite_name == "images/objects/weak_block/meltbox.sprite") + SoundManager::current()->preload("sounds/sizzle.ogg"); } 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; } @@ -70,26 +111,55 @@ void WeakBlock::update(float ) { switch (state) { + + case STATE_NORMAL: + break; + + case STATE_BURNING: + // cause burn light to flicker randomly + if (linked) { + if(gameRandom.rand(10) >= 7) { + lightsprite->set_color(Color(0.2f + gameRandom.rand(20)/100.0f, 0.1f + gameRandom.rand(20)/100.0f, 0.1f)); + } else + lightsprite->set_color(Color(0.3f, 0.2f, 0.1f)); + } + + if (sprite->animation_done()) { + state = STATE_DISINTEGRATING; + sprite->set_action("disintegrating", 1); + spreadHit(); + set_group(COLGROUP_DISABLED); + lightsprite = SpriteManager::current()->create("images/objects/lightmap_light/lightmap_light-tiny.sprite"); + lightsprite->set_blend(Blend(GL_SRC_ALPHA, GL_ONE)); + lightsprite->set_color(Color(0.3f, 0.2f, 0.1f)); + } + 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; - +void +WeakBlock::draw(DrawingContext& context) +{ + //Draw the Sprite just in front of other objects + sprite->draw(context, get_pos(), LAYER_OBJECTS + 10); + //Draw the light if burning and dark + if(linked && (state != STATE_NORMAL)){ + context.get_light( get_bbox().get_middle(), &light ); + if (light.red + light.green + light.blue < 3.0){ + context.push_target(); + context.set_target(DrawingContext::LIGHTMAP); + sprite->draw(context, get_pos(), LAYER_OBJECTS + 10); + lightsprite->draw(context, get_bbox().get_middle(), 0); + context.pop_target(); + } } } @@ -99,26 +169,31 @@ WeakBlock::startBurning() if (state != STATE_NORMAL) return; state = STATE_BURNING; sprite->set_action("burning", 1); + if(sprite_name == "images/objects/weak_block/meltbox.sprite") + SoundManager::current()->play("sounds/sizzle.ogg"); } 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->get()); + 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 */