本文整理汇总了C++中posz函数的典型用法代码示例。如果您正苦于以下问题:C++ posz函数的具体用法?C++ posz怎么用?C++ posz使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了posz函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: is_player
bool Creature::sees( const Creature &critter ) const
{
if( critter.is_hallucination() ) {
// hallucinations are imaginations of the player character, npcs or monsters don't hallucinate.
// Invisible hallucinations would be pretty useless (nobody would see them at all), therefor
// the player will see them always.
return is_player();
}
const auto p = dynamic_cast< const player* >( &critter );
if( p != nullptr && p->is_invisible() ) {
// Let invisible players see themselves (simplifies drawing)
return p == this;
}
if( !fov_3d && !debug_mode && posz() != critter.posz() ) {
return false;
}
const int wanted_range = rl_dist( pos(), critter.pos() );
if( wanted_range <= 1 &&
( posz() == critter.posz() || g->m.valid_move( pos(), critter.pos(), false, true ) ) ) {
return true;
} else if( ( wanted_range > 1 && critter.digging() ) ||
(critter.has_flag(MF_NIGHT_INVISIBILITY) && g->m.light_at(critter.pos()) <= LL_LOW ) ||
( critter.is_underwater() && !is_underwater() && g->m.is_divable( critter.pos() ) ) ) {
return false;
}
return sees( critter.pos(), critter.is_player() );
}
开发者ID:catalpapril,项目名称:Cataclysm-DDA,代码行数:31,代码来源:creature.cpp
示例2: has_flag
/* Random walking even when we've moved
* To simulate zombie stumbling and ineffective movement
* Note that this is sub-optimal; stumbling may INCREASE a zombie's speed.
* Most of the time (out in the open) this effect is insignificant compared to
* the negative effects, but in a hallway it's perfectly even
*/
void monster::stumble( bool moved )
{
// don't stumble every turn. every 3rd turn, or 8th when walking.
if( ( moved && !one_in( 8 ) ) || !one_in( 3 ) ) {
return;
}
std::vector<tripoint> valid_stumbles;
const bool avoid_water = has_flag( MF_NO_BREATHE ) && !has_flag( MF_SWIMS ) && !has_flag( MF_AQUATIC );
for( int i = -1; i <= 1; i++ ) {
for( int j = -1; j <= 1; j++ ) {
tripoint dest( posx() + i, posy() + j, posz() );
if( ( i || j ) && can_move_to( dest ) &&
//Stop zombies and other non-breathing monsters wandering INTO water
//(Unless they can swim/are aquatic)
//But let them wander OUT of water if they are there.
!( avoid_water &&
g->m.has_flag( "SWIMMABLE", dest ) &&
!g->m.has_flag( "SWIMMABLE", pos3() ) ) &&
g->critter_at( dest ) == nullptr ) {
valid_stumbles.push_back( dest );
}
}
}
if( g->m.has_zlevels() ) {
tripoint below( posx(), posy(), posz() - 1 );
tripoint above( posx(), posy(), posz() + 1 );
if( g->m.valid_move( pos(), below, false, true ) && can_move_to( below ) ) {
valid_stumbles.push_back( below );
}
// More restrictions for moving up
// It should happen during "shambling around", but not as actual stumbling
if( !moved && one_in( 5 ) && has_flag( MF_FLIES ) &&
g->m.valid_move( pos(), above, false, true ) && can_move_to( above ) ) {
valid_stumbles.push_back( above );
}
}
if( valid_stumbles.empty() ) { //nowhere to stumble?
return;
}
move_to( random_entry( valid_stumbles ), false );
// Here we have to fix our plans[] list,
// acquiring a new path to the previous target.
// target == either end of current plan, or the player.
int bresenham_slope, junk;
if( !plans.empty() ) {
if( g->m.sees( pos3(), plans.back(), -1, bresenham_slope, junk ) ) {
set_dest( plans.back(), bresenham_slope );
} else if( sees( g->u, bresenham_slope ) ) {
set_dest( g->u.pos(), bresenham_slope );
} else { //durr, i'm suddenly calm. what was i doing?
plans.clear();
}
}
}
开发者ID:MushroomWobbit,项目名称:Cataclysm-DDA,代码行数:65,代码来源:monmove.cpp
示例3: sees
bool Creature::sees( const tripoint &t, bool is_player ) const
{
if( !fov_3d && posz() != t.z ) {
return false;
}
const int range_cur = sight_range( g->m.ambient_light_at( t ) );
const int range_day = sight_range( DAYLIGHT_LEVEL );
const int range_night = sight_range( 0 );
const int range_max = std::max( range_day, range_night );
const int range_min = std::min( range_cur, range_max );
const int wanted_range = rl_dist( pos(), t );
if( wanted_range <= range_min ||
( wanted_range <= range_max &&
g->m.ambient_light_at( t ) > g->natural_light_level( t.z ) ) ) {
int range = 0;
if( g->m.ambient_light_at( t ) > g->natural_light_level( t.z ) ) {
range = wanted_range;
} else {
range = range_min;
}
if( is_player ) {
// Special case monster -> player visibility, forcing it to be symmetric with player vision.
return range >= wanted_range &&
g->m.get_cache_ref(pos().z).seen_cache[pos().x][pos().y] > LIGHT_TRANSPARENCY_SOLID;
} else {
return g->m.sees( pos(), t, range );
}
} else {
return false;
}
}
开发者ID:ProfoundDarkness,项目名称:Cataclysm-DDA,代码行数:32,代码来源:creature.cpp
示例4: is_player
bool Creature::sees( const Creature &critter, int &bresen1, int &bresen2 ) const
{
if( critter.is_hallucination() ) {
// hallucinations are imaginations of the player character, npcs or monsters don't hallucinate.
// Invisible hallucinations would be pretty useless (nobody would see them at all), therefor
// the player will see them always.
return is_player();
}
const auto p = dynamic_cast< const player* >( &critter );
if( p != nullptr && p->is_invisible() ) {
// Let invisible players see themselves (simplifies drawing)
return p == this;
}
if( posz() != critter.posz() && !debug_mode ) {
return false; // TODO: Remove this
}
const int wanted_range = rl_dist( pos3(), critter.pos3() );
if( wanted_range <= 1 ) {
return true;
} else if( ( wanted_range > 1 && critter.digging() ) ||
( g->m.is_divable( critter.pos3() ) && critter.is_underwater() && !is_underwater() ) ) {
return false;
}
return sees( critter.pos3(), bresen1, bresen2 );
}
开发者ID:grimoire,项目名称:Cataclysm-DDA,代码行数:29,代码来源:creature.cpp
示例5: attack_at
bool monster::attack_at( const tripoint &p )
{
if( p.z != posz() ) {
return false; // TODO: Remove this
}
if( has_effect( "pacified" ) ) {
return false;
}
if( p == g->u.pos3() ) {
melee_attack( g->u, true );
return true;
}
const int mondex = g->mon_at( p );
if( mondex != -1 ) {
monster &mon = g->zombie( mondex );
// Don't attack yourself.
if( &mon == this ) {
return false;
}
// Special case: Target is hallucination
if( mon.is_hallucination() ) {
mon.die( nullptr );
// We haven't actually attacked anything, i.e. we can still do things.
// Hallucinations(obviously) shouldn't affect the way real monsters act.
return false;
}
// With no melee dice, we can't attack, but we had to process until here
// because hallucinations require no melee dice to destroy.
if( type->melee_dice <= 0 ) {
return false;
}
auto attitude = attitude_to( mon );
// MF_ATTACKMON == hulk behavior, whack everything in your way
if( attitude == A_HOSTILE || has_flag( MF_ATTACKMON ) ) {
hit_monster( mon );
return true;
}
return false;
}
const int npcdex = g->npc_at( p );
if( npcdex != -1 && type->melee_dice > 0 ) {
// For now we're always attacking NPCs that are getting into our
// way. This is consistent with how it worked previously, but
// later on not hitting allied NPCs would be cool.
melee_attack( *g->active_npc[npcdex], true );
return true;
}
// Nothing to attack.
return false;
}
开发者ID:MushroomWobbit,项目名称:Cataclysm-DDA,代码行数:60,代码来源:monmove.cpp
示例6: bash_at
bool monster::bash_at( const tripoint &p )
{
if( p.z != posz() ) {
return false; // TODO: Remove this
}
if( has_effect( "pacified" ) ) {
return false;
}
//Hallucinations can't bash stuff.
if( is_hallucination() ) {
return false;
}
bool try_bash = !can_move_to( p ) || one_in( 3 );
bool can_bash = g->m.is_bashable( p ) && ( has_flag( MF_BASHES ) || has_flag( MF_BORES ) );
if( try_bash && can_bash ) {
int bashskill = group_bash_skill( p );
g->m.bash( p, bashskill );
moves -= 100;
return true;
}
return false;
}
开发者ID:MushroomWobbit,项目名称:Cataclysm-DDA,代码行数:25,代码来源:monmove.cpp
示例7: has_flag
/**
* Stumble in a random direction, but with some caveats.
*/
void monster::stumble( )
{
// Only move every 3rd turn.
if( !one_in( 3 ) ) {
return;
}
std::vector<tripoint> valid_stumbles;
const bool avoid_water = has_flag( MF_NO_BREATHE ) &&
!has_flag( MF_SWIMS ) && !has_flag( MF_AQUATIC );
for( int i = -1; i <= 1; i++ ) {
for( int j = -1; j <= 1; j++ ) {
tripoint dest( posx() + i, posy() + j, posz() );
if( ( i || j ) && can_move_to( dest ) &&
//Stop zombies and other non-breathing monsters wandering INTO water
//(Unless they can swim/are aquatic)
//But let them wander OUT of water if they are there.
!( avoid_water &&
g->m.has_flag( TFLAG_SWIMMABLE, dest ) &&
!g->m.has_flag( TFLAG_SWIMMABLE, pos3() ) ) &&
( g->critter_at( dest, is_hallucination() ) == nullptr ) ) {
valid_stumbles.push_back( dest );
}
}
}
if( g->m.has_zlevels() ) {
tripoint below( posx(), posy(), posz() - 1 );
tripoint above( posx(), posy(), posz() + 1 );
if( g->m.valid_move( pos(), below, false, true ) && can_move_to( below ) ) {
valid_stumbles.push_back( below );
}
// More restrictions for moving up
if( one_in( 5 ) && has_flag( MF_FLIES ) &&
g->m.valid_move( pos(), above, false, true ) && can_move_to( above ) ) {
valid_stumbles.push_back( above );
}
}
if( valid_stumbles.empty() ) { //nowhere to stumble?
return;
}
move_to( random_entry( valid_stumbles ), false );
}
开发者ID:CliffsDover,项目名称:Cataclysm-DDA,代码行数:48,代码来源:monmove.cpp
示例8: is_fleeing
tripoint monster::scent_move()
{
// @todo Remove when scentmap is 3D
if( abs( posz() - g->get_levz() ) > 1 ) {
return { -1, -1, INT_MIN };
}
std::vector<tripoint> smoves;
int bestsmell = 10; // Squares with smell 0 are not eligible targets.
int smell_threshold = 200; // Squares at or above this level are ineligible.
if( has_flag( MF_KEENNOSE ) ) {
bestsmell = 1;
smell_threshold = 400;
}
const bool fleeing = is_fleeing( g->u );
if( fleeing ) {
bestsmell = g->scent.get( pos() );
}
tripoint next( -1, -1, posz() );
if( ( !fleeing && g->scent.get( pos() ) > smell_threshold ) ||
( fleeing && bestsmell == 0 ) ) {
return next;
}
const bool can_bash = bash_skill() > 0;
for( const auto &dest : g->m.points_in_radius( pos(), 1, 1 ) ) {
int smell = g->scent.get( dest );
if( g->m.valid_move( pos(), dest, can_bash, true ) &&
( can_move_to( dest ) || ( dest == g->u.pos() ) ||
( can_bash && g->m.bash_rating( bash_estimate(), dest ) > 0 ) ) ) {
if( ( !fleeing && smell > bestsmell ) || ( fleeing && smell < bestsmell ) ) {
smoves.clear();
smoves.push_back( dest );
bestsmell = smell;
} else if( ( !fleeing && smell == bestsmell ) || ( fleeing && smell == bestsmell ) ) {
smoves.push_back( dest );
}
}
}
return random_entry( smoves, next );
}
开发者ID:AlecWhite,项目名称:Cataclysm-DDA,代码行数:44,代码来源:monmove.cpp
示例9: attitude
/* will_reach() is used for determining whether we'll get to stairs (and
* potentially other locations of interest). It is generally permissive.
* TODO: Pathfinding;
Make sure that non-smashing monsters won't "teleport" through windows
Injure monsters if they're gonna be walking through pits or whatevs
*/
bool monster::will_reach( int x, int y )
{
monster_attitude att = attitude( &( g->u ) );
if( att != MATT_FOLLOW && att != MATT_ATTACK && att != MATT_FRIEND && att != MATT_ZLAVE ) {
return false;
}
if( has_flag( MF_DIGS ) || has_flag( MF_AQUATIC ) ) {
return false;
}
if( has_flag( MF_IMMOBILE ) && ( posx() != x || posy() != y ) ) {
return false;
}
std::vector<tripoint> path = g->m.route( pos(), tripoint(x, y, posz()), 0, 100 );
if( path.empty() ) {
return false;
}
if( has_flag( MF_SMELLS ) && g->scent( pos3() ) > 0 &&
g->scent( { x, y, posz() } ) > g->scent( pos3() ) ) {
return true;
}
if( can_hear() && wandf > 0 && rl_dist( wander_pos.x, wander_pos.y, x, y ) <= 2 &&
rl_dist( posx(), posy(), wander_pos.x, wander_pos.y ) <= wandf ) {
return true;
}
int t;
if( can_see() && g->m.sees( posx(), posy(), x, y, g->light_level(), t ) ) {
return true;
}
return false;
}
开发者ID:MushroomWobbit,项目名称:Cataclysm-DDA,代码行数:43,代码来源:monmove.cpp
示例10: attitude
/* will_reach() is used for determining whether we'll get to stairs (and
* potentially other locations of interest). It is generally permissive.
* TODO: Pathfinding;
Make sure that non-smashing monsters won't "teleport" through windows
Injure monsters if they're gonna be walking through pits or whatevs
*/
bool monster::will_reach( int x, int y )
{
monster_attitude att = attitude( &( g->u ) );
if( att != MATT_FOLLOW && att != MATT_ATTACK && att != MATT_FRIEND && att != MATT_ZLAVE ) {
return false;
}
if( has_flag( MF_DIGS ) || has_flag( MF_AQUATIC ) ) {
return false;
}
if( has_flag( MF_IMMOBILE ) && ( posx() != x || posy() != y ) ) {
return false;
}
auto path = g->m.route( pos(), tripoint( x, y, posz() ), get_pathfinding_settings() );
if( path.empty() ) {
return false;
}
if( has_flag( MF_SMELLS ) && g->scent.get( pos() ) > 0 &&
g->scent.get( { x, y, posz() } ) > g->scent.get( pos() ) ) {
return true;
}
if( can_hear() && wandf > 0 && rl_dist( wander_pos.x, wander_pos.y, x, y ) <= 2 &&
rl_dist( posx(), posy(), wander_pos.x, wander_pos.y ) <= wandf ) {
return true;
}
if( can_see() && sees( tripoint( x, y, posz() ) ) ) {
return true;
}
return false;
}
开发者ID:AlecWhite,项目名称:Cataclysm-DDA,代码行数:42,代码来源:monmove.cpp
示例11: attack_at
bool monster::attack_at( const tripoint &p )
{
if( p.z != posz() ) {
return false; // TODO: Remove this
}
if( p == g->u.pos() ) {
melee_attack( g->u, true );
return true;
}
if( const auto mon_ = g->critter_at<monster>( p, is_hallucination() ) ) {
monster &mon = *mon_;
// Don't attack yourself.
if( &mon == this ) {
return false;
}
// With no melee dice, we can't attack, but we had to process until here
// because hallucinations require no melee dice to destroy.
if( type->melee_dice <= 0 ) {
return false;
}
auto attitude = attitude_to( mon );
// MF_ATTACKMON == hulk behavior, whack everything in your way
if( attitude == A_HOSTILE || has_flag( MF_ATTACKMON ) ) {
melee_attack( mon, true );
return true;
}
return false;
}
npc *const guy = g->critter_at<npc>( p );
if( guy && type->melee_dice > 0 ) {
// For now we're always attacking NPCs that are getting into our
// way. This is consistent with how it worked previously, but
// later on not hitting allied NPCs would be cool.
melee_attack( *guy, true );
return true;
}
// Nothing to attack.
return false;
}
开发者ID:AlecWhite,项目名称:Cataclysm-DDA,代码行数:47,代码来源:monmove.cpp
示例12: bash_at
bool monster::bash_at( const tripoint &p )
{
if( p.z != posz() ) {
return false; // TODO: Remove this
}
//Hallucinations can't bash stuff.
if( is_hallucination() ) {
return false;
}
bool try_bash = !can_move_to( p ) || one_in( 3 );
bool can_bash = g->m.is_bashable( p ) && bash_skill() > 0;
if( try_bash && can_bash ) {
int bashskill = group_bash_skill( p );
g->m.bash( p, bashskill );
moves -= 100;
return true;
}
return false;
}
开发者ID:AlecWhite,项目名称:Cataclysm-DDA,代码行数:21,代码来源:monmove.cpp
示例13: is_fleeing
tripoint monster::scent_move()
{
std::vector<tripoint> smoves;
int bestsmell = 10; // Squares with smell 0 are not eligible targets.
int smell_threshold = 200; // Squares at or above this level are ineligible.
if( has_flag( MF_KEENNOSE ) ) {
bestsmell = 1;
smell_threshold = 400;
}
const bool fleeing = is_fleeing( g->u );
if( fleeing ) {
bestsmell = g->scent( pos() );
}
tripoint next( -1, -1, posz() );
if( ( !fleeing && g->scent( pos() ) > smell_threshold ) ||
( fleeing && bestsmell == 0 ) ) {
return next;
}
const bool can_bash = has_flag( MF_BASHES ) || has_flag( MF_BORES );
for( const auto &dest : g->m.points_in_radius( pos(), 1 ) ) {
int smell = g->scent( dest );
int mon = g->mon_at( dest );
if( ( mon == -1 || g->zombie( mon ).friendly != 0 || has_flag( MF_ATTACKMON ) ) &&
( can_move_to( dest ) || ( dest == g->u.pos3() ) ||
( can_bash && g->m.bash_rating( bash_estimate(), dest ) >= 0 ) ) ) {
if( ( !fleeing && smell > bestsmell ) || ( fleeing && smell < bestsmell ) ) {
smoves.clear();
smoves.push_back( dest );
bestsmell = smell;
} else if( ( !fleeing && smell == bestsmell ) || ( fleeing && smell == bestsmell ) ) {
smoves.push_back( dest );
}
}
}
return random_entry( smoves, next );
}
开发者ID:MushroomWobbit,项目名称:Cataclysm-DDA,代码行数:40,代码来源:monmove.cpp
示例14: get
/** Create or adjust "pos" parameter for a component
* Assumed that name either equals "x", "y" or "z" otherwise this
* method will not add or modify "pos" parameter
* @param comp :: Component
* @param name :: name of the parameter
* @param value :: value
* @param pDescription :: a pointer (may be NULL) to a string, containing
* parameter's
* description. If provided, the contents of the string is copied to the
* parameters
* memory
*/
void ParameterMap::addPositionCoordinate(
const IComponent *comp, const std::string &name, const double value,
const std::string *const pDescription) {
Parameter_sptr param = get(comp, pos());
V3D position;
if (param) {
// so "pos" already defined
position = param->value<V3D>();
} else {
// so "pos" is not defined - therefore get position from component
position = comp->getPos();
}
// adjust position
if (name.compare(posx()) == 0)
position.setX(value);
else if (name.compare(posy()) == 0)
position.setY(value);
else if (name.compare(posz()) == 0)
position.setZ(value);
else {
g_log.warning() << "addPositionCoordinate() called with unrecognized "
"coordinate symbol: " << name;
// set description if one is provided
if (pDescription) {
param->setDescription(*pDescription);
}
return;
}
// clear the position cache
clearPositionSensitiveCaches();
// finally add or update "pos" parameter
addV3D(comp, pos(), position, pDescription);
}
开发者ID:spaceyatom,项目名称:mantid,代码行数:48,代码来源:ParameterMap.cpp
示例15: pos
int monster::turns_to_reach( int x, int y )
{
// This function is a(n old) temporary hack that should soon be removed
auto path = g->m.route( pos(), tripoint( x, y, posz() ), get_pathfinding_settings() );
if( path.empty() ) {
return 999;
}
double turns = 0.;
for( size_t i = 0; i < path.size(); i++ ) {
const tripoint &next = path[i];
if( g->m.impassable( next ) ) {
// No bashing through, it looks stupid when you go back and find
// the doors intact.
return 999;
} else if( i == 0 ) {
turns += double( calc_movecost( pos(), next ) ) / get_speed();
} else {
turns += double( calc_movecost( path[i - 1], next ) ) / get_speed();
}
}
return int( turns + .9 ); // Halve (to get turns) and round up
}
开发者ID:AlecWhite,项目名称:Cataclysm-DDA,代码行数:24,代码来源:monmove.cpp
示例16: sees
bool Creature::sees( const tripoint &t, int &bresen1, int &bresen2 ) const
{
// TODO: FoV update
bresen2 = 0;
if( posz() != t.z ) {
return false;
}
const int range_cur = sight_range( g->m.ambient_light_at(t) );
const int range_day = sight_range( DAYLIGHT_LEVEL );
const int range_min = std::min( range_cur, range_day );
const int wanted_range = rl_dist( pos3(), t );
if( wanted_range <= range_min ||
( wanted_range <= range_day &&
g->m.ambient_light_at( t ) > g->natural_light_level() ) ) {
if( g->m.ambient_light_at( t ) > g->natural_light_level() ) {
return g->m.sees( pos3(), t, wanted_range, bresen1, bresen2 );
} else {
return g->m.sees( pos3(), t, range_min, bresen1, bresen2 );
}
} else {
return false;
}
}
开发者ID:grimoire,项目名称:Cataclysm-DDA,代码行数:24,代码来源:creature.cpp
示例17: draw
/*
* Drawing-related functions
*/
void Creature::draw(WINDOW *w, int player_x, int player_y, bool inverted) const
{
draw( w, tripoint( player_x, player_y, posz() ), inverted );
}
开发者ID:codemime,项目名称:Cataclysm-DDA,代码行数:7,代码来源:creature.cpp
示例18: pos
tripoint monster::wander_next()
{
tripoint next = pos();
bool xbest = true;
if( abs( wander_pos.y - posy() ) > abs( wander_pos.x - posx() ) ) {
// Which is more important
xbest = false;
}
int x = posx(), x2 = posx() - 1, x3 = posx() + 1;
int y = posy(), y2 = posy() - 1, y3 = posy() + 1;
int z = posz();
// Used to avoid checking same points 3 times when moving in a straight line
// *_move is true if pos*() != wander_pos.*
bool x_move = true;
bool y_move = true;
bool z_move = true;
if( wander_pos.x < posx() ) {
x--;
x2++;
} else if( wander_pos.x > posx() ) {
x++;
x2++;
x3 -= 2;
} else {
x_move = false;
}
if( wander_pos.y < posy() ) {
y--;
y2++;
} else if( wander_pos.y > posy() ) {
y++;
y2++;
y3 -= 2;
} else {
y_move = false;
}
if( wander_pos.z < posz() ) {
z--;
} else if( wander_pos.z > posz() ) {
z++;
} else {
z_move = false;
}
if( !x_move && !y_move && !z_move ) {
return next;
}
// Any creature can "fly" downwards
const bool flies = z < posz() || has_flag( MF_FLIES );
const bool climbs = has_flag( MF_CLIMBS );
const bool canbash = has_flag( MF_BASHES ) || has_flag( MF_BORES );
const int bash_est = bash_estimate();
// Check if we can move into position, attack player on position or bash position
// If yes, set next to this position and return true, otherwise return false
const auto try_pos = [&]( const int x, const int y, const int z ) {
tripoint dest( x, y, z );
if( ( canbash && g->m.bash_rating( bash_est, dest ) > 0 ) ||
( ( flies || g->m.has_floor_or_support( dest ) ) &&
can_move_to( dest ) ) ) {
next = dest;
return true;
}
return false;
};
bool found = false;
const bool can_climb = z_move && (flies || climbs || g->m.has_flag( TFLAG_RAMP, pos() ));
if( z_move && g->m.valid_move( pos(), tripoint( posx(), posy(), z ), false, can_climb ) ) {
found = true;
if( ( x_move || y_move ) && try_pos( x, y, z ) ) {
} else if( y_move && try_pos( x, y2, z ) ) {
} else if( x_move && try_pos( x2, y, z ) ) {
} else if( y_move && try_pos( x, y3, z ) ) {
} else if( x_move && try_pos( x3, y, z ) ) {
} else if( try_pos( posx(), posy(), z ) ) {
} else {
found = false;
}
}
if( found ) {
return next;
}
if( xbest ) {
if( ( x_move || y_move ) && try_pos( x, y, posz() ) ) {
// Do nothing in each of those ifs, the if-else is just for convenience
} else if( y_move && try_pos( x, y2, posz() ) ) {
} else if( x_move && try_pos( x2, y, posz() ) ) {
} else if( y_move && try_pos( x, y3, posz() ) ) {
} else if( x_move && try_pos( x3, y, posz() ) ) {
}
} else {
if( ( x_move || y_move ) && try_pos( x, y, posz() ) ) {
} else if( x_move && try_pos( x2, y, posz() ) ) {
//.........这里部分代码省略.........
开发者ID:CliffsDover,项目名称:Cataclysm-DDA,代码行数:101,代码来源:monmove.cpp
示例19: digging
//.........这里部分代码省略.........
(float)(climbs ? calc_climb_cost( pos(), p ) : calc_movecost( pos(), p ));
if( cost > 0 ) {
moves -= cost;
} else {
return false;
}
}
//Check for moving into/out of water
bool was_water = g->m.is_divable( pos3() );
bool will_be_water = on_ground && can_submerge() && g->m.is_divable( p );
if( was_water && !will_be_water && g->u.sees( p ) ) {
//Use more dramatic messages for swimming monsters
add_msg( m_warning, _( "A %1$s %2$s from the %3$s!" ), name().c_str(),
has_flag( MF_SWIMS ) || has_flag( MF_AQUATIC ) ? _( "leaps" ) : _( "emerges" ),
g->m.tername( pos() ).c_str() );
} else if( !was_water && will_be_water && g->u.sees( p ) ) {
add_msg( m_warning, _( "A %1$s %2$s into the %3$s!" ), name().c_str(),
has_flag( MF_SWIMS ) || has_flag( MF_AQUATIC ) ? _( "dives" ) : _( "sinks" ),
g->m.tername( p ).c_str() );
}
setpos( p );
footsteps( p );
underwater = will_be_water;
if( is_hallucination() ) {
//Hallucinations don't do any of the stuff after this point
return true;
}
// TODO: Make tanks stop taking damage from rubble, because it's just silly
if( type->size != MS_TINY && on_ground ) {
if( g->m.has_flag( "SHARP", pos() ) && !one_in( 4 ) ) {
apply_damage( nullptr, bp_torso, rng( 1, 10 ) );
}
if( g->m.has_flag( "ROUGH", pos() ) && one_in( 6 ) ) {
apply_damage( nullptr, bp_torso, rng( 1, 2 ) );
}
}
if( g->m.has_flag( "UNSTABLE", p ) && on_ground ) {
add_effect( "bouldering", 1, num_bp, true );
} else if( has_effect( "bouldering" ) ) {
remove_effect( "bouldering" );
}
g->m.creature_on_trap( *this );
if( !will_be_water && ( has_flag( MF_DIGS ) || has_flag( MF_CAN_DIG ) ) ) {
underwater = g->m.has_flag( "DIGGABLE", pos() );
}
// Diggers turn the dirt into dirtmound
if( digging() ) {
int factor = 0;
switch( type->size ) {
case MS_TINY:
factor = 100;
break;
case MS_SMALL:
factor = 30;
break;
case MS_MEDIUM:
factor = 6;
break;
case MS_LARGE:
factor = 3;
break;
case MS_HUGE:
factor = 1;
break;
}
if( has_flag( MF_VERMIN ) ) {
factor *= 100;
}
if( one_in( factor ) ) {
g->m.ter_set( pos(), t_dirtmound );
}
}
// Acid trail monsters leave... a trail of acid
if( has_flag( MF_ACIDTRAIL ) ) {
g->m.add_field( pos(), fd_acid, 3, 0 );
}
if( has_flag( MF_SLUDGETRAIL ) ) {
for( const tripoint &sludge_p : g->m.points_in_radius( pos(), 1 ) ) {
const int fstr = 3 - ( abs( sludge_p.x - posx() ) + abs( sludge_p.y - posy() ) );
if( fstr >= 2 ) {
g->m.add_field( sludge_p, fd_sludge, fstr, 0 );
}
}
}
if( has_flag( MF_LEAKSGAS ) ) {
if( one_in( 6 ) ) {
tripoint dest( posx() + rng( -1, 1 ), posy() + rng( -1, 1 ), posz() );
g->m.add_field( dest, fd_toxic_gas, 3, 0 );
}
}
return true;
}
开发者ID:CliffsDover,项目名称:Cataclysm-DDA,代码行数:101,代码来源:monmove.cpp
示例20: get_fatigue
void player::activate_mutation( const trait_id &mut )
{
const mutation_branch &mdata = mut.obj();
auto &tdata = my_mutations[mut];
int cost = mdata.cost;
// You can take yourself halfway to Near Death levels of hunger/thirst.
// Fatigue can go to Exhausted.
if ((mdata.hunger && get_hunger() >= 700) || (mdata.thirst && get_thirst() >= 260) ||
(mdata.fatigue && get_fatigue() >= EXHAUSTED)) {
// Insufficient Foo to *maintain* operation is handled in player::suffer
add_msg_if_player(m_warning, _("You feel like using your %s would kill you!"), mdata.name.c_str());
return;
}
if (tdata.powered && tdata.charge > 0) {
// Already-on units just lose a bit of charge
tdata.charge--;
} else {
// Not-on units, or those with zero charge, have to pay the power cost
if (mdata.cooldown > 0) {
tdata.charge = mdata.cooldown - 1;
}
if (mdata.hunger){
mod_hunger(cost);
}
if (mdata.thirst){
mod_thirst(cost);
}
if (mdata.fatigue){
mod_fatigue(cost);
}
tdata.powered = true;
// Handle stat changes from activation
apply_mods(mut, true);
recalc_sight_limits();
}
if( mut == trait_WEB_WEAVER ) {
g->m.add_field(pos(), fd_web, 1, 0);
add_msg_if_player(_("You start spinning web with your spinnerets!"));
} else if (mut == "BURROW"){
if( is_underwater() ) {
add_msg_if_player(m_info, _("You can't do that while underwater."));
tdata.powered = false;
return;
}
tripoint dirp;
if (!choose_adjacent(_("Burrow where?"), dirp)) {
tdata.powered = false;
return;
}
if( dirp == pos() ) {
add_msg_if_player(_("You've got places to go and critters to beat."));
add_msg_if_player(_("Let the lesser folks eat their hearts out."));
tdata.powered = false;
return;
}
int turns;
if (g->m.is_bashable(dirp) && g->m.has_flag("SUPPORTS_ROOF", dirp) &&
g->m.ter(dirp) != t_tree) {
// Takes 30 minutes
// Being better-adapted to the task means that skillful Survivors can do it almost twice as fast.
turns = MINUTES( 30 );
} else if (g->m.move_cost(dirp) == 2 && g->get_levz() == 0 &&
g->m.ter(dirp) != t_dirt && g->m.ter(dirp) != t_grass) {
turns = MINUTES( 10 );
} else {
add_msg_if_player(m_info, _("You can't burrow there."));
tdata.powered = false;
return;
}
assign_activity( activity_id( "ACT_BURROW" ), turns * 100, -1, 0 );
activity.placement = dirp;
add_msg_if_player(_("You tear into the %s with your teeth and claws."),
g->m.tername(dirp).c_str());
tdata.powered = false;
return; // handled when the activity finishes
} else if( mut == trait_SLIMESPAWNER ) {
std::vector<tripoint> valid;
for (int x = posx() - 1; x <= posx() + 1; x++) {
for (int y = posy() - 1; y <= posy() + 1; y++) {
tripoint dest(x, y, posz());
if (g->is_empty(dest)) {
valid.push_back( dest );
}
}
}
// Oops, no room to divide!
if (valid.size() == 0) {
add_msg_if_player(m_bad, _("You focus, but are too hemmed in to birth a new slimespring!"));
tdata.powered = false;
return;
}
add_msg_if_player(m_good, _("You focus, and with a pleasant splitting feeling, birth a new slimespring!"));
int numslime = 1;
for (int i = 0; i < numslime && !valid.empty(); i++) {
const tripoint target = random_entry_removed( valid );
if( monster * const slime = g->summon_mon( mtype_id( "mon_player_blob" ), target ) ) {
slime->friendly = -1;
//.........这里部分代码省略.........
开发者ID:RyanMcManaman,项目名称:Cataclysm-DDA,代码行数:101,代码来源:mutation.cpp
注:本文中的posz函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论