4
Copyright (C) 2005-2009 Julien Jorge, Sebastien Angibaud
4
Copyright (C) 2005-2010 Julien Jorge, Sebastien Angibaud
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 Sebastien Angibaud
29
29
#include "ptb/monster.hpp"
30
#include "ptb/game_variables.hpp"
31
#include "ptb/level_variables.hpp"
32
#include "engine/base_item.hpp"
33
#include "engine/variable/variable.hpp"
31
35
#include <iostream>
40
44
* \brief Constructor.
42
46
ptb::monster::monster()
43
: m_offensive_force(0), m_energy(0), m_offensive_phase(true),
47
: m_offensive_force(0), m_energy(0), m_initial_energy(0),
48
m_offensive_phase(true),
44
49
m_defensive_powers(s_attack_count+1, false),
45
50
m_offensive_coefficients(s_attack_count+1, 0), m_invincible(false),
46
51
m_is_injured(false)
68
73
( monster& attacker, const bear::universe::collision_info& info)
70
75
bool result = false;
72
if( (!m_invincible) && (!m_is_injured) )
77
if( (!m_invincible) && (!m_is_injured) )
74
if ( attacker.is_invincible() )
79
if ( attacker.is_invincible() &&
80
( attacker.get_monster_type() != stone_1_monster ) &&
81
( attacker.get_monster_type() != stone_2_monster ) &&
82
( attacker.get_monster_type() != stone_3_monster ) )
76
84
if ( ( m_energy > 0 ) && is_vulnerable( attacker,info ) )
79
87
injure(attacker,info);
80
88
remove_energy(attacker,m_energy);
81
attacker.has_attacked();
89
attacker.has_attacked(*this);
84
92
else if( is_vulnerable( attacker,info ) )
88
96
for( unsigned int i=0; i!=m_defensive_powers.size(); ++i )
89
97
if ( !get_defensive_power(i,attacker,info) )
90
98
energy += attacker.get_offensive_coefficient(i,*this,info);
92
100
energy *= attacker.m_offensive_force;
97
105
injure(attacker,info);
98
106
remove_energy(attacker,energy);
99
attacker.has_attacked();
107
attacker.has_attacked(*this);
107
115
/*----------------------------------------------------------------------------*/
109
117
* \brief The item has attacked.
118
* \param other The monster that is attacked.
111
void ptb::monster::has_attacked()
120
void ptb::monster::has_attacked(const monster& other)
114
123
} // monster::has_attacked()
245
256
bool result = false;
258
bool friendly(game_variables::get_friendly_fire());
259
bear::engine::variable<bool> var("friendly_fire");
260
bear::engine::level& lvl =
261
dynamic_cast<const bear::engine::base_item*>(this)->get_level();
263
if ( lvl.level_variable_exists(var) )
264
friendly = level_variables::get_friendly_fire(lvl);
247
266
switch( m_monster_type )
249
case nature_monster: result = false; break;
251
272
case player_1_monster:
252
result = ( attacker.get_monster_type() != stone_1_monster );
273
if ( ( attacker.get_monster_type() == stone_2_monster ) ||
274
( attacker.get_monster_type() == player_2_monster ) )
277
result = ( attacker.get_monster_type() != stone_1_monster );
255
280
case player_2_monster:
256
result = ( attacker.get_monster_type() != stone_2_monster );
259
case enemy_monster: result =
260
( attacker.get_monster_type() != enemy_monster ); break;
281
if ( ( attacker.get_monster_type() == stone_1_monster ) ||
282
( attacker.get_monster_type() == player_1_monster ) )
285
result = ( attacker.get_monster_type() != stone_2_monster );
288
case player_3_monster:
289
result = ( attacker.get_monster_type() != stone_3_monster );
293
result = ( attacker.get_monster_type() != enemy_monster );
263
296
case stone_1_monster:
264
result = ( ( attacker.get_monster_type() != player_1_monster ) &&
265
( attacker.get_monster_type() != stone_1_monster ) );
297
if ( ( attacker.get_monster_type() == stone_2_monster ) ||
298
( attacker.get_monster_type() == player_2_monster ) )
301
result = ( ( attacker.get_monster_type() != player_1_monster ) &&
302
( attacker.get_monster_type() != stone_1_monster ) );
268
305
case stone_2_monster:
269
result = ( ( attacker.get_monster_type() != player_2_monster ) &&
306
if ( ( attacker.get_monster_type() == stone_1_monster ) ||
307
( attacker.get_monster_type() == player_1_monster ) )
310
result = ( ( attacker.get_monster_type() != player_2_monster ) &&
270
311
( attacker.get_monster_type() != stone_2_monster ) );
314
case stone_3_monster:
315
if ( ( attacker.get_monster_type() == stone_3_monster ) ||
316
( attacker.get_monster_type() == player_3_monster ) )
319
result = ( ( attacker.get_monster_type() != player_3_monster ) &&
320
( attacker.get_monster_type() != stone_3_monster ) );
275
330
} // monster::is_vulnerable()
327
382
/*----------------------------------------------------------------------------*/
384
* \brief Get a given defensive power status.
385
* \param index Type of the considered attack.
388
ptb::monster::get_defensive_power(const attack_type index) const
390
return m_defensive_powers[index];
391
} // ptb::monster::get_defensive_power()
393
/*----------------------------------------------------------------------------*/
329
395
* \brief Set an offensive coefficient.
330
396
* \param index Type of the considered attack.
331
397
* \param coef The new offensive coefficient.
359
425
/*----------------------------------------------------------------------------*/
427
* \brief Return the initial energy of the monster.
429
double ptb::monster::get_initial_energy() const
431
return m_initial_energy;
432
} // monster::get_initial_energy()
435
/*----------------------------------------------------------------------------*/
437
* \brief Return if te monster is injured.
439
bool ptb::monster::is_injured() const
442
} // monster::is_injured()
444
/*----------------------------------------------------------------------------*/
361
446
* \brief Indicates if the monster is in a offensive phase.
363
448
bool ptb::monster::is_in_offensive_phase() const