A couple of fixes on Door class:
[supertux.git] / src / door.cpp
1 //  $Id$
2 //
3 //  SuperTux -  A Jump'n Run
4 //  Copyright (C) 2004 Matthias Braun <matze@braunis.de
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19
20 #include "door.h"
21 #include "lispreader.h"
22 #include "lispwriter.h"
23 #include "gameloop.h"
24 #include "resources.h"
25 #include "sprite.h"
26 #include "sprite_manager.h"
27 #include "screen/drawing_context.h"
28 #include "globals.h"
29
30 /** data images */
31 Sprite* door;
32 Surface* door_opening[DOOR_OPENING_FRAMES];
33
34 Door::Door(LispReader& reader)
35 {
36   reader.read_float("x", area.x);
37   reader.read_float("y", area.y);
38   area.width = 32;
39   area.height = 64;
40
41   reader.read_string("sector", target_sector);
42   reader.read_string("spawnpoint", target_spawnpoint);
43
44   animation_timer.init(true);
45   door_activated = false;
46
47   animation_timer.init(true);
48 }
49
50 void
51 Door::write(LispWriter& writer)
52 {
53   writer.start_list("door");
54
55   writer.write_float("x", area.x);
56   writer.write_float("y", area.y);
57   writer.write_float("width", area.width);
58   writer.write_float("height", area.height);
59   
60   writer.write_string("sector", target_sector);
61   writer.write_string("spawnpoint", target_spawnpoint);
62
63   writer.end_list("door");
64 }
65
66 Door::~Door()
67 {
68 }
69
70 void
71 Door::action(float )
72 {
73 }
74
75 void
76 Door::draw(DrawingContext& context)
77 {
78   if(animation_timer.check())
79     context.draw_surface(door_opening[(animation_timer.get_gone() * DOOR_OPENING_FRAMES) /
80           DOOR_OPENING_TIME], Vector(area.x, area.y - (door_opening[0]->h/2)), LAYER_TILES);
81   else
82     door->draw(context, Vector(area.x, area.y), LAYER_TILES);
83   
84   //Check if door animation is complete
85   //TODO: Move this out of the "draw" method as this is extremely dirty :)  
86   if ((!animation_timer.check()) && (door_activated)) {    
87     door_activated = false;
88     GameSession::current()->respawn(target_sector, target_spawnpoint);
89   }
90 }
91
92 void
93 Door::interaction(InteractionType type)
94 {
95   //Animate the door on activation
96   //TODO: Resetting the animation doesn't work correctly
97   //      Tux and badguys should stop moving while the door is opening
98   if(type == INTERACTION_ACTIVATE) {
99     animation_timer.start(DOOR_OPENING_TIME);
100     door_activated = true;
101   }
102 }
103