void FlameTowerPhysicsComponent::findDirectionToShoot(){ // This tile size value is a bit flakey. Map* map = tower_->getDriver()->getGameMap(); int tileSize = (map->tileWidth() + map->tileHeight()) / 2; // check if there's an npc currently being tracked if(foundTarget_) { return; } if(fireCountdown_ == 0) { ready_ = true; } else { fireCountdown_--; return; } projectilePath_.setP1(tower_->getPos()); projectilePath_.setP2(tower_->getPos()); projectilePath_.setLength(0); // get all npcs within range enemies_ = map->getUnits(tower_->getPos().x(), tower_->getPos().y(), ceil((double) getRadius() / tileSize)); if (enemies_.isEmpty()) { foundTarget_ = false; return; } QSet<Unit*>::iterator iter; for (iter = enemies_.begin(); iter != enemies_.end(); ++iter) { // this would be the place to add a priority algorithm if we need one // make sure that the unit is not a player if((((*iter)->getID()&0xFF000000)>>24) == NPC::clsIdx()) { if(!isValidTarget(*iter)) { continue; } projectilePath_.setP2((*iter)->getPos()); // check that they're actually in range if (projectilePath_.length() < getRadius() - 24) { target_ = *iter; projectilePath_.setLength(getRadius() - 24); foundTarget_ = true; return; } } } }
bool VirtualSlot::_addTarget(Slot *target) { assert(target); if(target) { if(!isValidTarget(target)) { return false; } // if(_target.size()>0) // return false; // _displayName=target->getDisplayName(); // _type=StringTool::toLowerCase(target->getType()); // _partner->setDisplayNameAndType(target->getName(),target->getType()); // _target.insert(target); onAddTarget(target); } else { return false; } return true; }