~ubuntu-branches/ubuntu/natty/plee-the-bear/natty

« back to all changes in this revision

Viewing changes to plee-the-bear/src/ptb/item/code/air_bubble.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Julien Jorge, Julien Jorge
  • Date: 2010-11-17 20:13:34 UTC
  • mfrom: (6.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20101117201334-o4dp7uq437to7oxb
Tags: 0.5.1-1
[ Julien Jorge ]
* New upstream release (Closes: #565062, #546514).
* Add armhf architecture (Closes: #604689).
* Remove patches integrated upstream: rpath-editors.diff, rpath-game.diff,
  editors-menu-section.diff.
* Bump the Standard-Version, no changes.
* Update my email address.
* Set build dependency of libclaw to 1.6.0.
* Add the missing ${misc:Depends} in debian/control.
* List gettext translations in bear-factory.install and plee-the-bear.install.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
  Plee the Bear
3
3
 
4
 
  Copyright (C) 2005-2009 Julien Jorge, Sebastien Angibaud
 
4
  Copyright (C) 2005-2010 Julien Jorge, Sebastien Angibaud
5
5
 
6
6
  This program is free software; you can redistribute it and/or modify it
7
7
  under the terms of the GNU General Public License as published by the
27
27
 * \author S�bastien Angibaud
28
28
 */
29
29
#include "ptb/item/air_bubble.hpp"
30
 
#include "ptb/item/plee/plee.hpp"
 
30
#include "ptb/player.hpp"
31
31
#include "engine/export.hpp"
32
32
 
33
33
#include "universe/forced_movement/forced_translation.hpp"
45
45
 * \brief Constructor.
46
46
 */
47
47
ptb::air_bubble::air_bubble()
 
48
  : m_oxygen(0)
48
49
{
49
 
  set_width(8);
50
 
  set_height(8);
51
 
  m_oxygen = 0;
 
50
  set_size(8, 8);
52
51
  m_max_size = s_max_size;
53
52
  set_can_move_items(false);
54
53
  set_mass(30);
66
65
    kill();
67
66
  else
68
67
    {
69
 
      if ( get_width() < m_max_size )
70
 
        {
71
 
          bear::universe::position_type center = get_center_of_mass();
72
 
          set_width(get_width() + 0.2 );
73
 
          set_height(get_height() + 0.2 );
74
 
          set_density(0.9 - 0.3*(get_width() - s_min_size)/
75
 
                      ( s_max_size-s_min_size));
76
 
          set_center_of_mass(center);
77
 
        }
78
 
 
79
 
      m_sprite.set_size( get_size() );
 
68
      update_size(elapsed_time);
80
69
 
81
70
      if ( !is_only_in_environment(bear::universe::water_environment) )
82
71
        kill();
 
72
      else
 
73
        {
 
74
          double f = (double)(get_mass() * 2000.0 * rand() / RAND_MAX) -
 
75
            get_mass() * 1000;
 
76
          add_internal_force(bear::universe::force_type(f,0));
 
77
        }
 
78
 
83
79
    }
84
80
} // air_bubble::progress()
85
81
 
93
89
{
94
90
  visuals.push_front
95
91
    ( bear::engine::scene_visual
96
 
      ( get_top_left(), m_sprite, get_z_position() ) );
 
92
      ( get_bottom_left(), m_sprite, get_z_position() ) );
97
93
} // air_bubble::get_visual()
98
94
 
99
95
/*----------------------------------------------------------------------------*/
100
96
/**
101
 
 * \brief Initialize the layer.
 
97
 * \brief Pre-cache the datas used by the item.
 
98
 */
 
99
void ptb::air_bubble::pre_cache()
 
100
{
 
101
  get_level_globals().load_image("gfx/bubble.png");
 
102
} // air_bubble::pre_cache()
 
103
 
 
104
/*----------------------------------------------------------------------------*/
 
105
/**
 
106
 * \brief Initialize the item.
102
107
 */
103
108
void ptb::air_bubble::build()
104
109
{
105
 
  bear::engine::level_globals& glob = get_level_globals();
106
 
 
107
 
  const bear::visual::image& im_resource = glob.get_image("gfx/bubble.png");
108
 
 
109
 
  m_sprite =
110
 
    bear::visual::sprite
111
 
    ( im_resource, claw::math::rectangle<unsigned int>( 0, 0, 32, 32 ) );
 
110
  super::build();
 
111
 
 
112
  m_sprite = get_level_globals().auto_sprite("gfx/bubble.png", "bubble");
 
113
 
 
114
  if ( m_oxygen < 0 )
 
115
    m_sprite.set_intensity(0.8,0.9,0.4);
 
116
  else
 
117
    m_sprite.set_intensity(1,1,1);
 
118
 
 
119
  m_sprite.set_size( get_size() );
112
120
} // air_bubble::build()
113
121
 
114
122
/*----------------------------------------------------------------------------*/
122
130
{
123
131
  if ( get_width() >= (unsigned int)s_min_size )
124
132
    {
125
 
      plee* other = dynamic_cast<plee*>(&that);
 
133
      player* other = dynamic_cast<player*>(&that);
126
134
 
127
135
      if (other != NULL)
128
136
        {
129
 
          other->receive_oxygen(m_oxygen);
130
 
          m_oxygen = 0;
131
 
          kill();
 
137
          bear::engine::model_mark_placement m;
 
138
 
 
139
          if ( other->get_mark_placement("mouth",m) )
 
140
            if ( get_bounding_box().includes( m.get_position()) )
 
141
              {
 
142
                other->receive_oxygen(m_oxygen);
 
143
                m_oxygen = 0;
 
144
                kill();
 
145
              }
132
146
        }
133
147
    }
134
148
} // air_bubble::collision()
135
149
 
136
150
/*---------------------------------------------------------------------------*/
137
151
/**
138
 
 * \brief Set the oxygen vallue.
 
152
 * \brief Set the oxygen value.
139
153
 * \param oxygen The new oxygen value.
140
154
 */
141
155
void ptb::air_bubble::set_oxygen( double oxygen )
145
159
  if ( m_oxygen == 0 )
146
160
    {
147
161
      // a decorative bubble;
148
 
      m_max_size = 8;
 
162
      m_max_size = s_min_size / 2;
149
163
      set_density(0.85);
150
164
    }
151
165
  else
152
166
    {
153
 
      if ( m_oxygen >= s_oxygen_in_max_size )
 
167
      if ( std::abs(m_oxygen) >= s_oxygen_in_max_size )
154
168
        m_max_size = s_max_size;
155
169
      else
156
170
        m_max_size = s_min_size +
157
 
          (m_oxygen * ( s_max_size - s_min_size ) ) / s_oxygen_in_max_size;
158
 
 
159
 
      set_density(0.9 - 0.3*(m_max_size - s_min_size)/
160
 
                  ( s_max_size-s_min_size));
 
171
          std::abs(m_oxygen) *
 
172
          ( s_max_size - s_min_size) / s_oxygen_in_max_size;
161
173
    }
162
174
} // air_bubble::set_oxygen()
163
175
 
177
189
 */
178
190
void ptb::air_bubble::leaves_active_region()
179
191
{
 
192
  super::leaves_active_region();
 
193
 
180
194
  kill();
181
195
} // ptb::air_bubble::leaves_active_region()
 
196
 
 
197
/*---------------------------------------------------------------------------*/
 
198
/**
 
199
 * \brief Update the size of the bubble according to its oxygen.
 
200
 * \param elapsed_time Elapsed time since the last call.
 
201
 */
 
202
void ptb::air_bubble::update_size( bear::universe::time_type elapsed_time )
 
203
{
 
204
  if ( get_width() < m_max_size )
 
205
    {
 
206
      const bear::universe::position_type center( get_center_of_mass() );
 
207
      set_width( get_width() + 13 * elapsed_time );
 
208
      set_height(get_height() + 13 * elapsed_time );
 
209
      set_density
 
210
        ( 0.9 - 0.3 * (get_width() - s_min_size) / (s_max_size - s_min_size) );
 
211
      set_center_of_mass(center);
 
212
    }
 
213
 
 
214
  m_sprite.set_size( get_size() );
 
215
} // air_bubble::update_size()