本文整理汇总了C++中monster::made_of方法的典型用法代码示例。如果您正苦于以下问题:C++ monster::made_of方法的具体用法?C++ monster::made_of怎么用?C++ monster::made_of使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类monster
的用法示例。
在下文中一共展示了monster::made_of方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: hit_monster_with_flags
void game::hit_monster_with_flags(monster &z, unsigned int effects)
{
if (effects & mfb(AMMO_FLAME)) {
if (z.made_of(VEGGY) || z.made_of(COTTON) || z.made_of(WOOL) ||
z.made_of(PAPER) || z.made_of(WOOD))
z.add_effect(ME_ONFIRE, rng(8, 20));
else if (z.made_of(FLESH))
z.add_effect(ME_ONFIRE, rng(5, 10));
} else if (effects & mfb(AMMO_INCENDIARY)) {
if (z.made_of(VEGGY) || z.made_of(COTTON) || z.made_of(WOOL) ||
z.made_of(PAPER) || z.made_of(WOOD))
z.add_effect(ME_ONFIRE, rng(2, 6));
else if (z.made_of(FLESH) && one_in(4))
z.add_effect(ME_ONFIRE, rng(1, 4));
}
}
示例2: normal
void mdeath::normal( monster &z )
{
if( z.no_corpse_quiet ) {
return;
}
if( z.type->in_species( ZOMBIE ) ) {
sfx::play_variant_sound( "mon_death", "zombie_death", sfx::get_heard_volume( z.pos() ) );
}
if( g->u.sees( z ) ) {
//Currently it is possible to get multiple messages that a monster died.
add_msg( m_good, _( "The %s dies!" ), z.name().c_str() );
}
const int max_hp = std::max( z.get_hp_max(), 1 );
const float overflow_damage = std::max( -z.get_hp(), 0 );
const float corpse_damage = 2.5 * overflow_damage / max_hp;
const bool pulverized = corpse_damage > 5 && overflow_damage > z.get_hp_max();
z.bleed(); // leave some blood if we have to
if( !pulverized ) {
make_mon_corpse( z, int( std::floor( corpse_damage ) ) );
}
// Limit chunking to flesh, veggy and insect creatures until other kinds are supported.
const std::vector<material_id> gib_mats = {{
material_id( "flesh" ), material_id( "hflesh" ),
material_id( "veggy" ), material_id( "iflesh" ),
material_id( "bone" )
}};
const bool gibbable = !z.type->has_flag( MF_NOGIB ) &&
std::any_of( gib_mats.begin(), gib_mats.end(), [&z]( const material_id &gm ) {
return z.made_of( gm );
} );
const field_id type_blood = z.bloodType();
const field_id type_gib = z.gibType();
if( gibbable ) {
const auto area = g->m.points_in_radius( z.pos(), 1 );
int number_of_gibs = std::min( std::floor( corpse_damage ) - 1, 1 + max_hp / 5.0f );
if( pulverized && z.type->size >= MS_MEDIUM ) {
number_of_gibs += rng( 1, 6 );
sfx::play_variant_sound( "mon_death", "zombie_gibbed", sfx::get_heard_volume( z.pos() ) );
}
for( int i = 0; i < number_of_gibs; ++i ) {
g->m.add_splatter( type_gib, random_entry( area ), rng( 1, i + 1 ) );
g->m.add_splatter( type_blood, random_entry( area ) );
}
}
const int num_chunks = z.type->get_meat_chunks_count();
if( pulverized && gibbable ) {
const itype_id meat = z.type->get_meat_itype();
const item chunk( meat );
for( int i = 0; i < num_chunks; i++ ) {
tripoint tarp( z.pos() + point( rng( -3, 3 ), rng( -3, 3 ) ) );
const auto traj = line_to( z.pos(), tarp );
for( size_t j = 0; j < traj.size(); j++ ) {
tarp = traj[j];
if( one_in( 2 ) && type_blood != fd_null ) {
g->m.add_splatter( type_blood, tarp );
} else {
g->m.add_splatter( type_gib, tarp, rng( 1, j + 1 ) );
}
if( g->m.impassable( tarp ) ) {
g->m.bash( tarp, 3 );
if( g->m.impassable( tarp ) ) {
// Target is obstacle, not destroyed by bashing,
// stop trajectory in front of it, if this is the first
// point (e.g. wall adjacent to monster) , make it invalid.
if( j > 0 ) {
tarp = traj[j - 1];
} else {
tarp = tripoint_min;
}
break;
}
}
}
if( tarp != tripoint_min ) {
g->m.add_item_or_charges( tarp, chunk );
}
}
}
}
示例3: hit_monster_with_flags
// MATERIALS-TODO: use fire resistance
void game::hit_monster_with_flags(monster &z, unsigned int effects)
{
if (effects & mfb(AMMO_FLAME)) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(8, 20));
else if (z.made_of("flesh"))
z.add_effect(ME_ONFIRE, rng(5, 10));
} else if (effects & mfb(AMMO_INCENDIARY)) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(2, 6));
else if (z.made_of("flesh") && one_in(4))
z.add_effect(ME_ONFIRE, rng(1, 4));
} else if (effects & mfb(AMMO_IGNITE)) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(6, 6));
else if (z.made_of("flesh"))
z.add_effect(ME_ONFIRE, rng(10, 10));
}
}
示例4: hit_monster_with_flags
// MATERIALS-TODO: use fire resistance
void game::hit_monster_with_flags(monster &z, const std::set<std::string> &effects)
{
if (effects.count("FLAME")) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(8, 20));
else if (z.made_of("flesh"))
z.add_effect(ME_ONFIRE, rng(5, 10));
} else if (effects.count("INCENDIARY")) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(2, 6));
else if (z.made_of("flesh") && one_in(4))
z.add_effect(ME_ONFIRE, rng(1, 4));
} else if (effects.count("IGNITE")) {
if (z.made_of("veggy") || z.made_of("cotton") || z.made_of("wool") ||
z.made_of("paper") || z.made_of("wood"))
z.add_effect(ME_ONFIRE, rng(6, 6));
else if (z.made_of("flesh"))
z.add_effect(ME_ONFIRE, rng(10, 10));
}
if (effects.count("BOUNCE")) {
z.add_effect(ME_BOUNCED, 1);
}
int stun_strength = 0;
if (effects.count("BEANBAG")) {
stun_strength = 4;
}
if (effects.count("LARGE_BEANBAG")) {
stun_strength = 16;
}
if( stun_strength > 0 ) {
switch( z.type->size )
{
case MS_TINY:
stun_strength *= 4;
break;
case MS_SMALL:
stun_strength *= 2;
break;
case MS_MEDIUM:
default:
break;
case MS_LARGE:
stun_strength /= 2;
break;
case MS_HUGE:
stun_strength /= 4;
break;
}
z.add_effect( ME_STUNNED, rng(stun_strength / 2, stun_strength) );
}
}
示例5: splatter
void mdeath::splatter( monster &z )
{
// Limit chunking to flesh, veggy and insect creatures until other kinds are supported.
const std::vector<material_id> gib_mats = {{
material_id( "flesh" ), material_id( "hflesh" ),
material_id( "veggy" ), material_id( "iflesh" ),
material_id( "bone" )
}
};
const bool gibbable = !z.type->has_flag( MF_NOGIB ) &&
std::any_of( gib_mats.begin(), gib_mats.end(), [&z]( const material_id & gm ) {
return z.made_of( gm );
} );
const int max_hp = std::max( z.get_hp_max(), 1 );
const float overflow_damage = std::max( -z.get_hp(), 0 );
const float corpse_damage = 2.5 * overflow_damage / max_hp;
bool pulverized = corpse_damage > 5 && overflow_damage > z.get_hp_max();
// make sure that full splatter happens when this is a set death function, not part of normal
for( const auto &deathfunction : z.type->dies ) {
if( deathfunction == mdeath::splatter ) {
pulverized = true;
}
}
const field_id type_blood = z.bloodType();
const field_id type_gib = z.gibType();
if( gibbable ) {
const auto area = g->m.points_in_radius( z.pos(), 1 );
int number_of_gibs = std::min( std::floor( corpse_damage ) - 1, 1 + max_hp / 5.0f );
if( pulverized && z.type->size >= MS_MEDIUM ) {
number_of_gibs += rng( 1, 6 );
sfx::play_variant_sound( "mon_death", "zombie_gibbed", sfx::get_heard_volume( z.pos() ) );
}
for( int i = 0; i < number_of_gibs; ++i ) {
g->m.add_splatter( type_gib, random_entry( area ), rng( 1, i + 1 ) );
g->m.add_splatter( type_blood, random_entry( area ) );
}
}
int num_chunks = rng( 0, z.type->get_meat_chunks_count() / 4 );
num_chunks = std::min( num_chunks, 10 );
if( pulverized && gibbable ) {
const itype_id meat = z.type->get_meat_itype();
const item chunk( meat );
for( int i = 0; i < num_chunks; i++ ) {
bool drop_chunks = true;
tripoint tarp( z.pos() + point( rng( -3, 3 ), rng( -3, 3 ) ) );
const auto traj = line_to( z.pos(), tarp );
for( size_t j = 0; j < traj.size(); j++ ) {
tarp = traj[j];
if( one_in( 2 ) && type_blood != fd_null ) {
g->m.add_splatter( type_blood, tarp );
} else {
g->m.add_splatter( type_gib, tarp, rng( 1, j + 1 ) );
}
if( g->m.impassable( tarp ) ) {
g->m.bash( tarp, 3 );
if( g->m.impassable( tarp ) ) {
// Target is obstacle, not destroyed by bashing,
// stop trajectory in front of it, if this is the first
// point (e.g. wall adjacent to monster), don't drop anything on it
if( j > 0 ) {
tarp = traj[j - 1];
} else {
drop_chunks = false;
}
break;
}
}
}
if( drop_chunks ) {
g->m.add_item_or_charges( tarp, chunk );
}
}
}
}