cc74c01a4109be5ecc3fb3d6a9483f13c8bfdf42
[supertux.git] / src / badguy / mrbomb.cpp
1 //  $Id$
2 //
3 //  SuperTux
4 //  Copyright (C) 2006 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 <config.h>
21
22 #include "mrbomb.hpp"
23 #include "bomb.hpp"
24 #include "object/explosion.hpp"
25 #include "sprite/sprite_manager.hpp"
26 #include "audio/sound_manager.hpp"
27
28 MrBomb::MrBomb(const lisp::Lisp& reader)
29         : WalkingBadguy(reader, "images/creatures/mr_bomb/mr_bomb.sprite", "left", "right")
30 {
31   walk_speed = 80;
32   max_drop_height = 16;
33   grabbed = false;
34
35   //Prevent stutter when Tux jumps on Mr Bomb
36   sound_manager->preload("sounds/explosion.wav");
37
38   //Check if we need another sprite
39   if( !reader.get( "sprite", sprite_name ) ){
40     return;
41   }
42   if( sprite_name == "" ){
43     sprite_name = "images/creatures/mr_bomb/mr_bomb.sprite";
44     return;
45   }
46   //Replace sprite
47   sprite = sprite_manager->create( sprite_name );
48 }
49
50 /* MrBomb created by a despencer always gets default sprite atm.*/
51 MrBomb::MrBomb(const Vector& pos, Direction d)
52         : WalkingBadguy(pos, d, "images/creatures/mr_bomb/mr_bomb.sprite", "left", "right")
53 {
54   walk_speed = 80;
55   max_drop_height = 16;
56   grabbed = false;
57   sound_manager->preload("sounds/explosion.wav");
58 }
59
60 void
61 MrBomb::write(lisp::Writer& writer)
62 {
63   writer.start_list("mrbomb");
64   WalkingBadguy::write(writer);
65   writer.end_list("mrbomb");
66 }
67
68 HitResponse
69 MrBomb::collision(GameObject& object, const CollisionHit& hit)
70 {
71   if(grabbed)
72     return FORCE_MOVE;
73   return WalkingBadguy::collision(object, hit);
74 }
75
76 HitResponse
77 MrBomb::collision_player(Player& player, const CollisionHit& hit)
78 {
79   if(grabbed)
80     return FORCE_MOVE;
81   return WalkingBadguy::collision_player(player, hit);
82 }
83
84 bool
85 MrBomb::collision_squished(GameObject& object)
86 {
87   remove_me();
88   Sector::current()->add_object(new Bomb(get_pos(), dir, sprite_name ));
89   kill_squished(object);
90   return true;
91 }
92
93 void
94 MrBomb::active_update(float elapsed_time)
95 {
96   if(grabbed)
97     return;
98   WalkingBadguy::active_update(elapsed_time);
99 }
100
101 void
102 MrBomb::kill_fall()
103 {
104   remove_me();
105   Explosion* explosion = new Explosion(get_bbox().get_middle());
106   Sector::current()->add_object(explosion);
107
108   run_dead_script();
109 }
110
111 void
112 MrBomb::grab(MovingObject&, const Vector& pos, Direction dir)
113 {
114   assert(frozen);
115   movement = pos - get_pos();
116   this->dir = dir;
117   sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
118   set_colgroup_active(COLGROUP_DISABLED);
119   grabbed = true;
120 }
121
122 void
123 MrBomb::ungrab(MovingObject& , Direction dir)
124 {
125   this->dir = dir;
126   set_colgroup_active(COLGROUP_MOVING);
127   grabbed = false;
128 }
129
130 void
131 MrBomb::freeze()
132 {
133   WalkingBadguy::freeze();
134   sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
135 }
136
137 bool
138 MrBomb::is_freezable() const
139 {
140   return true;
141 }
142
143 bool
144 MrBomb::is_portable() const
145 {
146   return frozen;
147 }
148
149 IMPLEMENT_FACTORY(MrBomb, "mrbomb")