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; }
int monster::attack_at(int x, int y) { if (has_effect("pacified")) return 0; int mondex = g->mon_at(x, y); int npcdex = g->npc_at(x, y); if(x == g->u.posx && y == g->u.posy) { melee_attack(g->u); return 1; } if(mondex != -1) { // Currently, there are only pro-player and anti-player groups, // this makes it easy for us. monster& mon = g->zombie(mondex); // Don't attack yourself. if(&mon == this) { return 0; } // 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 0; } // 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 0; } bool is_enemy = mon.friendly != friendly; is_enemy = is_enemy || has_flag(MF_ATTACKMON); // I guess the flag means all monsters are enemies? if(is_enemy) { hit_monster(mon); return 1; } } else 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]); return 1; } // Nothing to attack. return 0; }
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; }
bool CombatGameInst::attack(GameState* gs, CombatGameInst* inst, const AttackStats& attack) { if (attack.is_ranged()) { return projectile_attack(gs, inst, attack.weapon, attack.projectile); } else { return melee_attack(gs, inst, attack.weapon); } }
void Creature::melee_attack(Creature &t, bool allow_special) { static const matec_id no_technique_id( "" ); melee_attack( t, allow_special, no_technique_id ); }