29
29
#include "ptb/layer/status_layer.hpp"
31
31
#include "engine/game.hpp"
32
#include "ptb/item/timer_kill_players.hpp"
33
32
#include "visual/bitmap_writing.hpp"
34
33
#include "visual/scene_sprite.hpp"
35
34
#include "visual/scene_writing.hpp"
36
#include "ptb/item/plee/plee.hpp"
35
#include "visual/scene_line.hpp"
36
#include "ptb/player.hpp"
37
37
#include "ptb/level_variables.hpp"
39
/*----------------------------------------------------------------------------*/
42
* \param glob Level globals in which we take the resources.
43
* \param level_sprite The position in "gfx/tube.png" of the image to use for
45
* \param loss_sprite The position in "gfx/tube.png" of the image to use for the
47
* \param length The length of the bar.
49
ptb::status_layer::horizontal_bar::horizontal_bar
50
( bear::engine::level_globals& glob,
51
const bear::visual::rectangle_type& level_sprite,
52
const bear::visual::rectangle_type& loss_sprite,
53
const std::string& icon_name, unsigned int length )
54
: m_level_value(length)
56
const bear::visual::image& bar_resource = glob.get_image("gfx/tube.png");
58
m_level = bear::visual::sprite( bar_resource, level_sprite );
59
m_loss = bear::visual::sprite( bar_resource, loss_sprite );
60
m_icon = glob.auto_sprite("gfx/tube-vertical.png", icon_name);
62
m_loss.set_opacity(0);
66
( bar_resource, claw::math::rectangle<unsigned int>( 0, 0, 19, 24 ) );
70
( bar_resource, claw::math::rectangle<unsigned int>( 19, 0, 1, 20 ) );
72
m_glass_tube.set_width(length);
73
m_level.set_width(length);
74
} // status_layer::horizontal_bar::horizontal_bar()
76
/*----------------------------------------------------------------------------*/
78
* \brief Set the length.
80
void ptb::status_layer::horizontal_bar::set_length(unsigned int length)
82
m_glass_tube.set_width(length);
83
} // status_layer::horizontal_bar::set_length()
85
/*----------------------------------------------------------------------------*/
87
* \brief Get the visual length of the bar.
89
unsigned int ptb::status_layer::horizontal_bar::length() const
91
return m_glass_tube.width();
92
} // status_layer::horizontal_bar::length()
94
/*----------------------------------------------------------------------------*/
96
* \brief Get the visual width of the bar.
98
unsigned int ptb::status_layer::horizontal_bar::width() const
100
return 2 * m_tube_clamp.width() + m_glass_tube.width();
101
} // status_layer::horizontal_bar::width()
103
/*----------------------------------------------------------------------------*/
105
* \brief Get the visual height of the bar.
107
unsigned int ptb::status_layer::horizontal_bar::height() const
110
( m_tube_clamp.height() + m_icon.height() / 2, m_glass_tube.height() );
111
} // status_layer::horizontal_bar::height()
113
/*----------------------------------------------------------------------------*/
115
* \brief Set the level of the bar.
116
* \param lev The new level.
118
void ptb::status_layer::horizontal_bar::set_level( double lev )
120
if ( lev != m_level_value )
122
if ( lev < m_level_value )
123
m_loss.set_opacity(1);
125
m_loss.set_opacity(0);
129
} // status_layer::horizontal_bar::set_level()
131
/*----------------------------------------------------------------------------*/
133
* \brief Update the bar.
134
* \param elapsed_time Elapsed time since the last call.
136
void ptb::status_layer::horizontal_bar::progress
137
( bear::universe::time_type elapsed_time )
139
if ( m_loss.get_opacity() >= 0 )
141
( std::max(0.0, m_loss.get_opacity() - elapsed_time) );
143
m_level.set_width( (unsigned int)(m_level_value + 0.5) );
144
m_loss.set_width( m_level.width() );
145
} // status_layer::horizontal_bar::progress()
147
/*----------------------------------------------------------------------------*/
149
* \brief Display the bar.
150
* \param e (out) The scene elements.
151
* \param pos The top-left position of the bar.
153
void ptb::status_layer::horizontal_bar::render
154
( scene_element_list& e, const bear::visual::position_type& pos )
156
bear::universe::position_type p(pos + m_icon.get_size() / 2);
157
bear::visual::sprite clamp(m_tube_clamp);
158
const bear::visual::coordinate_type d =
159
( clamp.height() - m_level.height() ) / 2;
164
e.push_back( bear::visual::scene_sprite(p.x, p.y, clamp) );
166
( bear::visual::scene_sprite
167
(p.x - m_icon.width() / 2, p.y - m_icon.height() / 2, m_icon) );
169
p.x += clamp.width();
171
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_level) );
173
if ( m_loss.get_opacity() != 0 )
174
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_loss) );
176
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_glass_tube) );
178
p.x += m_glass_tube.width();
181
e.push_back( bear::visual::scene_sprite(p.x, p.y, clamp) );
182
} // status_layer::horizontal_bar::render()
187
/*----------------------------------------------------------------------------*/
189
* \brief Constructor.
190
* \param glob Level globals in which we take the resources.
191
* \param level_sprite The position in "gfx/tube-vertical.png" of the image to
192
* use for the main level.
193
* \param icon_sprite The position in "gfx/tube-vertical.png" of the image to
194
* use for the icon of the bar.
195
* \param length The length of the bar.
197
ptb::status_layer::vertical_bar::vertical_bar
198
( bear::engine::level_globals& glob,
199
const bear::visual::rectangle_type& level_sprite,
200
const bear::visual::rectangle_type& icon_sprite, unsigned int length )
201
: m_level_value(length)
203
const bear::visual::image& bar_resource =
204
glob.get_image("gfx/tube-vertical.png");
206
m_level = bear::visual::sprite( bar_resource, level_sprite );
207
m_icon = bear::visual::sprite( bar_resource, icon_sprite );
211
( bar_resource, claw::math::rectangle<unsigned int>( 0, 0, 24, 19 ) );
215
( bar_resource, claw::math::rectangle<unsigned int>( 0, 21, 20, 1 ) );
217
m_glass_tube.set_height(length);
218
m_level.set_height(length);
219
} // status_layer::vertical_bar::vertical_bar()
221
/*----------------------------------------------------------------------------*/
223
* \brief Get the visual width of the bar.
225
unsigned int ptb::status_layer::vertical_bar::width() const
227
return std::max( m_tube_clamp.width() + m_icon.width() / 2,
228
m_glass_tube.width() );
229
} // status_layer::vertical_bar::width()
231
/*----------------------------------------------------------------------------*/
233
* \brief Get the visual height of the bar.
235
unsigned int ptb::status_layer::vertical_bar::height() const
237
return 2 * m_tube_clamp.height() + m_glass_tube.height()
238
+ m_icon.height() / 2;
239
} // status_layer::vertical_bar::height()
241
/*----------------------------------------------------------------------------*/
243
* \brief Set the level of the bar.
244
* \param lev The new level.
246
void ptb::status_layer::vertical_bar::set_level( double lev )
249
} // status_layer::vertical_bar::set_level()
251
/*----------------------------------------------------------------------------*/
253
* \brief Update the bar.
254
* \param elapsed_time Elapsed time since the last call.
256
void ptb::status_layer::vertical_bar::progress
257
( bear::universe::time_type elapsed_time )
259
m_level.set_height( (unsigned int)(m_level_value + 0.5) );
260
} // status_layer::vertical_bar::progress()
262
/*----------------------------------------------------------------------------*/
264
* \brief Display the bar.
265
* \param e (out) The scene elements.
266
* \param pos The top-left position of the bar.
268
void ptb::status_layer::vertical_bar::render
269
( scene_element_list& e, const bear::visual::position_type& pos )
271
bear::visual::position_type p(pos.x, pos.y + m_icon.height() / 2);
272
bear::visual::sprite clamp(m_tube_clamp);
273
const bear::visual::coordinate_type d =
274
( clamp.width() - m_level.width() ) / 2;
279
e.push_back( bear::visual::scene_sprite(p.x, p.y, clamp) );
281
p.x = pos.x + clamp.width() - m_icon.width() / 2;
283
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_icon) );
286
p.y = pos.y + m_icon.height() / 2 + clamp.height()
287
+ m_glass_tube.height() - m_level.height();
288
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_level) );
290
p.y = pos.y + clamp.height() + m_icon.height() / 2;
291
e.push_back( bear::visual::scene_sprite(p.x, p.y, m_glass_tube) );
294
p.y += m_glass_tube.height();
296
e.push_back( bear::visual::scene_sprite(p.x, p.y, clamp) );
297
} // status_layer::vertical_bar::render()
38
#include "ptb/throwable_item/throwable_items_container.hpp"
39
#include "ptb/defines.hpp"
40
#include "ptb/gauge.hpp"
41
#include "ptb/util.hpp"
302
43
/*----------------------------------------------------------------------------*/
303
44
const double ptb::status_layer::player_status::s_bar_length = 100;
312
53
ptb::status_layer::player_status::player_status
313
54
( bear::engine::level_globals& glob, const bear::visual::font& f,
314
bear::universe::const_derived_item_handle_maker<plee>::handle_type& p )
315
: energy( glob, bear::visual::rectangle_type( 22, 0, 1, 20 ),
316
bear::visual::rectangle_type( 21, 0, 1, 20 ), "heart", s_bar_length ),
317
oxygen( glob, bear::visual::rectangle_type( 0, 20, 20, 1 ),
318
bear::visual::rectangle_type( 48, 0, 16, 16 ), s_bar_length ),
319
fire_gauge( glob, bear::visual::rectangle_type( 0, 19, 20, 1 ),
320
bear::visual::rectangle_type( 48, 16, 16, 16 ), s_bar_length ),
321
ice_gauge( glob, bear::visual::rectangle_type( 0, 22, 20, 1 ),
322
bear::visual::rectangle_type( 32, 0, 16, 16 ), s_bar_length ),
55
bear::universe::const_derived_item_handle_maker<player>::handle_type& p )
56
: energy( glob, s_bar_length, "bar (green)", "bar (red)", "heart", true ),
57
oxygen( glob, s_bar_length, "bar (blue)", "bubble" ),
58
fire_gauge( glob, s_bar_length, "bar (yellow)", "sun" ),
59
ice_gauge( glob, s_bar_length, "bar (white)", "snowflake" ),
324
61
oxygen_active(false), oxygen_offset_x(oxygen.width() + 5),
325
62
fire_gauge_active(false), fire_gauge_offset_x(fire_gauge.width() + 5),
326
63
ice_gauge_active(false), ice_gauge_offset_x(ice_gauge.width() + 5)
328
65
score.create(f, "0pt");
329
stones.create(f, "0");
66
throwable_items.create(f, "0");
331
68
m_air_power = false;
332
69
m_fire_power = false;
333
70
m_water_power = false;
335
m_last_tries = game_variables::get_lives_count(player->get_index());
72
m_last_tries = game_variables::get_lives_count(m_player->get_index());
339
update_stone_animation(glob,p->get_index());
76
update_throwable_item_animation();
340
77
} // status_layer::player_status::player_status()
342
79
/*----------------------------------------------------------------------------*/
352
89
oxygen.progress(elapsed_time);
353
90
fire_gauge.progress(elapsed_time);
354
91
ice_gauge.progress(elapsed_time);
358
energy.set_length(game_variables::get_max_energy(player->get_index()));
360
( energy.length() * player->get_energy() /
361
game_variables::get_max_energy(player->get_index()) );
364
(oxygen, player->get_gauge(plee::oxygen_gauge)->is_activated(),
365
player->get_gauge(plee::oxygen_gauge)->get_value(),
366
plee::s_max_oxygen, oxygen_active, oxygen_offset_x);
369
(fire_gauge, player->get_gauge(plee::fire_gauge)->is_activated(),
370
player->get_gauge(plee::fire_gauge)->get_value(),
371
plee::s_max_fire_gauge, fire_gauge_active, fire_gauge_offset_x);
374
(ice_gauge, player->get_gauge(plee::ice_gauge)->is_activated(),
375
player->get_gauge(plee::ice_gauge)->get_value(),
376
plee::s_max_ice_gauge, ice_gauge_active, ice_gauge_offset_x);
96
(game_variables::get_max_energy(m_player->get_index()));
98
(game_variables::get_max_energy(m_player->get_index()));
99
energy.set_level( m_player->get_energy() );
102
(oxygen, m_player->get_gauge(player::oxygen_gauge)->is_activated(),
103
m_player->get_gauge(player::oxygen_gauge)->get_value(),
104
player::s_max_oxygen, oxygen_active, oxygen_offset_x);
107
(fire_gauge, m_player->get_gauge(player::fire_gauge)->is_activated(),
108
m_player->get_gauge(player::fire_gauge)->get_value(),
109
player::s_max_fire_gauge, fire_gauge_active, fire_gauge_offset_x);
112
(ice_gauge, m_player->get_gauge(player::ice_gauge)->is_activated(),
113
m_player->get_gauge(player::ice_gauge)->get_value(),
114
player::s_max_ice_gauge, ice_gauge_active, ice_gauge_offset_x);
378
116
bear::visual::font f = glob.get_font("font/bouncy.fnt");
380
118
std::ostringstream oss1;
381
oss1 << game_variables::get_score(player->get_index());
382
if ( game_variables::get_score(player->get_index()) > 0 )
386
score.create(f, oss1.str());
119
oss1 << game_variables::get_score(m_player->get_index());
120
score.create(f, oss1.str());
387
121
score->set_intensity(1, 0.8, 0);
389
123
std::ostringstream oss2;
390
oss2 << game_variables::get_stones_count(player->get_index());
391
stones.create(f, oss2.str());
392
stones->set_intensity(1, 0.8, 0);
394
update_tries(glob, elapsed_time, player->get_index());
396
if ( update_powers(player->get_index()) )
397
update_stone_animation(glob,player->get_index());
399
stone_animation.next(elapsed_time);
124
oss2 << m_player->get_throwable_items()->get_current_throwable_item
126
throwable_items.create(f, oss2.str());
127
throwable_items->set_intensity(1, 0.8, 0);
129
update_tries(glob, elapsed_time, m_player->get_index());
131
if ( update_throwable_item(m_player->get_index()) )
132
update_throwable_item_animation();
134
throwable_item_animation.next(elapsed_time);
401
136
} // status_layer::player_status::progress()
403
138
/*----------------------------------------------------------------------------*/
405
* \brief Update the powers.
140
* \brief Update the throwable_item.
406
141
* Return true if the powers have changed.
407
142
* \param index The index of the player.
409
bool ptb::status_layer::player_status::update_powers( unsigned int index )
144
bool ptb::status_layer::player_status::update_throwable_item
145
( unsigned int index )
411
147
bool result = false;
413
if ( m_air_power != game_variables::get_air_power(index) )
149
if ( m_air_power != game_variables::get_air_power(index) )
415
151
m_air_power = game_variables::get_air_power(index);
419
if ( m_fire_power != game_variables::get_fire_power(index) )
155
if ( m_fire_power != game_variables::get_fire_power(index) )
421
157
m_fire_power = game_variables::get_fire_power(index);
425
if ( m_water_power != game_variables::get_water_power(index) )
161
if ( m_water_power != game_variables::get_water_power(index) )
427
163
m_water_power = game_variables::get_water_power(index);
167
if ( m_last_throwable_item !=
168
m_player->get_throwable_items()->get_current_throwable_item() )
170
m_last_throwable_item =
171
m_player->get_throwable_items()->get_current_throwable_item();
175
if ( m_last_throw_status !=
176
m_player->get_throwable_items()->get_current_throwable_item
179
m_last_throw_status =
180
m_player->get_throwable_items()->get_current_throwable_item
432
186
} // player_status::update_powers
453
208
m_tries_time += elapsed_time;
454
209
if ( m_tries_time > 1 )
458
215
std::ostringstream oss;
460
217
bear::visual::font f = glob.get_font("font/bouncy.fnt");
461
218
tries.create(f, oss.str());
464
221
double green = 0.8;
466
if ( m_tries_time != 0 )
223
if ( m_tries_time != 0 )
468
225
if ( m_tries_time > 0.5 )
471
green = 2*(m_tries_time-0.5);
473
else if ( m_tries_time > 0 )
475
red = 1 - m_tries_time;
476
green = 0.8 - 1.6*m_tries_time;
228
green = 2*(m_tries_time-0.5);
230
else if ( m_tries_time > 0 )
232
red = 1 - m_tries_time;
233
green = 0.8 - 1.6*m_tries_time;
479
236
tries->set_intensity(red, green, 0);
480
237
} // player_status::update_tries()
482
239
/*----------------------------------------------------------------------------*/
484
* \brief Update the stone animation.
241
* \brief Update the throwable_item animation.
485
242
* \param glob The level globals in which we load the media.
486
243
* \param index The index of the player.
488
void ptb::status_layer::player_status::update_stone_animation
489
( bear::engine::level_globals& glob, unsigned int index )
245
void ptb::status_layer::player_status::update_throwable_item_animation()
491
if ( game_variables::get_air_power(index) )
492
if ( game_variables::get_fire_power(index) )
493
if ( game_variables::get_water_power(index) )
494
stone_animation = glob.get_animation
495
("animation/stones/air_fire_water_stone.canim");
497
stone_animation = glob.get_animation
498
("animation/stones/air_fire_stone.canim");
500
if ( game_variables::get_water_power(index) )
501
stone_animation = glob.get_animation
502
("animation/stones/air_water_stone.canim");
504
stone_animation = glob.get_animation
505
("animation/stones/air_stone.canim");
507
if ( game_variables::get_fire_power(index) )
508
if ( game_variables::get_water_power(index) )
509
stone_animation = glob.get_animation
510
("animation/stones/water_fire_stone.canim");
512
stone_animation = glob.get_animation
513
("animation/stones/fire_stone.canim");
515
if ( game_variables::get_water_power(index) )
516
stone_animation = glob.get_animation
517
("animation/stones/water_stone.canim");
519
stone_animation = glob.get_animation
520
("animation/stones/stone.canim");
247
throwable_item_animation =
248
m_player->get_throwable_items()
249
->get_current_throwable_item()->get_animation();
521
250
} // player_status::update_stone_animation()
523
252
/*----------------------------------------------------------------------------*/
637
368
if (m_data_2 != NULL)
638
369
render_player2( e );
642
373
( bear::visual::scene_writing
643
( (get_size().x - m_text_time.get_width()) / 2,
644
s_margin, m_text_time ) );
374
( (get_size().x - m_text_time.get_width()) / 2,
375
get_size().y - s_margin - m_text_time.get_height(), m_text_time ) );
646
377
render_corrupting_bonus( e );
378
render_hazelnut( e );
648
379
render_honeypots( e );
649
380
} // status_layer::render()
651
382
/*----------------------------------------------------------------------------*/
384
* \brief Set the timer to use for the time.
386
void ptb::status_layer::set_timer( const timer_handle& t )
389
} // status_layer::set_timer()
391
/*----------------------------------------------------------------------------*/
653
393
* \brief Update the time text.
655
395
void ptb::status_layer::progress_time( bear::universe::time_type elapsed_time )
657
timer_kill_players::msg_get_value msg;
658
bear::engine::level_globals& glob = get_level_globals();
660
if ( glob.send_message( "level_timer", msg ) )
397
if ( m_timer != (bear::timer*)NULL )
662
399
m_time_on = true;
664
bear::universe::time_type time = msg.value;
665
unsigned int sec = (unsigned int)time % 60;
666
unsigned int min = (unsigned int)time / 60;
668
std::ostringstream oss_time;
679
if ( msg.countdown && ( min == 0 ) && ( sec <= 30 ) &&
680
( (unsigned int)((time - 60*min - sec )*4)%2 == 1) )
401
const bear::universe::time_type time = m_timer->get_time();
403
( bear::systime::format_time_s( time, gettext("%M:%S") ) );
405
if ( m_timer->is_countdown() && (time <= 30) &&
406
((time - (int)time) < 0.5) )
681
407
m_text_time->set_intensity(1, 0, 0);
683
409
m_text_time->set_intensity(1, 0.8, 0);
686
( get_level_globals().get_font("font/bouncy.fnt"), oss_time.str() );
411
m_text_time.create( get_level_globals().get_font("font/bouncy.fnt"), t );
690
415
} // status_layer::progress_time()
692
417
/*----------------------------------------------------------------------------*/
696
421
void ptb::status_layer::progress_corrupting_bonus
697
422
( bear::universe::time_type elapsed_time )
699
if ( ! m_corrupting_bonus )
424
if ( !m_corrupting_bonus )
701
426
const std::string name
702
(game_variables::get_corrupting_bonus_animation_name());
703
if ( ! name.empty() )
704
m_corrupting_bonus = new bear::visual::animation
705
( get_level_globals().get_animation(name));
427
( game_variables::get_corrupting_bonus_animation_name() );
431
new bear::visual::animation
432
( get_level_globals().get_animation(name));
434
m_corrupting_bonus->set_size( m_corrupting_bonus->get_size() / 2 );
708
if ( m_corrupting_bonus )
438
if ( m_corrupting_bonus )
440
bear::engine::level_globals& glob = get_level_globals();
441
unsigned int nb = game_variables::get_corrupting_bonus_count();
443
if ( nb < m_last_corrupting_bonus )
445
m_last_corrupting_bonus = nb;
446
m_corrupting_bonus_time = elapsed_time;
448
else if ( m_corrupting_bonus_time != 0 )
450
m_corrupting_bonus_time += elapsed_time;
451
if ( m_corrupting_bonus_time > 1 )
452
m_corrupting_bonus_time = 0;
455
m_last_corrupting_bonus = nb;
710
457
std::ostringstream oss;
711
oss << game_variables::get_corrupting_bonus_count();
712
m_text_corrupting_bonus.create
713
( get_level_globals().get_font("font/bouncy.fnt"), oss.str() );
715
m_text_corrupting_bonus->set_intensity(1, 0.8, 0);
459
bear::visual::font f = glob.get_font("font/bouncy.fnt");
460
m_text_corrupting_bonus.create(f, oss.str());
465
if ( m_corrupting_bonus_time != 0 )
467
if ( m_corrupting_bonus_time > 0.5 )
469
red = m_corrupting_bonus_time;
470
green = 2*(m_corrupting_bonus_time-0.5);
472
else if ( m_corrupting_bonus_time > 0 )
474
red = 1 - m_corrupting_bonus_time;
475
green = 0.8 - 1.6*m_corrupting_bonus_time;
478
m_text_corrupting_bonus->set_intensity(red, green, 0);
717
480
} // status_layer::progress_corrupting_bonus()
723
486
void ptb::status_layer::render_corrupting_bonus
724
487
( scene_element_list& e) const
726
if ( m_corrupting_bonus )
489
if ( m_corrupting_bonus )
728
bear::universe::coordinate_type width =
729
m_corrupting_bonus->width() +
492
if ( m_corrupting_bonus_time > 0.5 )
493
scale = 2 - m_corrupting_bonus_time;
494
else if ( m_corrupting_bonus_time > 0 )
495
scale = 1 + m_corrupting_bonus_time;
497
bear::universe::coordinate_type width =
498
m_corrupting_bonus->width() +
730
499
m_text_corrupting_bonus.get_width() + s_margin;
732
501
bear::universe::position_type pos
733
( get_size().x/2 - width/2,
734
get_size().y - m_corrupting_bonus->height() -
735
m_honeypot.height() - 2*s_margin);
738
( bear::visual::scene_sprite
739
(pos.x, pos.y, m_corrupting_bonus->get_sprite()) );
742
( bear::visual::scene_writing
743
( get_size().x/2 + width/2 - m_text_corrupting_bonus.get_width(),
744
get_size().y - 2*s_margin - m_honeypot.height() -
745
m_corrupting_bonus->height()/2 -
746
m_text_corrupting_bonus.get_width()/4,
747
m_text_corrupting_bonus ) );
502
( get_size().x/2 - width/2, m_honeypot.height() + 2*s_margin);
504
if (m_corrupting_bonus->height() > m_text_corrupting_bonus.get_height())
506
bear::visual::scene_sprite
507
sp( pos.x, pos.y, m_corrupting_bonus->get_sprite() );
509
sp.set_scale_factor(scale,scale);
512
pos.x += m_corrupting_bonus->width() + s_margin;
514
(m_corrupting_bonus->height()
515
- m_text_corrupting_bonus.get_height()) / 2;
519
bear::visual::scene_sprite
521
pos.y + (m_text_corrupting_bonus.get_height()
522
- m_corrupting_bonus->height()) / 2,
523
m_corrupting_bonus->get_sprite() );
525
sp.set_scale_factor(scale,scale);
528
pos.x += m_corrupting_bonus->width() + s_margin;
531
bear::visual::scene_writing s( pos.x, pos.y, m_text_corrupting_bonus );
532
s.set_scale_factor(scale,scale);
749
535
} // status_layer::render_corrupting_bonus()
751
537
/*----------------------------------------------------------------------------*/
753
* \brief Render the azelnut.
539
* \brief Render the hazelnut.
755
void ptb::status_layer::render_azelnut
541
void ptb::status_layer::render_hazelnut
756
542
( scene_element_list& e) const
758
if ( level_variables::get_azelnut(get_level()) )
544
if ( level_variables::get_hazelnut(get_level()) )
761
547
( bear::visual::scene_sprite
762
( (get_size().x-m_azelnut->width())/2,
763
2*s_margin + m_text_time.get_height(),
764
m_azelnut->get_sprite()) );
548
( (get_size().x-m_hazelnut->width())/2,
549
get_size().y - 2*s_margin - m_text_time.get_height()
550
- m_hazelnut->get_sprite().height(),
551
m_hazelnut->get_sprite()) );
766
} // status_layer::render_azelnut()
553
} // status_layer::render_hazelnut()
768
555
/*----------------------------------------------------------------------------*/
794
581
void ptb::status_layer::render_player1( scene_element_list& e ) const
796
bear::visual::position_type pos(s_margin, s_margin);
583
bear::visual::position_type pos
584
( s_margin, get_size().y - s_margin - m_data_1->energy.height() );
798
586
m_data_1->energy.render(e, pos);
800
pos.set( s_margin , 2 * s_margin + m_data_1->energy.height() );
588
pos.y -= s_margin + m_data_1->score.get_height();
801
589
bear::visual::scene_writing s1( pos.x, pos.y, m_data_1->score );
802
590
e.push_back( s1 );
805
3*s_margin + m_data_1->energy.height() +
806
m_data_1->score.get_height());
808
( bear::visual::scene_sprite
809
(pos.x, pos.y, m_data_1->stone_animation.get_sprite()) );
811
pos.set( 2*s_margin + m_data_1->stone_animation.width(),
812
3*s_margin + m_data_1->energy.height() +
813
m_data_1->score.get_height());
814
if ( m_data_1->stone_animation.height() > m_data_1->stones.get_height() )
815
pos.y += ( m_data_1->stone_animation.height() -
816
m_data_1->stones.get_height() ) / 2;
817
bear::visual::scene_writing s2( pos.x, pos.y, m_data_1->stones );
592
bear::visual::coordinate_type y_saved(pos.y);
593
pos.y -= s_margin + m_data_1->throwable_item_animation.get_sprite().height();
594
bear::visual::scene_sprite s_item
595
(pos.x, pos.y, m_data_1->throwable_item_animation.get_sprite());
597
pos.x += m_data_1->throwable_item_animation.get_sprite().width() + s_margin;
599
( m_data_1->throwable_item_animation.get_sprite().height()
600
- m_data_1->throwable_items.get_height() ) / 2;
602
bear::visual::scene_writing s2( pos.x, pos.y, m_data_1->throwable_items );
604
if ( !m_first_player->get_throwable_items()->get_current_throwable_item
607
s_item.get_rendering_attributes().set_opacity(0.5);
608
s2.get_rendering_attributes().set_opacity(0.5);
609
s2.get_rendering_attributes().set_intensity(1,0.4,0.4);
612
e.push_back( s_item );
818
613
e.push_back( s2 );
820
pos.y += m_data_1->stone_animation.height() + s_margin;
616
pos.y = std::min(pos.y, y_saved) - s_margin - m_data_1->oxygen.height();
822
618
if ( m_data_1->oxygen_active )
824
620
pos.x -= m_data_1->oxygen_offset_x;
825
621
m_data_1->oxygen.render(e, pos);
827
pos.set( s_margin, pos.y + m_data_1->oxygen.height() + s_margin );
623
pos.set( s_margin, pos.y - m_data_1->fire_gauge.height() - s_margin );
829
625
if ( m_data_1->fire_gauge_active )
831
627
pos.x -= m_data_1->fire_gauge_offset_x;
832
628
m_data_1->fire_gauge.render(e, pos);
834
pos.set( s_margin, pos.y + m_data_1->fire_gauge.height() + s_margin );
630
pos.set( s_margin, pos.y - m_data_1->ice_gauge.height() - s_margin );
836
632
if ( m_data_1->ice_gauge_active )
838
634
pos.x -= m_data_1->ice_gauge_offset_x;
839
635
m_data_1->ice_gauge.render(e, pos);
841
pos.set( s_margin, pos.y + m_data_1->ice_gauge.height() + s_margin );
637
pos.set( s_margin, pos.y - s_margin );
844
pos.set( s_margin, get_size().y - s_margin - m_small_plee.height() );
845
e.push_back( bear::visual::scene_sprite(pos.x, pos.y, m_small_plee) );
640
pos.set( s_margin, s_margin );
641
e.push_back( bear::visual::scene_sprite(pos.x, pos.y, m_small_player) );
847
643
double scale = 1;
848
644
if ( m_data_1->m_tries_time > 0.5 )
849
645
scale = 2 - m_data_1->m_tries_time;
850
else if ( m_data_1->m_tries_time > 0 )
646
else if ( m_data_1->m_tries_time > 0 )
851
647
scale = 1 + m_data_1->m_tries_time;
853
pos.set( m_small_plee.width() + 2*s_margin,
854
get_size().y - s_margin -
855
( m_small_plee.height() + m_data_1->tries.get_height()*scale)/2 );
649
pos.x += m_small_player.width() + s_margin;
652
+ (m_small_player.height() - m_data_1->tries.get_height() * scale) / 2;
857
654
bear::visual::scene_writing s3( pos.x, pos.y, m_data_1->tries );
858
s3.set_scale_factor(scale,scale);
655
s3.set_scale_factor(scale,scale);
859
656
e.push_back( s3 );
860
657
} // status_layer::render_player1()
867
664
void ptb::status_layer::render_player2( scene_element_list& e ) const
869
666
bear::visual::position_type pos
870
(get_size().x - m_data_2->energy.width() - s_margin, s_margin);
667
( get_size().x - m_data_2->energy.width() - s_margin,
668
get_size().y - s_margin - m_data_2->energy.height() );
872
m_data_2->energy.render(e, pos);
670
m_data_2->energy.render(e, pos);
874
672
pos.set( get_size().x - s_margin - m_data_2->score.get_size().x,
875
2*s_margin + m_data_2->energy.height());
673
pos.y - s_margin - m_data_2->score.get_height() );
876
674
bear::visual::scene_writing s1( pos.x, pos.y, m_data_2->score );
877
675
e.push_back( s1 );
879
pos.set( get_size().x - s_margin - m_data_2->stone_animation.width(),
880
3*s_margin + m_data_2->energy.height() +
881
m_data_2->score.get_height());
884
( bear::visual::scene_sprite
885
(pos.x, pos.y, m_data_2->stone_animation.get_sprite()) );
887
pos.set( get_size().x - 2 * s_margin - m_data_2->stone_animation.width()
888
- m_data_2->stones.get_size().x, 3*s_margin +
889
m_data_2->energy.height() + m_data_2->score.get_height());
891
if ( m_data_2->stone_animation.height() > m_data_2->stones.get_height() )
892
pos.y += ( m_data_2->stone_animation.height() -
893
m_data_2->stones.get_height() ) / 2;
895
bear::visual::scene_writing s2( pos.x, pos.y, m_data_2->stones );
677
bear::visual::coordinate_type y_saved(pos.y);
678
pos.set( get_size().x - s_margin -
679
m_data_2->throwable_item_animation.width(),
681
m_data_2->throwable_item_animation.get_sprite().height() );
682
bear::visual::scene_sprite s_item
683
(pos.x, pos.y, m_data_2->throwable_item_animation.get_sprite());
685
pos.set( get_size().x - 2 * s_margin -
686
m_data_2->throwable_item_animation.width()
687
- m_data_2->throwable_items.get_size().x,
689
+ ( m_data_2->throwable_item_animation.get_sprite().height()
690
- m_data_2->throwable_items.get_height() ) / 2 );
692
bear::visual::scene_writing s2( pos.x, pos.y, m_data_2->throwable_items );
694
if ( !m_second_player->get_throwable_items()->get_current_throwable_item
697
s_item.get_rendering_attributes().set_opacity(0.5);
698
s2.get_rendering_attributes().set_opacity(0.5);
699
s2.get_rendering_attributes().set_intensity(1,0.4,0.4);
702
e.push_back( s_item );
896
703
e.push_back( s2 );
898
pos.y += m_data_2->stone_animation.height() + s_margin;
705
pos.x = get_size().x - s_margin;
706
pos.y = std::min(pos.y, y_saved) - s_margin - m_data_2->oxygen.height();
900
708
if ( m_data_2->oxygen_active )
921
729
+ m_data_2->ice_gauge_offset_x;
922
730
m_data_2->ice_gauge.render(e, pos);
924
pos.set( get_size().x - s_margin,
925
pos.y + m_data_2->ice_gauge.height() + s_margin );
732
pos.set( get_size().x - s_margin, pos.y - s_margin );
928
pos.set( get_size().x - s_margin - m_small_plee.width(),
929
get_size().y - s_margin - m_small_plee.height() );
930
e.push_back( bear::visual::scene_sprite(pos.x, pos.y, m_small_plee) );
735
pos.set( get_size().x - s_margin - m_small_player.width(), s_margin );
736
e.push_back( bear::visual::scene_sprite(pos.x, pos.y, m_small_player) );
932
738
double scale = 1;
933
739
if ( m_data_2->m_tries_time > 0.5 )
934
740
scale = 2 - m_data_2->m_tries_time;
935
else if ( m_data_2->m_tries_time > 0 )
741
else if ( m_data_2->m_tries_time > 0 )
936
742
scale = 1 + m_data_2->m_tries_time;
938
pos.set( get_size().x - 2*s_margin - m_small_plee.width()
939
- m_data_2->tries.get_width()*scale,
940
get_size().y - s_margin -
941
( m_data_2->tries.get_height()*scale + m_small_plee.height())/2 );
744
pos.set( get_size().x - 2*s_margin - m_small_player.width()
745
- m_data_2->tries.get_width()*scale,
747
+ ( m_small_player.height()
748
- m_data_2->tries.get_height() * scale ) / 2 );
943
750
bear::visual::scene_writing s3( pos.x, pos.y, m_data_2->tries );
944
751
s3.set_scale_factor(scale,scale);
946
752
e.push_back( s3 );
947
753
} // status_layer::render_player2()
950
755
/*----------------------------------------------------------------------------*/
952
757
* \brief Search players.
954
759
void ptb::status_layer::search_players( )
956
if ( m_first_player.get() == NULL )
761
if ( m_first_player == (player*)NULL )
958
plee::get_instance_message msg;
959
bear::engine::level_globals& glob = get_level_globals();
960
bear::visual::font f = glob.get_font("font/bouncy.fnt");
961
glob.send_message(plee::player_name(1),msg);
962
m_first_player = msg.get_instance();
763
m_first_player = util::find_player( get_level_globals(), 1 );
964
if ( m_first_player.get() != NULL )
965
m_data_1 = new player_status( glob, f, m_first_player );
765
if ( m_first_player != (player*)NULL )
766
m_data_1 = new player_status
767
( get_level_globals(),
768
get_level_globals().get_font("font/bouncy.fnt"), m_first_player );
968
771
if ( game_variables::get_players_count() == 2 )
970
if ( m_second_player.get() == NULL )
972
plee::get_instance_message msg2;
973
bear::engine::level_globals& glob = get_level_globals();
974
bear::visual::font f = glob.get_font("font/bouncy.fnt");
976
glob.send_message(plee::player_name(2),msg2);
977
m_second_player = msg2.get_instance();
979
if ( m_second_player.get() != NULL )
980
m_data_2 = new player_status( glob, f, m_second_player );
772
if ( m_second_player == (player*)NULL )
774
m_second_player = util::find_player( get_level_globals(), 2 );
776
if ( m_second_player != (player*)NULL )
777
m_data_2 = new player_status
778
( get_level_globals(),
779
get_level_globals().get_font("font/bouncy.fnt"),
983
782
} // status_layer::search_players( )