bool Creature_tracker::add( monster &critter ) { if( critter.type->id.is_null() ) { // Don't wanna spawn null monsters o.O return false; } if( critter.type->has_flag( MF_VERMIN ) ) { // Don't spawn vermin, they aren't implemented yet return false; } const int critter_id = mon_at( critter.pos() ); if( critter_id != -1 ) { // We can spawn stuff on hallucinations, but we need to kill them first if( monsters_list[critter_id]->is_hallucination() ) { monsters_list[critter_id]->die( nullptr ); // But don't remove - that would change the monster order and could segfault } else if( critter.is_hallucination() ) { return false; } else { debugmsg( "add_zombie: there's already a monster at %d,%d,%d", critter.posx(), critter.posy(), critter.posz() ); return false; } } if( MonsterGroupManager::monster_is_blacklisted( critter.type->id ) ) { return false; } monsters_by_location[critter.pos()] = monsters_list.size(); monsters_list.push_back( new monster( critter ) ); return true; }
bool Creature_tracker::add( monster &critter ) { if( critter.type->id.is_null() ) { // Don't want to spawn null monsters o.O return false; } if( critter.type->has_flag( MF_VERMIN ) ) { // Don't spawn vermin, they aren't implemented yet return false; } if( const std::shared_ptr<monster> existing_mon_ptr = find( critter.pos() ) ) { // We can spawn stuff on hallucinations, but we need to kill them first if( existing_mon_ptr->is_hallucination() ) { existing_mon_ptr->die( nullptr ); // But don't remove - that would change the monster order and could segfault } else if( critter.is_hallucination() ) { return false; } else { debugmsg( "add_zombie: there's already a monster at %d,%d,%d", critter.posx(), critter.posy(), critter.posz() ); return false; } } if( MonsterGroupManager::monster_is_blacklisted( critter.type->id ) ) { return false; } monsters_list.emplace_back( std::make_shared<monster>( critter ) ); monsters_by_location[critter.pos()] = monsters_list.back(); return true; }