X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ftrigger%2Fdoor.cpp;h=442351191c49ebfcb1f7c2c7e08de2ec15e11567;hb=73cb1e168850018eaa821a42b30bb221dc5186fe;hp=4c338a55f9d35349477f57d0935c0bf6b4cacb63;hpb=6e843b1780f62f45b7021bd8c38181aa211588ee;p=supertux.git diff --git a/src/trigger/door.cpp b/src/trigger/door.cpp index 4c338a55f..442351191 100644 --- a/src/trigger/door.cpp +++ b/src/trigger/door.cpp @@ -1,12 +1,10 @@ -// $Id$ +// SuperTux +// Copyright (C) 2006 Matthias Braun // -// SuperTux - A Jump'n Run -// Copyright (C) 2004 Matthias Braun - -#include "door.h" -#include "utils/lispreader.h" -#include "utils/lispwriter.h" -#include "gameloop.h" -#include "resources.h" -#include "special/sprite.h" -#include "special/sprite_manager.h" -#include "video/drawing_context.h" -#include "app/globals.h" - -using namespace SuperTux; - -Door::Door(LispReader& reader) +// along with this program. If not, see . + +#include "trigger/door.hpp" + +#include + +#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.read_float("x", bbox.p1.x); - reader.read_float("y", bbox.p1.y); - bbox.set_size(32, 64); + reader.get("x", bbox.p1.x); + reader.get("y", bbox.p1.y); + reader.get("sector", target_sector); + reader.get("spawnpoint", target_spawnpoint); - reader.read_string("sector", target_sector); - reader.read_string("spawnpoint", target_spawnpoint); + reader.get("script", script); - sprite = sprite_manager->create("door"); + 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()); + + SoundManager::current()->preload("sounds/door.wav"); } -Door::Door(int x, int y, std::string sector, std::string spawnpoint) +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)); - bbox.set_size(32, 64); target_sector = sector; target_spawnpoint = spawnpoint; - sprite = sprite_manager->create("door"); -} + 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()); -Door::~Door() -{ - delete sprite; + SoundManager::current()->preload("sounds/door.wav"); } -void -Door::write(LispWriter& writer) +Door::~Door() { - 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 -Door::action(float ) +Door::update(float ) { - //Check if door animation is complete - if(sprite->check_animation()) { - GameSession::current()->respawn(target_sector, target_spawnpoint); + switch (state) { + case CLOSED: + break; + 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); + } + break; + case OPEN: + // if door was open long enough, start closing it + if (stay_open_timer.check()) { + 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"); + } + break; } } void Door::draw(DrawingContext& context) { - sprite->draw(context, bbox.p1, LAYER_TILES); + sprite->draw(context, bbox.p1, LAYER_BACKGROUNDTILES+1); } void Door::event(Player& , EventType type) { - if(type == EVENT_ACTIVATE) { - sprite->set_action("open", 1); + switch (state) { + case CLOSED: + // if door was activated, start opening it + if (type == EVENT_ACTIVATE) { + state = OPENING; + SoundManager::current()->play("sounds/door.wav"); + sprite->set_action("opening", 1); + } + break; + case OPENING: + break; + case OPEN: + break; + case CLOSING: + break; } } +HitResponse +Door::collision(GameObject& other, const CollisionHit& hit_) +{ + switch (state) { + case CLOSED: + break; + 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); + 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; + case CLOSING: + break; + } + + return TriggerBase::collision(other, hit_); +} + +/* EOF */