X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftrigger%2Fdoor.cpp;h=442351191c49ebfcb1f7c2c7e08de2ec15e11567;hb=HEAD;hp=4f7e50b6a08bda44a171a89b4d9e10070857d89f;hpb=e7505c3c66a8fd9735317c0cfa0cc4d9161d53da;p=supertux.git diff --git a/src/trigger/door.cpp b/src/trigger/door.cpp index 4f7e50b6a..442351191 100644 --- a/src/trigger/door.cpp +++ b/src/trigger/door.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,70 +12,63 @@ // 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 "trigger/door.hpp" -#include "door.hpp" -#include "game_session.hpp" -#include "resources.hpp" -#include "object_factory.hpp" -#include "sprite/sprite.hpp" -#include "sprite/sprite_manager.hpp" -#include "video/drawing_context.hpp" -#include "lisp/lisp.hpp" -#include "lisp/writer.hpp" -#include "audio/sound_manager.hpp" +#include -Door::Door(const lisp::Lisp& reader) - : state(CLOSED) +#include "audio/sound_manager.hpp" +#include "object/player.hpp" +#include "sprite/sprite_manager.hpp" +#include "supertux/game_session.hpp" +#include "supertux/object_factory.hpp" +#include "supertux/sector.hpp" +#include "util/reader.hpp" + +Door::Door(const Reader& reader) : + state(CLOSED), + target_sector(), + target_spawnpoint(), + script(), + sprite(), + stay_open_timer() { reader.get("x", bbox.p1.x); reader.get("y", bbox.p1.y); reader.get("sector", target_sector); reader.get("spawnpoint", target_spawnpoint); - sprite = sprite_manager->create("images/objects/door/door.sprite"); + reader.get("script", script); + + sprite = SpriteManager::current()->create("images/objects/door/door.sprite"); sprite->set_action("closed"); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - sound_manager->preload("sounds/door.wav"); + SoundManager::current()->preload("sounds/door.wav"); } -Door::Door(int x, int y, std::string sector, std::string spawnpoint) - : state(CLOSED) +Door::Door(int x, int y, std::string sector, std::string spawnpoint) : + state(CLOSED), + target_sector(), + target_spawnpoint(), + script(), + sprite(), + stay_open_timer() { bbox.set_pos(Vector(x, y)); target_sector = sector; target_spawnpoint = spawnpoint; - sprite = sprite_manager->create("images/objects/door/door.sprite"); + sprite = SpriteManager::current()->create("images/objects/door/door.sprite"); sprite->set_action("closed"); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); - sound_manager->preload("sounds/door.wav"); + SoundManager::current()->preload("sounds/door.wav"); } Door::~Door() { - delete sprite; -} - -void -Door::write(lisp::Writer& writer) -{ - writer.start_list("door"); - - writer.write_float("x", bbox.p1.x); - writer.write_float("y", bbox.p1.y); - writer.write_float("width", bbox.get_width()); - writer.write_float("height", bbox.get_height()); - - writer.write_string("sector", target_sector); - writer.write_string("spawnpoint", target_spawnpoint); - - writer.end_list("door"); } void @@ -89,23 +80,23 @@ Door::update(float ) case OPENING: // if door has finished opening, start timer and keep door open if(sprite->animation_done()) { - state = OPEN; - sprite->set_action("open"); - stay_open_timer.start(1.0); + state = OPEN; + sprite->set_action("open"); + stay_open_timer.start(1.0); } break; case OPEN: // if door was open long enough, start closing it if (stay_open_timer.check()) { - state = CLOSING; - sprite->set_action("closing", 1); + state = CLOSING; + sprite->set_action("closing", 1); } break; case CLOSING: // if door has finished closing, keep it shut if(sprite->animation_done()) { - state = CLOSED; - sprite->set_action("closed"); + state = CLOSED; + sprite->set_action("closed"); } break; } @@ -124,9 +115,9 @@ Door::event(Player& , EventType type) case CLOSED: // if door was activated, start opening it if (type == EVENT_ACTIVATE) { - state = OPENING; - sound_manager->play("sounds/door.wav"); - sprite->set_action("opening", 1); + state = OPENING; + SoundManager::current()->play("sounds/door.wav"); + sprite->set_action("opening", 1); } break; case OPENING: @@ -139,7 +130,7 @@ Door::event(Player& , EventType type) } HitResponse -Door::collision(GameObject& other, const CollisionHit& hit) +Door::collision(GameObject& other, const CollisionHit& hit_) { switch (state) { case CLOSED: @@ -147,21 +138,28 @@ Door::collision(GameObject& other, const CollisionHit& hit) case OPENING: break; case OPEN: - { - // if door is open and was touched by a player, teleport the player - Player* player = dynamic_cast (&other); - if (player) { - state = CLOSING; - sprite->set_action("closing", 1); - GameSession::current()->respawn(target_sector, target_spawnpoint); - } + { + // if door is open and was touched by a player, teleport the player + Player* player = dynamic_cast (&other); + if (player) { + state = CLOSING; + sprite->set_action("closing", 1); + if(!script.empty()) { + std::istringstream stream(script); + Sector::current()->run_script(stream, "Door"); + } + + if(!target_sector.empty()) { + GameSession::current()->respawn(target_sector, target_spawnpoint); + } } - break; + } + break; case CLOSING: break; } - return TriggerBase::collision(other, hit); + return TriggerBase::collision(other, hit_); } -IMPLEMENT_FACTORY(Door, "door"); +/* EOF */