Changed ObjectFactory code so that it works properly when building SuperTux as library
[supertux.git] / src / badguy / mrbomb.cpp
1 //  SuperTux
2 //  Copyright (C) 2006 Matthias Braun <matze@braunis.de>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 #include "audio/sound_manager.hpp"
18 #include "badguy/bomb.hpp"
19 #include "badguy/mrbomb.hpp"
20 #include "object/explosion.hpp"
21 #include "sprite/sprite.hpp"
22 #include "sprite/sprite_manager.hpp"
23 #include "supertux/object_factory.hpp"
24 #include "supertux/sector.hpp"
25 #include "util/reader.hpp"
26
27 MrBomb::MrBomb(const Reader& reader) :
28   WalkingBadguy(reader, "images/creatures/mr_bomb/mr_bomb.sprite", "left", "right"),
29   grabbed()
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 dispenser 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   grabbed()
54 {
55   walk_speed = 80;
56   max_drop_height = 16;
57   grabbed = false;
58   sound_manager->preload("sounds/explosion.wav");
59 }
60
61 HitResponse
62 MrBomb::collision(GameObject& object, const CollisionHit& hit)
63 {
64   if(grabbed)
65     return FORCE_MOVE;
66   return WalkingBadguy::collision(object, hit);
67 }
68
69 HitResponse
70 MrBomb::collision_player(Player& player, const CollisionHit& hit)
71 {
72   if(grabbed)
73     return FORCE_MOVE;
74   return WalkingBadguy::collision_player(player, hit);
75 }
76
77 bool
78 MrBomb::collision_squished(GameObject& object)
79 {
80   if(is_valid()) {
81     remove_me();
82     Sector::current()->add_object(new Bomb(get_pos(), dir, sprite_name ));
83   }
84   kill_squished(object);
85   return true;
86 }
87
88 void
89 MrBomb::active_update(float elapsed_time)
90 {
91   if(grabbed)
92     return;
93   WalkingBadguy::active_update(elapsed_time);
94 }
95
96 void
97 MrBomb::kill_fall()
98 {
99   if(is_valid()) {
100     remove_me();
101     Explosion* explosion = new Explosion(get_bbox().get_middle());
102     Sector::current()->add_object(explosion);
103   }
104
105   run_dead_script();
106 }
107
108 void
109 MrBomb::grab(MovingObject&, const Vector& pos, Direction dir)
110 {
111   assert(frozen);
112   movement = pos - get_pos();
113   this->dir = dir;
114   sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
115   set_colgroup_active(COLGROUP_DISABLED);
116   grabbed = true;
117 }
118
119 void
120 MrBomb::ungrab(MovingObject& , Direction dir)
121 {
122   this->dir = dir;
123   set_colgroup_active(COLGROUP_MOVING);
124   grabbed = false;
125 }
126
127 void
128 MrBomb::freeze()
129 {
130   WalkingBadguy::freeze();
131   sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
132 }
133
134 bool
135 MrBomb::is_freezable() const
136 {
137   return true;
138 }
139
140 bool
141 MrBomb::is_portable() const
142 {
143   return frozen;
144 }
145
146 /* EOF */