X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fobject%2Ffirefly.cpp;h=0077c9bd46f006dd1ac0459253048117cc1b3571;hb=8eff855963e2699763d0d653dabc9b709f0d2ab0;hp=49299fb94b46989cb50484a6ebef31ce9d8c108d;hpb=a113d3bd1feddd510e3b2852b0d42522735eee40;p=supertux.git diff --git a/src/object/firefly.cpp b/src/object/firefly.cpp index 49299fb94..0077c9bd4 100644 --- a/src/object/firefly.cpp +++ b/src/object/firefly.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // -// 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 @@ -14,75 +12,99 @@ // 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 "object/firefly.hpp" -#include +#include -#include "firefly.hpp" -#include "resources.hpp" -#include "sprite/sprite_manager.hpp" -#include "video/drawing_context.hpp" -#include "player.hpp" -#include "object_factory.hpp" -#include "game_session.hpp" -#include "sector.hpp" -#include "random_generator.hpp" +#include "audio/sound_manager.hpp" +#include "math/random_generator.hpp" +#include "object/player.hpp" #include "object/sprite_particle.hpp" +#include "supertux/game_session.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "util/reader.hpp" -Firefly::Firefly(const lisp::Lisp& lisp) - : MovingSprite(lisp, "images/objects/resetpoints/default-resetpoint.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), activated(false) +Firefly::Firefly(const Reader& lisp) : + MovingSprite(lisp, "images/objects/resetpoints/default-resetpoint.sprite", LAYER_TILES, COLGROUP_TOUCHABLE), + activated(false), + initial_position() { - + initial_position = get_pos(); if( !lisp.get( "sprite", sprite_name ) ){ + reactivate(); return; } if( sprite_name == "" ){ sprite_name = "images/objects/resetpoints/default-resetpoint.sprite"; + reactivate(); return; } //Replace sprite - sprite = sprite_manager->create( sprite_name ); + sprite = SpriteManager::current()->create( sprite_name ); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); + reactivate(); + + //Load sound + if( sprite_name.find("vbell", 0) == std::string::npos ) { + SoundManager::current()->preload("sounds/savebell_low.wav"); + } + else { + SoundManager::current()->preload("sounds/savebell2.wav"); + } } void -Firefly::write(lisp::Writer& writer) +Firefly::reactivate() { - writer.start_list("firefly"); - writer.write_float("x", bbox.p1.x); - writer.write_float("y", bbox.p1.y); - writer.end_list("firefly"); + if(GameSession::current()->get_reset_point_pos() == initial_position){ + // TODO: && GameSession::current()->get_reset_point_sectorname() == + // GameSession::current()->get_current_sector()->get_name() is not yet initialized. + // Worst case a resetpoint in a different sector at the same position as the real + // resetpoint the player is spawning is set to ringing, too. Until we can check the sector, too, dont set + // activated = true; here. + sprite->set_action("ringing"); + } } HitResponse Firefly::collision(GameObject& other, const CollisionHit& ) { - if(activated) + // If the bell is already activated, don't ring it again! + if(activated || sprite->get_action() == "ringing") return ABORT_MOVE; Player* player = dynamic_cast (&other); if(player) { activated = true; -// spawn some particles -// TODO: provide convenience function in MovingSprite or MovingObject? - for (int i = 0; i < 5; i++) { - Vector ppos = bbox.get_middle(); - float angle = systemRandom.randf(-M_PI_2, M_PI_2); - float velocity = systemRandom.randf(450, 900); - float vx = sin(angle)*velocity; - float vy = -cos(angle)*velocity; - Vector pspeed = Vector(vx, vy); - Vector paccel = Vector(0, 1000); - Sector::current()->add_object(new SpriteParticle("images/objects/particles/reset.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS-1)); - } - // TODO play sound + // spawn some particles + // TODO: provide convenience function in MovingSprite or MovingObject? + for (int i = 0; i < 5; i++) { + Vector ppos = bbox.get_middle(); + float angle = graphicsRandom.randf(-M_PI_2, M_PI_2); + float velocity = graphicsRandom.randf(450, 900); + float vx = sin(angle)*velocity; + float vy = -cos(angle)*velocity; + Vector pspeed = Vector(vx, vy); + Vector paccel = Vector(0, 1000); + Sector::current()->add_object(std::make_shared("images/objects/particles/reset.sprite", "default", ppos, ANCHOR_MIDDLE, pspeed, paccel, LAYER_OBJECTS-1)); + } + + if( sprite_name.find("vbell", 0) == std::string::npos ) { + SoundManager::current()->play("sounds/savebell2.wav"); + } + else { + SoundManager::current()->play("sounds/savebell_low.wav"); + } + sprite->set_action("ringing"); GameSession::current()->set_reset_point(Sector::current()->get_name(), - get_pos()); + initial_position); } return ABORT_MOVE; } -IMPLEMENT_FACTORY(Firefly, "firefly"); +/* EOF */