Changeset 10888 for code/branches/campaignHS15/src/orxonox/controllers
- Timestamp:
- Nov 29, 2015, 6:36:21 PM (9 years ago)
- Location:
- code/branches/campaignHS15/src/orxonox/controllers
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/campaignHS15/src/orxonox/controllers/ActionpointController.cc
r10886 r10888 32 32 #include <algorithm> 33 33 #include "worldentities/Actionpoint.h" 34 35 36 34 namespace orxonox 37 35 { … … 45 43 this->bLoop_ = false; 46 44 this->bEndLoop_ = false; 47 this->parsedActionpoints_.clear(); 45 loopActionpoints_.clear(); 46 parsedActionpoints_.clear(); 47 actionpoints_.clear(); 48 healthSpawners_.clear(); 49 damageSpawners_.clear(); 50 speedSpawners_.clear(); 48 51 this->bTakenOver_ = false; 49 52 this->action_ = Action::NONE; … … 64 67 parsedActionpoints_.clear(); 65 68 actionpoints_.clear(); 69 healthSpawners_.clear(); 70 damageSpawners_.clear(); 71 speedSpawners_.clear(); 66 72 } 67 73 void ActionpointController::tick(float dt) … … 97 103 } 98 104 if (this->bFirstTick_) 99 { 105 { 106 setSpawners(); 107 // orxout(internal_error) << "health spawners size = " << this->healthSpawners_.size() << 108 // ", damage spawners size = " << this->damageSpawners_.size() << 109 // ", speed spawners size = " << this->speedSpawners_.size() << endl; 100 110 this->bFirstTick_ = false; 101 111 } … … 109 119 if (!this->getControllableEntity() || !orxonox_cast<Pawn*> (this->getControllableEntity())) 110 120 return; 121 111 122 this->deltaHp = orxonox_cast<Pawn*> (this->getControllableEntity())->getHealth() - this->previousHp; 112 123 this->previousHp = orxonox_cast<Pawn*> (this->getControllableEntity())->getHealth(); … … 116 127 if (this->action_ == Action::NONE || this->bTakenOver_) 117 128 { 129 // Point point = closestPickup(PickupType::HEALTH); 130 // if (point.action != Action::NONE) 131 // { 132 // orxout(internal_error) << "found health" << endl; 133 // this->parsedActionpoints_.push_back(point); 134 // } 118 135 if (this->parsedActionpoints_.empty() && this->loopActionpoints_.empty()) 119 136 { … … 142 159 { 143 160 this->action(); 144 } 161 } 162 else 163 { 164 } 145 165 } 146 166 } … … 214 234 if (this->hasTarget()) 215 235 { 216 //----choose where to go----217 236 this->maneuver(); 218 //----fire if you can---- 219 this->bShooting_ = this->canFire(); 237 this->bShooting_ = this->canFire(); 238 // Vector3 healthPosition = bestHealthPickup((this->target_->getWorldPosition() - this->getControllableEntity()->getWorldPosition()).length()); 239 // if ((this->getControllableEntity()->getWorldPosition() - healthPosition).length() < this->tolerance_) 240 // { 241 // //----choose where to go---- 242 // this->maneuver(); 243 // } 244 // else 245 // { 246 // this->dodgeTowards(healthPosition); 247 // } 248 // //----fire if you can---- 249 // this->bShooting_ = this->canFire(); 220 250 } 221 251 this->actionCounter_ += this->actionCounter_ < 100000 ? 1 : -this->actionCounter_ ; 252 222 253 } 223 254 void ActionpointController::setProtect (ControllableEntity* protect) … … 236 267 bool inLoop = false; 237 268 Point p; 238 if ( static_cast<Actionpoint*> (actionpoint))239 { 240 Actionpoint* ap = static_cast<Actionpoint*> (actionpoint);269 if (actionpoint->getIdentifier()->getName() == "Actionpoint") 270 { 271 Actionpoint* ap = orxonox_cast<Actionpoint*> (actionpoint); 241 272 actionName = ap->getActionXML(); 242 273 targetName = ap->getName(); … … 277 308 else 278 309 { 310 inLoop = true; 279 311 p.action = Action::FLY; p.name = ""; p.position = actionpoint->getWorldPosition(); p.inLoop = inLoop; 280 312 } … … 290 322 } 291 323 292 324 Action::Value ActionpointController::getAction () 293 325 { 294 326 return this->action_; … … 593 625 <= this->attackRange_ ) 594 626 { 595 Point p = { Action::FIGHT, CommonController::getName(newTarget), Vector3::ZERO, false }; 596 this->parsedActionpoints_.push_back(p); 627 if (this->bLoop_) 628 { 629 Point p = { Action::FIGHT, CommonController::getName(newTarget), Vector3::ZERO, true }; 630 this->loopActionpoints_.push_back(p); 631 } 632 else 633 { 634 Point p = { Action::FIGHT, CommonController::getName(newTarget), Vector3::ZERO, false }; 635 this->parsedActionpoints_.push_back(p); 636 } 597 637 this->executeActionpoint(); 598 638 } … … 600 640 } 601 641 } 642 Vector3 ActionpointController::bestHealthPickup(float searchRadius) 643 { 644 645 //1000000/distance^2 * 1/index+1 646 float maxUse = 0; 647 float tempUse = -1; 648 int index = 0; 649 float distance = 0; 650 Vector3 bestPosition = this->getControllableEntity()->getWorldPosition(); 651 652 for (std::multimap<int, std::pair<PickupSpawner*, bool> >::iterator it=healthSpawners_.begin(); it!=healthSpawners_.end(); ++it) 653 { 654 distance = (this->getControllableEntity()->getWorldPosition() - (*it).second.first->getWorldPosition()).length(); 655 if (distance < this->tolerance_ || !(*it).second.second) 656 { 657 (*it).second.second = false; 658 continue; 659 } 660 if (distance > searchRadius) 661 continue; 662 index = (*it).first; 663 tempUse = 1000000*1/(1+distance*distance) * 1/((index/2.0f)+1); 664 if (tempUse > maxUse) 665 { 666 bestPosition = (*it).second.first->getWorldPosition(); 667 maxUse = tempUse; 668 } 669 } 670 //std::multimap<int, std::pair<PickupSpawner*, bool> >::iterator it = this->healthSpawners_.find(index); 671 //P.S. check if it == ... .end() 672 //orxout (internal_error) << "best position = " << bestPosition << endl; 673 return bestPosition; 674 } 675 void ActionpointController::setSpawners() 676 { 677 std::vector<std::string> damagePickups; 678 std::vector<std::string> healthPickups; 679 std::vector<std::string> speedPickups; 680 int index = 0; 681 682 683 damagePickups.push_back("largedamageboostpickup"); 684 damagePickups.push_back("dronepickup"); 685 damagePickups.push_back("mediumdamageboostpickup"); 686 damagePickups.push_back("smalldamageboostpickup"); 687 688 healthPickups.push_back("triplehealthspeedinvisibilitypickup"); 689 healthPickups.push_back("crazyhealthpickup"); 690 healthPickups.push_back("hugehealthpickup"); 691 healthPickups.push_back("hugeshieldpickup"); 692 healthPickups.push_back("hugeinvisiblepickup"); 693 healthPickups.push_back("hugeshrinkpickup"); 694 healthPickups.push_back("mediumhealthpickup"); 695 healthPickups.push_back("mediumshieldpickup"); 696 healthPickups.push_back("mediuminvisiblepickup"); 697 healthPickups.push_back("mediumshrinkpickup"); 698 healthPickups.push_back("smallhealthpickup"); 699 healthPickups.push_back("smallshieldpickup"); 700 healthPickups.push_back("smallinvisiblepickup"); 701 healthPickups.push_back("smallshrinkpickup"); 702 703 speedPickups.push_back("triplehealthspeedinvisibilitypickup"); 704 speedPickups.push_back("hugespeedpickup"); 705 speedPickups.push_back("smalljumppickup"); 706 speedPickups.push_back("mediumspeedpickup"); 707 speedPickups.push_back("smallspeedpickup"); 708 709 710 711 for (ObjectList<WorldEntity>::iterator it = ObjectList<WorldEntity>::begin(); it; ++it) 712 { 713 if ((*it)->getIdentifier()->getName() != "PickupSpawner") 714 continue; 715 PickupSpawner* spawner = static_cast<PickupSpawner*>(*it); 716 std::string name = spawner->getPickupTemplateName(); 717 //float distance = ((*it)->getWorldPosition() - this->getControllableEntity()->getWorldPosition()).length(); 718 // if (distance < 50.0f) 719 // continue; 720 for (unsigned int i = 0; i < healthPickups.size(); ++i) 721 { 722 if (name == healthPickups.at(i)) 723 { 724 index = i; 725 this->healthSpawners_.insert(std::make_pair(index, std::make_pair(spawner, true))); 726 break; 727 } 728 } 729 for (unsigned int i = 0; i < damagePickups.size(); ++i) 730 { 731 if (name == damagePickups.at(i)) 732 { 733 //tempUse = 1000000*1/(1+distance*distance) * 1/((i/2.0f)+1); 734 index = i; 735 this->damageSpawners_.insert(std::make_pair(index, std::make_pair(spawner, true))); 736 break; 737 } 738 } 739 for (unsigned int i = 0; i < speedPickups.size(); ++i) 740 { 741 if (name == speedPickups.at(i)) 742 { 743 //tempUse = 1000000*1/(1+distance*distance) * 1/((i/2.0f)+1); 744 index = i; 745 this->speedSpawners_.insert(std::make_pair(index, std::make_pair(spawner, true))); 746 break; 747 } 748 } 749 // if (tempUse > maxUse) 750 // { 751 // Point p = { Action::FLY, "", (*it)->getWorldPosition(), false }; 752 // maxUse = tempUse; 753 // maxPoint = p; 754 // } 755 // else 756 // { 757 // tempUse = -1; 758 // continue; 759 // } 760 // orxout(internal_error) << "resp time = " << static_cast<PickupSpawner*>(*it)->getRespawnTime() << endl; 761 } 762 } 602 763 } -
code/branches/campaignHS15/src/orxonox/controllers/ActionpointController.h
r10885 r10888 33 33 #include "tools/Timer.h" 34 34 #include "tools/interfaces/Tickable.h" 35 #include "../modules/pickup/PickupSpawner.h" 36 #include <map> 35 37 36 38 namespace orxonox … … 51 53 bool inLoop; 52 54 } ; 55 namespace PickupType 56 { 57 enum Value 58 { 59 NONE, DAMAGE, HEALTH, SPEED, PORTAL 60 }; 61 } 53 62 54 63 class _OrxonoxExport ActionpointController : public FightingController, public Tickable … … 118 127 bool bFirstTick_; 119 128 129 void setSpawners(); 130 Vector3 bestHealthPickup (float searchRadius); 131 // Point closestPickup(PickupType::Value pickupType); 132 std::multimap <int, std::pair<PickupSpawner*, bool> > healthSpawners_; 133 std::multimap <int, std::pair<PickupSpawner*, bool> > damageSpawners_; 134 std::multimap <int, std::pair<PickupSpawner*, bool> > speedSpawners_; 135 120 136 private: 121 137 -
code/branches/campaignHS15/src/orxonox/controllers/FightingController.cc
r10886 r10888 172 172 } 173 173 } 174 174 void FightingController::dodgeTowards (Vector3& position) 175 { 176 Vector3 thisPosition = this->getControllableEntity()->getPosition(); 177 Vector3 diff = (position - thisPosition); 178 float diffLength = diff.length(); 179 Vector3 diffUnit = diff/diffLength; 180 float factor = 300.0f; 181 if (diffLength < 300) 182 { 183 this->setTargetPosition(position); 184 return; 185 } 186 else if (diffLength < 600) 187 factor = 400.0f; 188 else if (diffLength < 1000) 189 factor = 700.0f; 190 else 191 factor = 1000.0f; 192 float x = CommonController::randomInRange (400, 800) * (CommonController::randomInRange(0,1) <= 0.5 ? 1 : -1); 193 float y = CommonController::randomInRange (400, 800) * (CommonController::randomInRange(0,1) <= 0.5 ? 1 : -1); 194 float z = diffUnit.z == 0 ? 0 : (1/diffUnit.z) * (-x * diffUnit.x - y * diffUnit.y); 195 this->setTargetPosition(thisPosition + Vector3(x,y,z) + diffUnit * factor); 196 // orxout(internal_error) << "Dodging towards " << Vector3(x,y,z) << endl; 197 this->boostControl(); 198 } 175 199 void FightingController::dodge(const Vector3& thisPosition, Vector3& diffUnit) 176 200 { … … 179 203 float x = CommonController::randomInRange (100, 800) * (CommonController::randomInRange(0,1) <= 0.5 ? 1 : -1); 180 204 float y = CommonController::randomInRange (100, 800) * (CommonController::randomInRange(0,1) <= 0.5 ? 1 : -1); 181 float z = (1/diffUnit.z) * (-x * diffUnit.x - y * diffUnit.y);205 float z = diffUnit.z == 0 ? 0 : (1/diffUnit.z) * (-x * diffUnit.x - y * diffUnit.y); 182 206 this->setTargetPosition(thisPosition + Vector3(x,y,z) + (this->deltaHp < 0 ? -diffUnit * 450.0f : diffUnit * 100.0f)); 183 207 this->boostControl(); -
code/branches/campaignHS15/src/orxonox/controllers/FightingController.h
r10886 r10888 62 62 void maneuver(); 63 63 void dodge(const Vector3& thisPosition, Vector3& diffUnit); 64 void dodgeTowards (Vector3& position); 64 65 bool canFire(); 65 66 void doFire(); -
code/branches/campaignHS15/src/orxonox/controllers/FlyingController.cc
r10886 r10888 42 42 this->rotationProgress_ = 0; 43 43 this->spread_ = 200; 44 this->tolerance_ = 100;44 this->tolerance_ = 80; 45 45 } 46 46 FlyingController::~FlyingController() -
code/branches/campaignHS15/src/orxonox/controllers/SectionController.cc
r10886 r10888 126 126 { 127 127 this->maneuver(); 128 this->bShooting_ = this->canFire(); 128 this->bShooting_ = this->canFire(); 129 // Vector3 healthPosition = bestHealthPickup((this->target_->getWorldPosition() - this->getControllableEntity()->getWorldPosition()).length()); 130 // if ((this->getControllableEntity()->getWorldPosition() - healthPosition).length() < this->tolerance_) 131 // { 132 // //----choose where to go---- 133 // this->maneuver(); 134 // } 135 // else 136 // { 137 // this->dodgeTowards(healthPosition); 138 // } 139 // //----fire if you can---- 140 // this->bShooting_ = this->canFire(); 129 141 } 130 142 } -
code/branches/campaignHS15/src/orxonox/controllers/WingmanController.cc
r10886 r10888 112 112 if (this->hasTarget()) 113 113 { 114 //----choose where to go----115 114 this->maneuver(); 116 //----fire if you can---- 117 this->bShooting_ = this->canFire(); 115 this->bShooting_ = this->canFire(); 116 // Vector3 healthPosition = bestHealthPickup((this->target_->getWorldPosition() - this->getControllableEntity()->getWorldPosition()).length()); 117 // if ((this->getControllableEntity()->getWorldPosition() - healthPosition).length() < this->tolerance_) 118 // { 119 // //----choose where to go---- 120 // this->maneuver(); 121 // } 122 // else 123 // { 124 // this->dodgeTowards(healthPosition); 125 // } 126 // //----fire if you can---- 127 // this->bShooting_ = this->canFire(); 118 128 } 119 129 }
Note: See TracChangeset
for help on using the changeset viewer.